lazarus/lcl/interfaces/carbon/carbonstrings.pp
tombo c44f23e18d Carbon intf:
- patch #0008537 by Philip J. Hess - Adds basic TOpenDialog, TSaveDialog and TSelectDirectoryDialog
- debug and tracing info, OSError for checking Carbon calls as Philip J. Hess proposed
- started TMainMenu, TPopupMenu, Hints
- TabOrder, TabStop, focusing
- TGraphicControl and TCustomControl descendants improved 

git-svn-id: trunk@10828 -
2007-03-29 13:50:41 +00:00

510 lines
16 KiB
ObjectPascal

{ $Id$
-----------------------------------
carbonstrings.pp - Carbon strings
-----------------------------------
*****************************************************************************
* *
* This file is part of the Lazarus Component Library (LCL) *
* *
* See the file COPYING.modifiedLGPL, included in this distribution, *
* for details about the copyright. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
* *
*****************************************************************************
}
unit CarbonStrings;
{$mode objfpc}{$H+}
interface
uses
// carbon bindings
FPCMacOSAll,
// rtl+ftl
Types, Classes, SysUtils, Math,
// LCL
LCLProc, LCLType, Graphics, Controls, StdCtrls,
// LCL Carbon
CarbonDef, CarbonProc, CarbonPrivate;
type
{ TCarbonComboBoxStrings }
TCarbonComboBoxStrings = class(TStringList)
private
FOwner: TCarbonComboBox; // Carbon combo box control owning strings
protected
procedure Put(Index: Integer; const S: string); override;
procedure InsertItem(Index: Integer; const S: string); override;
procedure InsertItem(Index: Integer; const S: string; O: TObject); override;
public
constructor Create(AOwner: TCarbonComboBox);
procedure Clear; override;
procedure Delete(Index: Integer); override;
procedure Sort; override;
public
property Owner: TCarbonComboBox read FOwner;
end;
{ TCarbonListBoxStrings }
TCarbonListBoxStrings = class(TStringList)
private
FOwner: TCarbonListBox; // Carbon list box control owning strings
protected
procedure Put(Index: Integer; const S: string); override;
procedure InsertItem(Index: Integer; const S: string); override;
procedure InsertItem(Index: Integer; const S: string; O: TObject); override;
public
constructor Create(AOwner: TCarbonListBox);
procedure Clear; override;
procedure Delete(Index: Integer); override;
public
property Owner: TCarbonListBox read FOwner;
end;
{ TCarbonMemoStrings }
TCarbonMemoStrings = class(TStrings)
private
FStringList: TStringList; // internal string list
FOwner: TCarbonMemo; // Carbon memo control owning strings
FExternalChanged: Boolean;// Carbon strings object has changed
procedure InternalUpdate;
procedure ExternalUpdate;
protected
function GetTextStr: string; override;
function GetCount: Integer; override;
function Get(Index: Integer): string; override;
public
constructor Create(AOwner: TCarbonMemo);
destructor Destroy; override;
procedure Assign(Source: TPersistent); override;
procedure Clear; override;
procedure Delete(Index: Integer); override;
procedure Insert(Index: Integer; const S: string); override;
procedure SetText(TheText: PChar); override;
procedure ExternalChanged; dynamic;
public
property Owner: TCarbonMemo read FOwner;
end;
implementation
{ TCarbonComboBoxStrings }
{------------------------------------------------------------------------------
Method: TCarbonComboBoxStrings.Put
Params: Index - Index of string to change
S - New text
Returns: Nothing
Changes the text on line with the specified index
------------------------------------------------------------------------------}
procedure TCarbonComboBoxStrings.Put(Index: Integer; const S: string);
var
CFString: CFStringRef;
begin
inherited Put(Index, S);
CreateCFString(S, CFString);
try
if HIComboBoxRemoveItemAtIndex(HIViewRef(FOwner.Widget), Index) = noErr then
HIComboBoxInsertTextItemAtIndex(HIViewRef(FOwner.Widget), Index, CFString);
finally
FreeCFString(CFString);
end;
end;
{------------------------------------------------------------------------------
Method: TCarbonComboBoxStrings.Insert
Params: Index - Line index
S - Text to insert
Returns: Nothing
Inserts the text on line with the specified index
------------------------------------------------------------------------------}
procedure TCarbonComboBoxStrings.InsertItem(Index: Integer; const S: string);
var
CFString: CFStringRef;
begin
inherited InsertItem(Index, S);
CreateCFString(S, CFString);
try
HIComboBoxInsertTextItemAtIndex(HIViewRef(FOwner.Widget), Index, CFString);
finally
FreeCFString(CFString);
end;
end;
{------------------------------------------------------------------------------
Method: TCarbonComboBoxStrings.Insert
Params: Index - Line index
S - Text to insert
O - Object to insert
Returns: Nothing
Inserts the text on line with the specified index
------------------------------------------------------------------------------}
procedure TCarbonComboBoxStrings.InsertItem(Index: Integer; const S: string;
O: TObject);
var
CFString: CFStringRef;
begin
inherited InsertItem(Index, S, O);
CreateCFString(S, CFString);
try
HIComboBoxInsertTextItemAtIndex(HIViewRef(FOwner.Widget), Index, CFString);
finally
FreeCFString(CFString);
end;
end;
{------------------------------------------------------------------------------
Method: TCarbonComboBoxStrings.Create
Params: AOwner - Carbon combo box owner of strings
Returns: Nothing
Creates new strings for Carbon combo box items
------------------------------------------------------------------------------}
constructor TCarbonComboBoxStrings.Create(AOwner: TCarbonComboBox);
begin
inherited Create;
FOwner := AOwner;
end;
{------------------------------------------------------------------------------
Method: TCarbonComboBoxStrings.Clear
Returns: Nothing
Clears strings
------------------------------------------------------------------------------}
procedure TCarbonComboBoxStrings.Clear;
var
I: Integer;
C: Integer;
begin
C := Count;
inherited Clear;
for I := C - 1 downto 0 do
if HIComboBoxRemoveItemAtIndex(HIViewRef(FOwner.Widget), I) <> noErr then Break;
end;
{------------------------------------------------------------------------------
Method: TCarbonComboBoxStrings.Delete
Params: Index - Line index
Returns: Nothing
Deletes line with the specified index from strings
------------------------------------------------------------------------------}
procedure TCarbonComboBoxStrings.Delete(Index: Integer);
begin
inherited Delete(Index);
HIComboBoxRemoveItemAtIndex(HIViewRef(FOwner.Widget), Index);
end;
{------------------------------------------------------------------------------
Method: TCarbonComboBoxStrings.Sort
Sorts the strings
------------------------------------------------------------------------------}
procedure TCarbonComboBoxStrings.Sort;
var
CFString: CFStringRef;
I: Integer;
begin
inherited Sort;
for I := 0 to Count - 1 do
begin
CreateCFString(Strings[I], CFString);
try
if HIComboBoxRemoveItemAtIndex(HIViewRef(FOwner.Widget), I) = noErr then
HIComboBoxInsertTextItemAtIndex(HIViewRef(FOwner.Widget), I, CFString);
finally
FreeCFString(CFString);
end;
end;
end;
{ TCarbonListBoxStrings }
{------------------------------------------------------------------------------
Method: TCarbonListBoxStrings.Put
Params: Index - Index of string to change
S - New text
Returns: Nothing
Changes the text on line with the specified index
------------------------------------------------------------------------------}
procedure TCarbonListBoxStrings.Put(Index: Integer; const S: string);
var
Item: Cell;
begin
inherited Put(Index, S);
Item.h := 0;
Item.v := Index;
// change data to update cell
LSetCell(@Index, SizeOf(Integer), Item, FOwner.List);
end;
{------------------------------------------------------------------------------
Method: TCarbonListBoxStrings.Insert
Params: Index - Line index
S - Text to insert
Returns: Nothing
Inserts the text on line with the specified index
------------------------------------------------------------------------------}
procedure TCarbonListBoxStrings.InsertItem(Index: Integer; const S: string);
begin
inherited InsertItem(Index, S);
LAddRow(1, Index, FOwner.List);
end;
{------------------------------------------------------------------------------
Method: TCarbonListBoxStrings.Insert
Params: Index - Line index
S - Text to insert
O - Object to insert
Returns: Nothing
Inserts the text on line with the specified index
------------------------------------------------------------------------------}
procedure TCarbonListBoxStrings.InsertItem(Index: Integer; const S: string;
O: TObject);
begin
inherited InsertItem(Index, S, O);
LAddRow(1, Index, FOwner.List);
end;
{------------------------------------------------------------------------------
Method: TCarbonListBoxStrings.Create
Params: AOwner - Carbon list box owner of strings
Returns: Nothing
Creates new strings for Carbon list box items
------------------------------------------------------------------------------}
constructor TCarbonListBoxStrings.Create(AOwner: TCarbonListBox);
begin
inherited Create;
FOwner := AOwner;
SetListUserHandle(FOwner.List, Handle(Self))
end;
{------------------------------------------------------------------------------
Method: TCarbonListBoxStrings.Clear
Returns: Nothing
Clears strings
------------------------------------------------------------------------------}
procedure TCarbonListBoxStrings.Clear;
begin
inherited Clear;
LDelRow(0, 0, FOwner.List);
end;
{------------------------------------------------------------------------------
Method: TCarbonListBoxStrings.Delete
Params: Index - Line index
Returns: Nothing
Deletes line with the specified index from strings
------------------------------------------------------------------------------}
procedure TCarbonListBoxStrings.Delete(Index: Integer);
begin
inherited Delete(Index);
LDelRow(1, Index, FOwner.List);
end;
{ TCarbonMemoStrings }
{------------------------------------------------------------------------------
Method: TCarbonMemoStrings.InternalUpdate
Returns: Nothing
Updates the internal strings from Carbon interface
------------------------------------------------------------------------------}
procedure TCarbonMemoStrings.InternalUpdate;
var
S: String;
begin
S := '';
//DebugLn('TCarbonMemoStrings.InternalUpdate');
if FOwner.GetText(S) then
FStringList.Text := S;
FExternalChanged := False;
end;
{------------------------------------------------------------------------------
Method: TCarbonMemoStrings.ExternalUpdate
Returns: Nothing
Updates the strings in Carbon interface from internal
------------------------------------------------------------------------------}
procedure TCarbonMemoStrings.ExternalUpdate;
begin
//DebugLn('TCarbonMemoStrings.ExternalUpdate Text: ' + FStringList.Text);
FOwner.SetText(FStringList.Text);
end;
{------------------------------------------------------------------------------
Method: TCarbonMemoStrings.GetTextStr
Returns: Text of Carbon strings
------------------------------------------------------------------------------}
function TCarbonMemoStrings.GetTextStr: string;
begin
if FExternalChanged then InternalUpdate;
Result := FStringList.Text;
end;
{------------------------------------------------------------------------------
Method: TCarbonMemoStrings.GetCount
Returns: Number of lines
------------------------------------------------------------------------------}
function TCarbonMemoStrings.GetCount: Integer;
begin
if FExternalChanged then InternalUpdate;
Result := FStringList.Count;
end;
{------------------------------------------------------------------------------
Method: TCarbonMemoStrings.Get
Params: Index - Line index
Returns: Text on line with the specified index
------------------------------------------------------------------------------}
function TCarbonMemoStrings.Get(Index: Integer): string;
begin
if FExternalChanged then InternalUpdate;
Result := FStringList[Index];
end;
{------------------------------------------------------------------------------
Method: TCarbonMemoStrings.Create
Params: AOwner - Carbon memo owner of strings
Returns: Nothing
Creates new strings for Carbon memo strings
------------------------------------------------------------------------------}
constructor TCarbonMemoStrings.Create(AOwner: TCarbonMemo);
begin
FOwner := AOwner;
FStringList := TStringList.Create;
end;
{------------------------------------------------------------------------------
Method: TCarbonMemoStrings.Destroy
Returns: Nothing
Releases strings from Carbon memo strings
------------------------------------------------------------------------------}
destructor TCarbonMemoStrings.Destroy;
begin
FStringList.Free;
inherited Destroy;
end;
{------------------------------------------------------------------------------
Method: TCarbonMemoStrings.Assign
Params: Source - Object to assing
Returns: Nothing
Assings strings object
------------------------------------------------------------------------------}
procedure TCarbonMemoStrings.Assign(Source: TPersistent);
begin
if (Source = Self) or (Source = nil) then Exit;
if Source is TStrings then
begin
FStringList.Clear;
FStringList.Text := TStrings(Source).Text;
ExternalUpdate;
end
else
inherited Assign(Source);
end;
{------------------------------------------------------------------------------
Method: TCarbonMemoStrings.Clear
Returns: Nothing
Clears strings
------------------------------------------------------------------------------}
procedure TCarbonMemoStrings.Clear;
begin
FStringList.Clear;
ExternalUpdate;
end;
{------------------------------------------------------------------------------
Method: TCarbonMemoStrings.Delete
Params: Index - Line index
Returns: Nothing
Deletes line with the specified index from strings
------------------------------------------------------------------------------}
procedure TCarbonMemoStrings.Delete(Index: Integer);
begin
FStringList.Delete(Index);
ExternalUpdate;
end;
{------------------------------------------------------------------------------
Method: TCarbonMemoStrings.Insert
Params: Index - Line index
S - Text to insert
Returns: Nothing
Inserts the text on line with the specified index
------------------------------------------------------------------------------}
procedure TCarbonMemoStrings.Insert(Index: Integer; const S: string);
begin
FStringList.Insert(Index, S);
ExternalUpdate;
end;
{------------------------------------------------------------------------------
Method: TCarbonMemoStrings.SetText
Params: TheText - Text to set
Returns: Nothing
Sets the text of strings
------------------------------------------------------------------------------}
procedure TCarbonMemoStrings.SetText(TheText: PChar);
begin
FStringList.Text := TheText;
ExternalUpdate;
end;
{------------------------------------------------------------------------------
Method: TCarbonMemoStrings.ExternalChanged
Returns: Nothing
Notifies that strings object in Carbon interface has changed
------------------------------------------------------------------------------}
procedure TCarbonMemoStrings.ExternalChanged;
begin
FExternalChanged := True;
end;
end.