* gtk2 patch from Andrew

git-svn-id: trunk@7064 -
This commit is contained in:
marc 2005-04-07 22:04:02 +00:00
parent c0bd0aabc6
commit 776866aee2
9 changed files with 434 additions and 200 deletions

1
.gitattributes vendored
View File

@ -1620,6 +1620,7 @@ lcl/interfaces/gtk2/gtk2wsclistbox.pp svneol=native#text/pascal
lcl/interfaces/gtk2/gtk2wscomctrls.pp svneol=native#text/pascal lcl/interfaces/gtk2/gtk2wscomctrls.pp svneol=native#text/pascal
lcl/interfaces/gtk2/gtk2wscontrols.pp svneol=native#text/pascal lcl/interfaces/gtk2/gtk2wscontrols.pp svneol=native#text/pascal
lcl/interfaces/gtk2/gtk2wscustomlistview.inc svneol=native#text/pascal lcl/interfaces/gtk2/gtk2wscustomlistview.inc svneol=native#text/pascal
lcl/interfaces/gtk2/gtk2wscustommemo.inc svneol=native#text/pascal
lcl/interfaces/gtk2/gtk2wsdbctrls.pp svneol=native#text/pascal lcl/interfaces/gtk2/gtk2wsdbctrls.pp svneol=native#text/pascal
lcl/interfaces/gtk2/gtk2wsdbgrids.pp svneol=native#text/pascal lcl/interfaces/gtk2/gtk2wsdbgrids.pp svneol=native#text/pascal
lcl/interfaces/gtk2/gtk2wsdialogs.pp svneol=native#text/pascal lcl/interfaces/gtk2/gtk2wsdialogs.pp svneol=native#text/pascal

View File

@ -106,21 +106,23 @@ begin
GetItemIndex; GetItemIndex;
//DebugLn('[TCustomListBox.DestroyHandle] A ',FItems.ClassName); //DebugLn('[TCustomListBox.DestroyHandle] A ',FItems.ClassName);
// create internal item list // create internal item list
NewStrings:= TExtendedStringList.Create(GetCachedDataSize); if Assigned(FItems) then begin;
NewStrings:= TExtendedStringList.Create(GetCachedDataSize);
// copy items (text+objects) from the interface items list // copy items (text+objects) from the interface items list
NewStrings.Assign(Items); NewStrings.Assign(Items);
// copy items attributes // copy items attributes
Cnt:=Items.Count; Cnt:=Items.Count;
for i:=0 to Cnt-1 do for i:=0 to Cnt-1 do
AssignItemDataToCache(i, NewStrings.Records[i]); AssignItemDataToCache(i, NewStrings.Records[i]);
// free the interface items list // free the interface items list
FItems.Free; FItems.Free;
// new item list is the internal item list // new item list is the internal item list
FItems:= NewStrings; FItems:= NewStrings;
FCacheValid := True; FCacheValid := True;
//DebugLn('[TCustomListBox.DestroyHandle] B ',FItems.ClassName); //DebugLn('[TCustomListBox.DestroyHandle] B ',FItems.ClassName);
end;
inherited DestroyHandle; inherited DestroyHandle;
//DebugLn('[TCustomListBox.DestroyHandle] END ',FItems.ClassName); //DebugLn('[TCustomListBox.DestroyHandle] END ',FItems.ClassName);
UnlockSelectionChange; UnlockSelectionChange;
@ -436,8 +438,8 @@ begin
Destroying; Destroying;
DestroyWnd; DestroyWnd;
FreeAndNil(FCanvas); FreeAndNil(FCanvas);
inherited Destroy;
FreeAndNil(FItems); FreeAndNil(FItems);
inherited Destroy;
end; end;
function TCustomListBox.GetItemIndex : integer; function TCustomListBox.GetItemIndex : integer;

View File

@ -172,7 +172,7 @@ begin
GDK_WINDOW_SHOW_IN_TASKBAR(AWindow,AValue); GDK_WINDOW_SHOW_IN_TASKBAR(AWindow,AValue);
{$ENDIF} {$ENDIF}
{$IFDEF GTK2} {$IFDEF HASGTK2_2}
gtk_window_set_skip_taskbar_hint(PGtkWindow(AForm.Handle), not AValue); gtk_window_set_skip_taskbar_hint(PGtkWindow(AForm.Handle), not AValue);
{$ENDIF} {$ENDIF}
end; end;

View File

