mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-12-16 06:00:32 +01:00
* gtk2 patch from Andrew
git-svn-id: trunk@7064 -
This commit is contained in:
parent
c0bd0aabc6
commit
776866aee2
1
.gitattributes
vendored
1
.gitattributes
vendored
@ -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
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
|
|||||||
@ -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.
|
||||||
|
|||||||
140
lcl/interfaces/gtk2/gtk2wscustommemo.inc
Normal file
140
lcl/interfaces/gtk2/gtk2wscustommemo.inc
Normal 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;
|
||||||
|
|
||||||
@ -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
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user