@ -549,6 +549,7 @@ procedure TGtkWSCustomListBox.SetTopIndex(const ACustomListBox: TCustomListBox;
begin begin
DebugLn('TODO: TGtkWSCustomListBox.SetTopIndex'); DebugLn('TODO: TGtkWSCustomListBox.SetTopIndex');
end; end;
{$Else} {$Else}
var var
ScrolledWindow: PGtkScrolledWindow; ScrolledWindow: PGtkScrolledWindow;

View File

@ -56,7 +56,6 @@ type
protected protected
procedure AppendText(Sender: TObject; Str: PChar); procedure AppendText(Sender: TObject; Str: PChar);
function CreateComponent(Sender : TObject): THandle; override; function CreateComponent(Sender : TObject): THandle; override;
function CreateListView(ListViewObject: TObject): PGtkWidget; override;
function GetText(Sender: TComponent; var Text: String): Boolean; function GetText(Sender: TComponent; var Text: String): Boolean;
procedure HookSignals(const AGTKObject: PGTKObject; const ALCLObject: TObject); override; procedure HookSignals(const AGTKObject: PGTKObject; const ALCLObject: TObject); override;
//function IntSendMessage3(LM_Message : Integer; Sender : TObject; data : pointer) : integer; override; //function IntSendMessage3(LM_Message : Integer; Sender : TObject; data : pointer) : integer; override;
@ -91,11 +90,6 @@ type
function GetObject(Index: Integer): TObject; override; function GetObject(Index: Integer): TObject; override;
procedure PutObject(Index: Integer; AnObject: TObject); override; procedure PutObject(Index: Integer; AnObject: TObject); override;
procedure SetSorted(Val : boolean); virtual; procedure SetSorted(Val : boolean); virtual;
procedure ConnectItemCallbacks(Index: integer);
procedure ConnectItemCallbacks(Li: TGtkTreeIter); virtual;
procedure ConnectAllCallbacks; virtual;
procedure RemoveItemCallbacks(Index: integer); virtual;
procedure RemoveAllCallbacks; virtual;
procedure UpdateItemCache; procedure UpdateItemCache;
public public
constructor Create(ListStore : PGtkListStore; ColumnIndex : Integer; TheOwner: TWinControl); constructor Create(ListStore : PGtkListStore; ColumnIndex : Integer; TheOwner: TWinControl);
@ -141,7 +135,7 @@ uses
// Gtk2WSArrow, // Gtk2WSArrow,
// Gtk2WSButtons, // Gtk2WSButtons,
// Gtk2WSCalendar, // Gtk2WSCalendar,
// Gtk2WSCheckLst, Gtk2WSCheckLst,
// Gtk2WSCListBox, // Gtk2WSCListBox,
Gtk2WSComCtrls, Gtk2WSComCtrls,
Gtk2WSControls, Gtk2WSControls,
@ -199,13 +193,11 @@ begin
'TGtkListStoreStringList.Create Unspecified owner'); 'TGtkListStoreStringList.Create Unspecified owner');
FOwner:=TheOwner; FOwner:=TheOwner;
Include(FStates,glsItemCacheNeedsUpdate); Include(FStates,glsItemCacheNeedsUpdate);
ConnectAllCallbacks;
end; end;
destructor TGtkListStoreStringList.Destroy; destructor TGtkListStoreStringList.Destroy;
begin begin
// don't destroy the widgets // don't destroy the widgets
RemoveAllCallbacks;
ReAllocMem(FCachedItems,0); ReAllocMem(FCachedItems,0);
inherited Destroy; inherited Destroy;
end; end;
@ -230,71 +222,10 @@ begin
end; end;
end; end;
{------------------------------------------------------------------------------
procedure TGtkListStoreStringList.ConnectItemCallbacks(Index: integer);
------------------------------------------------------------------------------}
procedure TGtkListStoreStringList.ConnectItemCallbacks(Index: integer);
var
ListItem: TGtkTreeIter;
begin
UpdateItemCache;
ListItem:=FCachedItems[Index];
ConnectItemCallbacks(ListItem);
end;
{------------------------------------------------------------------------------
procedure TGtkListStoreStringList.ConnectItemCallbacks(Li: PGtkListItem);
------------------------------------------------------------------------------}
procedure TGtkListStoreStringList.ConnectItemCallbacks(Li: TGtkTreeIter);
begin
{gtk_object_set_data(PGtkObject(li.user_data),GtkListItemLCLListTag,Self);
gtk_object_set_data(PGtkObject(li.user_data),GtkListItemGtkListTag,FGtkList);}
end;
{------------------------------------------------------------------------------
procedure TGtkListStoreStringList.ConnectAllCallbacks;
------------------------------------------------------------------------------}
procedure TGtkListStoreStringList.ConnectAllCallbacks;
var
i, Cnt: integer;
begin
BeginUpdate;
Cnt:=Count-1;
for i:=0 to Cnt-1 do
ConnectItemCallbacks(i);
EndUpdate;
end;
{------------------------------------------------------------------------------
procedure TGtkListStoreStringList.RemoveItemCallbacks(Index: integer);
------------------------------------------------------------------------------}
procedure TGtkListStoreStringList.RemoveItemCallbacks(Index: integer);
//var
// ListItem: TGtkTreeIter;
begin
UpdateItemCache;
debugln('TGtkListStoreStringList.RemoveItemCallbacks TODO');
//ListItem:=FCachedItems[Index];
{gtk_object_set_data(PGtkObject(ListItem),GtkListItemLCLListTag,nil);
gtk_object_set_data(PGtkObject(ListItem),GtkListItemGtkListTag,nil);}
end;
{------------------------------------------------------------------------------ {------------------------------------------------------------------------------
procedure TGtkListStoreStringList.RemoveAllCallbacks; procedure TGtkListStoreStringList.RemoveAllCallbacks;
------------------------------------------------------------------------------} ------------------------------------------------------------------------------}
procedure TGtkListStoreStringList.RemoveAllCallbacks;
var
i: integer;
begin
BeginUpdate;
for i:=0 to Count-1 do
RemoveItemCallbacks(i);
EndUpdate;
end;
procedure TGtkListStoreStringList.UpdateItemCache; procedure TGtkListStoreStringList.UpdateItemCache;
var var
@ -314,18 +245,15 @@ begin
end; end;
procedure TGtkListStoreStringList.PutObject(Index: Integer; AnObject: TObject); procedure TGtkListStoreStringList.PutObject(Index: Integer; AnObject: TObject);
//var var
// ListItem : TGtkTreeIter; ListItem : TGtkTreeIter;
begin begin
if (Index < 0) or (Index >= Count) then if (Index < 0) or (Index >= Count) then
RaiseException('TGtkListStoreStringList.PutObject Out of bounds.') RaiseException('TGtkListStoreStringList.PutObject Out of bounds.')
else if FGtkListStore<>nil then begin else if FGtkListStore<>nil then begin
UpdateItemCache; UpdateItemCache;
debugln('TGtkListStoreStringList.PutObject TODO'); ListItem:=FCachedItems[Index];
{ListItem:=FCachedItems[Index]; gtk_list_store_set(FGtkListStore, @ListItem, [FColumnIndex+1, AnObject, -1]);
if ListItem <> nil then begin
gtk_object_set_data(PGtkObject(ListItem),'LCLStringsObject',AnObject);
end;}
end; end;
end; end;
@ -458,17 +386,15 @@ end;
function TGtkListStoreStringList.GetObject(Index: Integer): TObject; function TGtkListStoreStringList.GetObject(Index: Integer): TObject;
var var
ListItem : PGtkTreeIter; ListItem : TGtkTreeIter;
begin begin
Result:=nil; Result:=nil;
if (Index < 0) or (Index >= Count) then if (Index < 0) or (Index >= Count) then
RaiseException('TGtkListStoreStringList.GetObject Out of bounds.') RaiseException('TGtkListStoreStringList.GetObject Out of bounds.')
else if FGtkListStore<>nil then begin else if FGtkListStore<>nil then begin
UpdateItemCache; UpdateItemCache;
ListItem:=@FCachedItems[Index]; ListItem:=FCachedItems[Index];
if ListItem<>nil then begin gtk_tree_model_get(FGtkListStore, @ListItem, [FColumnIndex+1, @Result, -1]);
//Result:=TObject(gtk_object_get_data(PGtkObject(ListItem),'LCLStringsObject'));
end;
end; end;
end; end;
@ -496,7 +422,6 @@ end;
------------------------------------------------------------------------------} ------------------------------------------------------------------------------}
procedure TGtkListStoreStringList.Clear; procedure TGtkListStoreStringList.Clear;
begin begin
RemoveAllCallbacks;
Include(FStates,glsItemCacheNeedsUpdate); Include(FStates,glsItemCacheNeedsUpdate);
gtk_list_store_clear(FGtkListStore) gtk_list_store_clear(FGtkListStore)
end; end;
@ -511,7 +436,6 @@ procedure TGtkListStoreStringList.Delete(Index : integer);
var var
ListItem : TGtkTreeIter; ListItem : TGtkTreeIter;
begin begin
RemoveItemCallbacks(Index);
Include(FStates,glsItemCacheNeedsUpdate); Include(FStates,glsItemCacheNeedsUpdate);
gtk_tree_model_iter_nth_child (FGtkListStore, @ListItem, nil, Index); gtk_tree_model_iter_nth_child (FGtkListStore, @ListItem, nil, Index);
gtk_list_store_remove(FGtkListStore, @ListItem); gtk_list_store_remove(FGtkListStore, @ListItem);
@ -586,8 +510,6 @@ begin
gtk_list_store_insert(FGtkListStore, @li, Index); gtk_list_store_insert(FGtkListStore, @li, Index);
gtk_list_store_set(FGtkListStore, @li, [FColumnIndex, PChar(S), -1]); gtk_list_store_set(FGtkListStore, @li, [FColumnIndex, PChar(S), -1]);
ConnectItemCallbacks(li);
Include(FStates,glsItemCacheNeedsUpdate); Include(FStates,glsItemCacheNeedsUpdate);
finally finally
@ -599,6 +521,9 @@ end.
{ {
$Log$ $Log$
Revision 1.44 2005/04/07 22:04:02 marc
* gtk2 patch from Andrew
Revision 1.43 2005/03/25 17:47:55 mattias Revision 1.43 2005/03/25 17:47:55 mattias
implemented TMemo text for gtk2, TRadioGroup.OnClick is now called whenever ItemIndex changed, so it works now also under gtk2 Delphi compatible from Andrew Haines implemented TMemo text for gtk2, TRadioGroup.OnClick is now called whenever ItemIndex changed, so it works now also under gtk2 Delphi compatible from Andrew Haines

View File

@ -247,84 +247,6 @@ begin
gtk_editable_set_editable (PGtkEditable(P), not TCustomEdit(Sender).ReadOnly); gtk_editable_set_editable (PGtkEditable(P), not TCustomEdit(Sender).ReadOnly);
gtk_widget_show_all(P); gtk_widget_show_all(P);
end; end;
csListBox, csCheckListBox:
begin
p:= gtk_scrolled_window_new(nil, nil);
GTK_WIDGET_UNSET_FLAGS(PGtkScrolledWindow(p)^.hscrollbar, GTK_CAN_FOCUS);
GTK_WIDGET_UNSET_FLAGS(PGtkScrolledWindow(p)^.vscrollbar, GTK_CAN_FOCUS);
gtk_scrolled_window_set_policy(PGtkScrolledWindow(p),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_widget_show(p);
if (CompStyle = csListBox) then
liststore := gtk_list_store_new (1, [G_TYPE_STRING, nil])
else
liststore := gtk_list_store_new (2, [G_TYPE_BOOLEAN, G_TYPE_STRING, nil]);
TempWidget:= gtk_tree_view_new_with_model (GTK_TREE_MODEL (liststore));
g_object_unref (G_OBJECT (liststore));
TempInt := 0;
if (CompStyle = csCheckListBox) then begin
renderer := gtk_cell_renderer_toggle_new();
column := gtk_tree_view_column_new_with_attributes('', renderer, ['active', 0, nil]);
gtk_cell_renderer_toggle_set_active(GTK_CELL_RENDERER_TOGGLE(renderer), True);
gtk_tree_view_append_column (GTK_TREE_VIEW (TempWidget), column);
gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE);
g_signal_connect (renderer, 'toggled',
G_CALLBACK (@gtk_clb_toggle),
Sender);
g_signal_connect (TempWidget, 'row_activated',
G_CALLBACK (@gtk_clb_toggle_row_activated),
Sender);
TempInt := 1;
end;
renderer := gtk_cell_renderer_text_new();
column := gtk_tree_view_column_new_with_attributes ('LISTITEMS', renderer, ['text', TempInt, nil]);
gtk_tree_view_append_column (GTK_TREE_VIEW (TempWidget), column);
gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE);
gtk_tree_view_set_headers_visible(GTK_TREE_VIEW (TempWidget), False);
gtk_container_add(GTK_CONTAINER(p), TempWidget);
gtk_widget_show(TempWidget);
SetMainWidget(p, TempWidget);
GetWidgetInfo(p, True)^.CoreWidget := TempWidget;
if Sender is TCustomListBox then
SetSelectionMode(Sender,p,TCustomListBox(Sender).MultiSelect,
TCustomListBox(Sender).ExtendedSelect);
end;
csListView:
p:=CreateListView(Sender);
csMemo :
begin
P := gtk_scrolled_window_new(nil, nil);
TempWidget := gtk_text_view_new();
gtk_container_add(PGtkContainer(p), TempWidget);
GTK_WIDGET_UNSET_FLAGS(PGtkScrolledWindow(p)^.hscrollbar, GTK_CAN_FOCUS);
GTK_WIDGET_UNSET_FLAGS(PGtkScrolledWindow(p)^.vscrollbar, GTK_CAN_FOCUS);
gtk_scrolled_window_set_policy(PGtkScrolledWindow(p),
GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC);
gtk_scrolled_window_set_shadow_type(PGtkScrolledWindow(p),GTK_SHADOW_IN);
SetMainWidget(p, TempWidget);
GetWidgetInfo(p, True)^.CoreWidget := TempWidget;
gtk_text_view_set_editable (PGtkTextView(TempWidget), not TCustomMemo(Sender).ReadOnly);
if TCustomMemo(Sender).WordWrap then
gtk_text_view_set_wrap_mode(PGtkTextView(TempWidget), GTK_WRAP_WORD)
else
gtk_text_view_set_wrap_mode(PGtkTextView(TempWidget), GTK_WRAP_NONE);
gtk_widget_show_all(P);
SetupProps:= true;
end;
else begin else begin
StrDispose(StrTemp); StrDispose(StrTemp);
Result:=Inherited CreateComponent(Sender); Result:=Inherited CreateComponent(Sender);
@ -336,12 +258,6 @@ begin
Result := THandle(P); Result := THandle(P);
end; end;
function TGtk2WidgetSet.CreateListView(ListViewObject: TObject): PGtkWidget;
begin
DebugLn('Warning: deprecated call to TGtkWidgetSet.CreateListView');
Result:=nil;
end;
function TGtk2WidgetSet.GetText(Sender: TComponent; var Text: String): Boolean; function TGtk2WidgetSet.GetText(Sender: TComponent; var Text: String): Boolean;
var var
CS: PChar; CS: PChar;
@ -1551,6 +1467,9 @@ end;
{ ============================================================================= { =============================================================================
$Log$ $Log$
Revision 1.32 2005/04/07 22:04:02 marc
* gtk2 patch from Andrew
Revision 1.31 2005/03/08 00:28:03 mattias Revision 1.31 2005/03/08 00:28:03 mattias
implemented gtk2 AppMinimize implemented gtk2 AppMinimize

View File

@ -27,29 +27,201 @@ unit Gtk2WSCheckLst;
interface interface
uses uses
Gtk2, GLib2, GtkDef,
//////////////////////////////////////////////////// ////////////////////////////////////////////////////
// I M P O R T A N T // I M P O R T A N T
//////////////////////////////////////////////////// ////////////////////////////////////////////////////
// To get as little as posible circles, // To get as little as posible circles,
// uncomment only when needed for registration // uncomment only when needed for registration
//////////////////////////////////////////////////// ////////////////////////////////////////////////////
// CheckLst, CheckLst, Controls, LCLType, Classes,
//////////////////////////////////////////////////// ////////////////////////////////////////////////////
WSCheckLst, WSLCLClasses; WSCheckLst, WSLCLClasses,
Gtk2WSStdCtrls;
type type
{ TGtk2WSCheckListBox } { TGtk2WSCheckListBox }
TGtk2WSCheckListBox = class(TWSCheckListBox) TGtk2WSCustomCheckListBox = class(TWSCustomCheckListBox)
private private
class procedure SetCallbacks(const AGtkWidget: PGtkWidget; const AWidgetInfo: PWidgetInfo); virtual;
protected protected
public public
class function GetChecked(const ACheckListBox: TCustomCheckListBox;
const AIndex: integer): boolean; override;
class procedure SetChecked(const ACheckListBox: TCustomCheckListBox;
const AIndex: integer; const AChecked: boolean); override;
class function CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLIntfHandle; override;
end; end;
implementation implementation
uses GtkWSControls, GtkProc;
{ TGtk2WSCheckListBox }
procedure Gtk2WS_CheckListBoxToggle(cellrenderertoggle : PGtkCellRendererToggle; arg1 : PGChar;
WidgetInfo: PWidgetInfo); cdecl;
var
aWidget : PGTKWidget;
aTreeModel : PGtkTreeModel;
aTreeIter : TGtkTreeIter;
value : pgValue;
begin
aWidget := WidgetInfo^.CoreWidget;
aTreeModel := gtk_tree_view_get_model (GTK_TREE_VIEW(aWidget));
if (gtk_tree_model_get_iter_from_string (aTreeModel, @aTreeIter, arg1)) then begin
aTreeIter.stamp := GTK_LIST_STORE (aTreeModel)^.stamp; //strange hack
value := g_new0(SizeOf(TgValue), 1);
gtk_tree_model_get_value(aTreeModel, @aTreeIter, 0, value);
g_value_set_boolean(value, not g_value_get_boolean(value));
gtk_list_store_set_value (GTK_LIST_STORE (aTreeModel), @aTreeIter, 0, value);
g_value_unset(value);
g_free(value);
end;
end;
procedure Gtk2WS_CheckListBoxRowActivate(treeview : PGtkTreeView; arg1 : PGtkTreePath;
arg2 : PGtkTreeViewColumn; WidgetInfo: PWidgetInfo); cdecl;
var
aTreeModel : PGtkTreeModel;
aTreeIter : TGtkTreeIter;
value : PGValue;
begin
aTreeModel := gtk_tree_view_get_model (treeview);
if (gtk_tree_model_get_iter (aTreeModel, @aTreeIter, arg1)) then begin
aTreeIter.stamp := GTK_LIST_STORE (aTreeModel)^.stamp; //strange hack
value := g_new0(SizeOf(TgValue), 1);
gtk_tree_model_get_value(aTreeModel, @aTreeIter, 0, value);
g_value_set_boolean(value, not g_value_get_boolean(value));
gtk_list_store_set_value (GTK_LIST_STORE (aTreeModel), @aTreeIter, 0, value);
g_value_unset(value);
g_free(value);
end;
end;
procedure TGtk2WSCustomCheckListBox.SetCallbacks(const AGtkWidget: PGtkWidget;
const AWidgetInfo: PWidgetInfo);
var
Selection: PGtkTreeSelection;
begin
TGtkWSBaseScrollingWinControl.SetCallbacks(AGtkWidget,AWidgetInfo);
TGtkWSWinControl.SetCallbacks(PGtkObject(AWidgetInfo^.CoreWidget), TComponent(AWidgetInfo^.LCLObject));
Selection := gtk_tree_view_get_selection(PGtkTreeView(AWidgetInfo^.CoreWidget));
//SignalConnect(PGtkWidget(Selection), 'changed', @Gtk2WS_ListBoxChange, AWidgetInfo);
end;
function TGtk2WSCustomCheckListBox.GetChecked(
const ACheckListBox: TCustomCheckListBox; const AIndex: integer): boolean;
var
Iter : TGtkTreeIter;
TreeView: PGtkTreeView;
WidgetInfo: PWidgetInfo;
ListStore: PGtkTreeModel;
begin
Result:=False;
WidgetInfo := GetWidgetInfo(PGtkWidget(ACheckListBox.Handle));
TreeView := PGtkTreeView(WidgetInfo^.CoreWidget);
ListStore := gtk_tree_view_get_model(TreeView);
if gtk_tree_model_iter_nth_child(ListStore, @Iter, nil, AIndex) then
gtk_tree_model_get(ListStore, @Iter, [0, @Result, -1]);
end;
procedure TGtk2WSCustomCheckListBox.SetChecked(
const ACheckListBox: TCustomCheckListBox; const AIndex: integer;
const AChecked: boolean);
var
Iter : TGtkTreeIter;
TreeView: PGtkTreeView;
WidgetInfo: PWidgetInfo;
ListStore: PGtkTreeModel;
begin
WidgetInfo := GetWidgetInfo(PGtkWidget(ACheckListBox.Handle));
TreeView := PGtkTreeView(WidgetInfo^.CoreWidget);
ListStore := gtk_tree_view_get_model(TreeView);
if gtk_tree_model_iter_nth_child(ListStore, @Iter, nil, AIndex) then
gtk_list_store_set(ListStore, @Iter, [0, AChecked, -1]);
end;
function TGtk2WSCustomCheckListBox.CreateHandle(const AWinControl: TWinControl;
const AParams: TCreateParams): TLCLIntfHandle;
var
TempWidget: PGtkWidget;
p: PGtkWidget; // ptr to the newly created GtkWidget
SetupProps : boolean;
liststore : PGtkListStore;
Selection: PGtkTreeSelection;
renderer : PGtkCellRenderer;
column : PGtkTreeViewColumn;
WidgetInfo: PWidgetInfo;
begin
Result := TGtkWSBaseScrollingWinControl.CreateHandle(AWinControl,AParams);
p:= PGtkWidget(Result);
if Result = 0 then exit;
WidgetInfo := GetWidgetInfo(p, False);
GTK_WIDGET_UNSET_FLAGS(PGtkScrolledWindow(p)^.hscrollbar, GTK_CAN_FOCUS);
GTK_WIDGET_UNSET_FLAGS(PGtkScrolledWindow(p)^.vscrollbar, GTK_CAN_FOCUS);
gtk_scrolled_window_set_policy(PGtkScrolledWindow(p),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_scrolled_window_set_shadow_type(PGtkScrolledWindow(p),GTK_SHADOW_IN);
gtk_widget_show(p);
liststore := gtk_list_store_new (3, [G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_POINTER, nil]);
TempWidget:= gtk_tree_view_new_with_model (GTK_TREE_MODEL (liststore));
g_object_unref (G_OBJECT (liststore));
// Check Column
renderer := gtk_cell_renderer_toggle_new();
column := gtk_tree_view_column_new_with_attributes('', renderer, ['active', 0, nil]);
gtk_cell_renderer_toggle_set_active(GTK_CELL_RENDERER_TOGGLE(renderer), True);
gtk_tree_view_append_column (GTK_TREE_VIEW (TempWidget), column);
gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE);
SignalConnect(PGtkWidget(renderer), 'toggled', @Gtk2WS_CheckListBoxToggle, WidgetInfo);
SignalConnect(PGtkWidget(renderer), 'row_activated', @Gtk2WS_CheckListBoxRowActivate, WidgetInfo);
//g_signal_connect (renderer, 'toggled', G_CALLBACK (@gtk_clb_toggle), AWinControl);
//g_signal_connect (TempWidget, 'row_activated', G_CALLBACK (@gtk_clb_toggle_row_activated), AWinControl);
// Text Column
renderer := gtk_cell_renderer_text_new();
column := gtk_tree_view_column_new_with_attributes ('LISTITEMS', renderer, ['text', 1, nil]);
gtk_tree_view_append_column (GTK_TREE_VIEW (TempWidget), column);
gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE);
gtk_tree_view_set_headers_visible(GTK_TREE_VIEW (TempWidget), False);
gtk_container_add(GTK_CONTAINER(p), TempWidget);
gtk_widget_show(TempWidget);
SetMainWidget(p, TempWidget);
GetWidgetInfo(p, True)^.CoreWidget := TempWidget;
Selection := gtk_tree_view_get_selection(PGtkTreeView(TempWidget));
case TCustomCheckListBox(AWinControl).MultiSelect of
True : gtk_tree_selection_set_mode(Selection, GTK_SELECTION_MULTIPLE);
False: gtk_tree_selection_set_mode(Selection, GTK_SELECTION_SINGLE);
end;
SetCallbacks(p, WidgetInfo);
end;
initialization initialization
//////////////////////////////////////////////////// ////////////////////////////////////////////////////
@ -58,6 +230,6 @@ initialization
// To improve speed, register only classes // To improve speed, register only classes
// which actually implement something // which actually implement something
//////////////////////////////////////////////////// ////////////////////////////////////////////////////
// RegisterWSComponent(TCheckListBox, TGtk2WSCheckListBox); RegisterWSComponent(TCheckListBox, TGtk2WSCustomCheckListBox);
//////////////////////////////////////////////////// ////////////////////////////////////////////////////
end. end.

View File

@ -0,0 +1,140 @@
{ Callbacks }
procedure Gtk2WS_MemoChanged( AGtkTextBuffer: PGtkTextBuffer; WidgetInfo: PWidgetInfo); cdecl;
var
Mess : TLMessage;
begin
EventTrace('Gtk2WS_MemoChanged', WidgetInfo^.LCLObject);
Mess.Msg := CM_TEXTCHANGED;
DeliverMessage(WidgetInfo^.LCLObject, Mess);
end;
procedure Gtk2WS_MemoCutToClip( widget: PGtkWidget; WidgetInfo: PWidgetInfo); cdecl;
var
Mess : TLMessage;
begin
EventTrace('Gtk2WS_MemoCutToClip', WidgetInfo^.LCLObject);
if (Widget=nil) then ;
Mess.msg := LM_CUTTOCLIP;
DeliverMessage(WidgetInfo^.LCLObject, Mess);
end;
procedure Gtk2WS_MemoCopyToClip( widget: PGtkWidget; WidgetInfo: PWidgetInfo); cdecl;
var
Mess : TLMessage;
begin
EventTrace('Gtk2WS_MemoCopyToClip', WidgetInfo^.LCLObject);
if (Widget=nil) then ;
Mess.msg := LM_COPYTOCLIP;
DeliverMessage(WidgetInfo^.LCLObject, Mess);
end;
procedure Gtk2WS_MemoPasteFromClip( widget: PGtkWidget; WidgetInfo: PWidgetInfo); cdecl;
var
Mess : TLMessage;
begin
EventTrace('Gtk2WS_MemoPasteFromClip', WidgetInfo^.LCLObject);
if (Widget=nil) then ;
Mess.msg := LM_PASTEFROMCLIP;
DeliverMessage(WidgetInfo^.LCLObject, Mess);
end;
procedure Gtk2WS_MemoTextInserting (Textbuffer: PGtkTextBuffer; StartIter: PGtkTextIter;
thetext: pgchar; NewTextLength: gint; WidgetInfo: PWidgetInfo); cdecl;
var
Memo: TCustomMemo;
CurrLength, CutLength: integer;
begin
{ GTK2 does not provide its own max. length for memos
so we have to do our own. }
if TControl(WidgetInfo^.LCLObject) is TCustomMemo then begin
Memo:= TCustomMemo(WidgetInfo^.LCLObject);
if Memo.MaxLength < 0 then Exit;
CurrLength:= gtk_text_buffer_get_char_count(TextBuffer);
if CurrLength + NewTextLength <= Memo.MaxLength then Exit;
CutLength:= CurrLength + NewTextLength - Memo.MaxLength;
if NewTextLength - CutLength > 0 then begin
gtk_text_buffer_insert(TextBuffer, StartIter, TheText, NewTextLength - CutLength);
end;
g_signal_stop_emission_by_name(PGtkObject(Textbuffer), 'insert-text');
end;
end;
{ TGtk2WSCustomMemo }
procedure TGtk2WSCustomMemo.SetCallbacks(const AGtkWidget: PGtkWidget;
const AWidgetInfo: PWidgetInfo);
var
TextBuf: PGtkTextBuffer;
begin
TextBuf := gtk_text_view_get_buffer(PGtkTextView(AWidgetInfo^.CoreWidget));
//TGtkWSBaseScrollingWinControl.SetCallbacks(AGtkWidget, AWidgetInfo);
TGtkWSWinControl.SetCallbacks(PGtkObject(AWidgetInfo^.CoreWidget), TComponent(AWidgetInfo^.LCLObject));
SignalConnect(PGtkWidget(TextBuf), 'changed', @Gtk2WS_MemoChanged, AWidgetInfo);
SignalConnect(PGtkWidget(TextBuf), 'insert-text', @Gtk2WS_MemoTextInserting, AWidgetInfo);
//SetCallback(LM_ACTIVATE, AGTKObject,ALCLObject);
SignalConnect(AWidgetInfo^.CoreWidget, 'cut-clipboard', @Gtk2WS_MemoCutToClip, AWidgetInfo);
SignalConnect(AWidgetInfo^.CoreWidget, 'copy-clipboard', @Gtk2WS_MemoCopyToClip, AWidgetInfo);
SignalConnect(AWidgetInfo^.CoreWidget, 'paste-clipboard', @Gtk2WS_MemoPasteFromClip, AWidgetInfo);
end;
function TGtk2WSCustomMemo.CreateHandle(const AWinControl: TWinControl;
const AParams: TCreateParams): TLCLIntfHandle;
var
Widget,
TempWidget: PGtkWidget;
WidgetInfo: PWidgetInfo;
begin
Widget := gtk_scrolled_window_new(nil, nil);
Result := TLCLIntfHandle(Widget);
if Result = 0 then Exit;
WidgetInfo := CreateWidgetInfo(Pointer(Result), AWinControl, AParams);
TempWidget := gtk_text_view_new();
gtk_container_add(PGtkContainer(Widget), TempWidget);
GTK_WIDGET_UNSET_FLAGS(PGtkScrolledWindow(Widget)^.hscrollbar, GTK_CAN_FOCUS);
GTK_WIDGET_UNSET_FLAGS(PGtkScrolledWindow(Widget)^.vscrollbar, GTK_CAN_FOCUS);
gtk_scrolled_window_set_policy(PGtkScrolledWindow(Widget),
GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC);
gtk_scrolled_window_set_shadow_type(PGtkScrolledWindow(Widget),GTK_SHADOW_IN);
SetMainWidget(Widget, TempWidget);
GetWidgetInfo(Widget, True)^.CoreWidget := TempWidget;
gtk_text_view_set_editable (PGtkTextView(TempWidget), not TCustomMemo(AWinControl).ReadOnly);
if TCustomMemo(AWinControl).WordWrap then
gtk_text_view_set_wrap_mode(PGtkTextView(TempWidget), GTK_WRAP_WORD)
else
gtk_text_view_set_wrap_mode(PGtkTextView(TempWidget), GTK_WRAP_NONE);
gtk_widget_show_all(Widget);
SetCallbacks(Widget, WidgetInfo);
end;
function TGtk2WSCustomMemo.GetStrings(const ACustomMemo: TCustomMemo
): TStrings;
var
TextView: PGtkTextView;
begin
TextView := PGtkTextView(GetWidgetInfo(Pointer(ACustomMemo.Handle), False)^.CoreWidget);
Result := TGtk2MemoStrings.Create(TextView, ACustomMemo);
end;

View File

@ -34,7 +34,7 @@ uses
// To get as little as posible circles, // To get as little as posible circles,
// uncomment only when needed for registration // uncomment only when needed for registration
//////////////////////////////////////////////////// ////////////////////////////////////////////////////
StdCtrls, StdCtrls, LMessages,
//////////////////////////////////////////////////// ////////////////////////////////////////////////////
glib2, gdk2pixbuf, gdk2, gtk2, Pango, glib2, gdk2pixbuf, gdk2, gtk2, Pango,
WSStdCtrls, WSLCLClasses, GtkWSStdCtrls, Gtk2Int, LCLType, GtkDef, LCLProc, WSStdCtrls, WSLCLClasses, GtkWSStdCtrls, Gtk2Int, LCLType, GtkDef, LCLProc,
@ -87,6 +87,7 @@ type
TGtk2WSCustomListBox = class(TGtkWSCustomListBox) TGtk2WSCustomListBox = class(TGtkWSCustomListBox)
private private
protected protected
class procedure SetCallbacks(const AGtkWidget: PGtkWidget; const AWidgetInfo: PWidgetInfo); virtual;
public public
class function GetSelCount(const ACustomListBox: TCustomListBox): integer; override; class function GetSelCount(const ACustomListBox: TCustomListBox): integer; override;
class function GetSelected(const ACustomListBox: TCustomListBox; const AIndex: integer): boolean; override; class function GetSelected(const ACustomListBox: TCustomListBox; const AIndex: integer): boolean; override;
@ -100,6 +101,7 @@ type
AMultiSelect: boolean); override; AMultiSelect: boolean); override;
class procedure SetSorted(const ACustomListBox: TCustomListBox; AList: TStrings; ASorted: boolean); override; class procedure SetSorted(const ACustomListBox: TCustomListBox; AList: TStrings; ASorted: boolean); override;
class procedure SetTopIndex(const ACustomListBox: TCustomListBox; const NewTopIndex: integer); override; class procedure SetTopIndex(const ACustomListBox: TCustomListBox; const NewTopIndex: integer); override;
class function CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLIntfHandle; override;
end; end;
{ TGtk2WSListBox } { TGtk2WSListBox }
@ -123,7 +125,9 @@ type
TGtk2WSCustomMemo = class(TGtkWSCustomMemo) TGtk2WSCustomMemo = class(TGtkWSCustomMemo)
private private
protected protected
class procedure SetCallbacks(const AGtkWidget: PGtkWidget; const AWidgetInfo: PWidgetInfo); virtual;
public public
class function CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLIntfHandle; override;
class function GetStrings(const ACustomMemo: TCustomMemo): TStrings; override; class function GetStrings(const ACustomMemo: TCustomMemo): TStrings; override;
end; end;
@ -228,10 +232,22 @@ type
implementation implementation
uses GtkWSControls;
{$I gtk2memostrings.inc} {$I gtk2memostrings.inc}
{ TGtk2WSCustomListBox } { TGtk2WSCustomListBox }
procedure Gtk2WS_ListBoxChange(Selection: PGtkTreeSelection; WidgetInfo: PWidgetInfo); cdecl;
var
Mess: TLMessage;
begin
EventTrace('Gtk2WS_ListBoxChange', WidgetInfo^.LCLObject);
FillChar(Mess,SizeOf(Mess),0);
Mess.msg := LM_SelChange;
DeliverMessage(WidgetInfo^.LCLObject, Mess);
end;
function TGtk2WSCustomListBox.GetItemIndex(const ACustomListBox: TCustomListBox function TGtk2WSCustomListBox.GetItemIndex(const ACustomListBox: TCustomListBox
): integer; ): integer;
var var
@ -373,6 +389,72 @@ begin
inherited SetTopIndex(ACustomListBox, NewTopIndex); inherited SetTopIndex(ACustomListBox, NewTopIndex);
end; end;
function TGtk2WSCustomListBox.CreateHandle(const AWinControl: TWinControl;
const AParams: TCreateParams): TLCLIntfHandle;
var
TempWidget: PGtkWidget;
p: PGtkWidget; // ptr to the newly created GtkWidget
SetupProps : boolean;
liststore : PGtkListStore;
Selection: PGtkTreeSelection;
renderer : PGtkCellRenderer;
column : PGtkTreeViewColumn;
WidgetInfo: PWidgetInfo;
begin
Result := TGtkWSBaseScrollingWinControl.CreateHandle(AWinControl,AParams);
p:= PGtkWidget(Result);
if Result = 0 then exit;
GTK_WIDGET_UNSET_FLAGS(PGtkScrolledWindow(p)^.hscrollbar, GTK_CAN_FOCUS);
GTK_WIDGET_UNSET_FLAGS(PGtkScrolledWindow(p)^.vscrollbar, GTK_CAN_FOCUS);
gtk_scrolled_window_set_policy(PGtkScrolledWindow(p),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_scrolled_window_set_shadow_type(PGtkScrolledWindow(p),GTK_SHADOW_IN);
gtk_widget_show(p);
liststore := gtk_list_store_new (2, [G_TYPE_STRING, G_TYPE_POINTER, nil]);
TempWidget:= gtk_tree_view_new_with_model (GTK_TREE_MODEL (liststore));
g_object_unref (G_OBJECT (liststore));
renderer := gtk_cell_renderer_text_new();
column := gtk_tree_view_column_new_with_attributes ('LISTITEMS', renderer, ['text', 0, nil]);
gtk_tree_view_append_column (GTK_TREE_VIEW (TempWidget), column);
gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE);
gtk_tree_view_set_headers_visible(GTK_TREE_VIEW (TempWidget), False);
gtk_container_add(GTK_CONTAINER(p), TempWidget);
gtk_widget_show(TempWidget);
SetMainWidget(p, TempWidget);
GetWidgetInfo(p, True)^.CoreWidget := TempWidget;
Selection := gtk_tree_view_get_selection(PGtkTreeView(TempWidget));
case TCustomListBox(AWinControl).MultiSelect of
True : gtk_tree_selection_set_mode(Selection, GTK_SELECTION_MULTIPLE);
False: gtk_tree_selection_set_mode(Selection, GTK_SELECTION_SINGLE);
end;
WidgetInfo := GetWidgetInfo(p, False);
SetCallbacks(p, WidgetInfo);
end;
procedure TGtk2WSCustomListBox.SetCallbacks(const AGtkWidget: PGtkWidget;
const AWidgetInfo: PWidgetInfo);
var
Selection: PGtkTreeSelection;
begin
TGtkWSBaseScrollingWinControl.SetCallbacks(AGtkWidget,AWidgetInfo);
TGtkWSWinControl.SetCallbacks(PGtkObject(AWidgetInfo^.CoreWidget), TComponent(AWidgetInfo^.LCLObject));
Selection := gtk_tree_view_get_selection(PGtkTreeView(AWidgetInfo^.CoreWidget));
SignalConnect(PGtkWidget(Selection), 'changed', @Gtk2WS_ListBoxChange, AWidgetInfo);
end;
function TGtk2WSCustomListBox.GetSelCount(const ACustomListBox: TCustomListBox function TGtk2WSCustomListBox.GetSelCount(const ACustomListBox: TCustomListBox
): integer; ): integer;
var var
@ -447,6 +529,7 @@ end;
{ TGtk2WSCustomCheckBox } { TGtk2WSCustomCheckBox }
function TGtk2WSCustomCheckBox.RetrieveState( function TGtk2WSCustomCheckBox.RetrieveState(
const ACustomCheckBox: TCustomCheckBox): TCheckBoxState; const ACustomCheckBox: TCustomCheckBox): TCheckBoxState;
var var
@ -477,16 +560,7 @@ begin
LockOnChange(GtkObject,-1); LockOnChange(GtkObject,-1);
end; end;
{ TGtk2WSCustomMemo } {$I gtk2wscustommemo.inc}
function TGtk2WSCustomMemo.GetStrings(const ACustomMemo: TCustomMemo
): TStrings;
var
TextView: PGtkTextView;
begin
TextView := PGtkTextView(GetWidgetInfo(Pointer(ACustomMemo.Handle), False)^.CoreWidget);
Result := TGtk2MemoStrings.Create(TextView, ACustomMemo);
end;
initialization initialization