mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-12-11 15:20:35 +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/gtk2wscontrols.pp 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/gtk2wsdbgrids.pp svneol=native#text/pascal
|
||||
lcl/interfaces/gtk2/gtk2wsdialogs.pp svneol=native#text/pascal
|
||||
|
||||
@ -106,21 +106,23 @@ begin
|
||||
GetItemIndex;
|
||||
//DebugLn('[TCustomListBox.DestroyHandle] A ',FItems.ClassName);
|
||||
// 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
|
||||
NewStrings.Assign(Items);
|
||||
// copy items attributes
|
||||
Cnt:=Items.Count;
|
||||
for i:=0 to Cnt-1 do
|
||||
AssignItemDataToCache(i, NewStrings.Records[i]);
|
||||
// copy items (text+objects) from the interface items list
|
||||
NewStrings.Assign(Items);
|
||||
// copy items attributes
|
||||
Cnt:=Items.Count;
|
||||
for i:=0 to Cnt-1 do
|
||||
AssignItemDataToCache(i, NewStrings.Records[i]);
|
||||
|
||||
// free the interface items list
|
||||
FItems.Free;
|
||||
// new item list is the internal item list
|
||||
FItems:= NewStrings;
|
||||
FCacheValid := True;
|
||||
//DebugLn('[TCustomListBox.DestroyHandle] B ',FItems.ClassName);
|
||||
// free the interface items list
|
||||
FItems.Free;
|
||||
// new item list is the internal item list
|
||||
FItems:= NewStrings;
|
||||
FCacheValid := True;
|
||||
//DebugLn('[TCustomListBox.DestroyHandle] B ',FItems.ClassName);
|
||||
end;
|
||||
inherited DestroyHandle;
|
||||
//DebugLn('[TCustomListBox.DestroyHandle] END ',FItems.ClassName);
|
||||
UnlockSelectionChange;
|
||||
@ -436,8 +438,8 @@ begin
|
||||
Destroying;
|
||||
DestroyWnd;
|
||||
FreeAndNil(FCanvas);
|
||||
inherited Destroy;
|
||||
FreeAndNil(FItems);
|
||||
inherited Destroy;
|
||||
end;
|
||||
|
||||
function TCustomListBox.GetItemIndex : integer;
|
||||
|
||||
@ -172,7 +172,7 @@ begin
|
||||
GDK_WINDOW_SHOW_IN_TASKBAR(AWindow,AValue);
|
||||
{$ENDIF}
|
||||
|
||||
{$IFDEF GTK2}
|
||||
{$IFDEF HASGTK2_2}
|
||||
gtk_window_set_skip_taskbar_hint(PGtkWindow(AForm.Handle), not AValue);
|
||||
{$ENDIF}
|
||||
end;
|
||||
|
||||
@ -549,6 +549,7 @@ procedure TGtkWSCustomListBox.SetTopIndex(const ACustomListBox: TCustomListBox;
|
||||
begin
|
||||
DebugLn('TODO: TGtkWSCustomListBox.SetTopIndex');
|
||||
end;
|
||||
|
||||
{$Else}
|
||||
var
|
||||
ScrolledWindow: PGtkScrolledWindow;
|
||||
|
||||
@ -56,7 +56,6 @@ type
|
||||
protected
|
||||
procedure AppendText(Sender: TObject; Str: PChar);
|
||||
function CreateComponent(Sender : TObject): THandle; override;
|
||||
function CreateListView(ListViewObject: TObject): PGtkWidget; override;
|
||||
function GetText(Sender: TComponent; var Text: String): Boolean;
|
||||
procedure HookSignals(const AGTKObject: PGTKObject; const ALCLObject: TObject); override;
|
||||
//function IntSendMessage3(LM_Message : Integer; Sender : TObject; data : pointer) : integer; override;
|
||||
@ -91,11 +90,6 @@ type
|
||||
function GetObject(Index: Integer): TObject; override;
|
||||
procedure PutObject(Index: Integer; AnObject: TObject); override;
|
||||
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;
|
||||
public
|
||||
constructor Create(ListStore : PGtkListStore; ColumnIndex : Integer; TheOwner: TWinControl);
|
||||
@ -141,7 +135,7 @@ uses
|
||||
// Gtk2WSArrow,
|
||||
// Gtk2WSButtons,
|
||||
// Gtk2WSCalendar,
|
||||
// Gtk2WSCheckLst,
|
||||
Gtk2WSCheckLst,
|
||||
// Gtk2WSCListBox,
|
||||
Gtk2WSComCtrls,
|
||||
Gtk2WSControls,
|
||||
@ -199,13 +193,11 @@ begin
|
||||
'TGtkListStoreStringList.Create Unspecified owner');
|
||||
FOwner:=TheOwner;
|
||||
Include(FStates,glsItemCacheNeedsUpdate);
|
||||
ConnectAllCallbacks;
|
||||
end;
|
||||
|
||||
destructor TGtkListStoreStringList.Destroy;
|
||||
begin
|
||||
// don't destroy the widgets
|
||||
RemoveAllCallbacks;
|
||||
ReAllocMem(FCachedItems,0);
|
||||
inherited Destroy;
|
||||
end;
|
||||
@ -230,71 +222,10 @@ begin
|
||||
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;
|
||||
var
|
||||
i: integer;
|
||||
begin
|
||||
BeginUpdate;
|
||||
for i:=0 to Count-1 do
|
||||
RemoveItemCallbacks(i);
|
||||
EndUpdate;
|
||||
end;
|
||||
|
||||
procedure TGtkListStoreStringList.UpdateItemCache;
|
||||
var
|
||||
@ -314,18 +245,15 @@ begin
|
||||
end;
|
||||
|
||||
procedure TGtkListStoreStringList.PutObject(Index: Integer; AnObject: TObject);
|
||||
//var
|
||||
// ListItem : TGtkTreeIter;
|
||||
var
|
||||
ListItem : TGtkTreeIter;
|
||||
begin
|
||||
if (Index < 0) or (Index >= Count) then
|
||||
RaiseException('TGtkListStoreStringList.PutObject Out of bounds.')
|
||||
else if FGtkListStore<>nil then begin
|
||||
UpdateItemCache;
|
||||
debugln('TGtkListStoreStringList.PutObject TODO');
|
||||
{ListItem:=FCachedItems[Index];
|
||||
if ListItem <> nil then begin
|
||||
gtk_object_set_data(PGtkObject(ListItem),'LCLStringsObject',AnObject);
|
||||
end;}
|
||||
ListItem:=FCachedItems[Index];
|
||||
gtk_list_store_set(FGtkListStore, @ListItem, [FColumnIndex+1, AnObject, -1]);
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -458,17 +386,15 @@ end;
|
||||
|
||||
function TGtkListStoreStringList.GetObject(Index: Integer): TObject;
|
||||
var
|
||||
ListItem : PGtkTreeIter;
|
||||
ListItem : TGtkTreeIter;
|
||||
begin
|
||||
Result:=nil;
|
||||
if (Index < 0) or (Index >= Count) then
|
||||
RaiseException('TGtkListStoreStringList.GetObject Out of bounds.')
|
||||
else if FGtkListStore<>nil then begin
|
||||
UpdateItemCache;
|
||||
ListItem:=@FCachedItems[Index];
|
||||
if ListItem<>nil then begin
|
||||
//Result:=TObject(gtk_object_get_data(PGtkObject(ListItem),'LCLStringsObject'));
|
||||
end;
|
||||
ListItem:=FCachedItems[Index];
|
||||
gtk_tree_model_get(FGtkListStore, @ListItem, [FColumnIndex+1, @Result, -1]);
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -496,7 +422,6 @@ end;
|
||||
------------------------------------------------------------------------------}
|
||||
procedure TGtkListStoreStringList.Clear;
|
||||
begin
|
||||
RemoveAllCallbacks;
|
||||
Include(FStates,glsItemCacheNeedsUpdate);
|
||||
gtk_list_store_clear(FGtkListStore)
|
||||
end;
|
||||
@ -511,7 +436,6 @@ procedure TGtkListStoreStringList.Delete(Index : integer);
|
||||
var
|
||||
ListItem : TGtkTreeIter;
|
||||
begin
|
||||
RemoveItemCallbacks(Index);
|
||||
Include(FStates,glsItemCacheNeedsUpdate);
|
||||
gtk_tree_model_iter_nth_child (FGtkListStore, @ListItem, nil, Index);
|
||||
gtk_list_store_remove(FGtkListStore, @ListItem);
|
||||
@ -586,8 +510,6 @@ begin
|
||||
gtk_list_store_insert(FGtkListStore, @li, Index);
|
||||
gtk_list_store_set(FGtkListStore, @li, [FColumnIndex, PChar(S), -1]);
|
||||
|
||||
ConnectItemCallbacks(li);
|
||||
|
||||
Include(FStates,glsItemCacheNeedsUpdate);
|
||||
|
||||
finally
|
||||
@ -599,6 +521,9 @@ end.
|
||||
|
||||
{
|
||||
$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
|
||||
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_widget_show_all(P);
|
||||
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
|
||||
StrDispose(StrTemp);
|
||||
Result:=Inherited CreateComponent(Sender);
|
||||
@ -336,12 +258,6 @@ begin
|
||||
Result := THandle(P);
|
||||
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;
|
||||
var
|
||||
CS: PChar;
|
||||
@ -1551,6 +1467,9 @@ end;
|
||||
{ =============================================================================
|
||||
|
||||
$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
|
||||
implemented gtk2 AppMinimize
|
||||
|
||||
|
||||
@ -27,29 +27,201 @@ unit Gtk2WSCheckLst;
|
||||
interface
|
||||
|
||||
uses
|
||||
|
||||
Gtk2, GLib2, GtkDef,
|
||||
////////////////////////////////////////////////////
|
||||
// I M P O R T A N T
|
||||
////////////////////////////////////////////////////
|
||||
// To get as little as posible circles,
|
||||
// uncomment only when needed for registration
|
||||
////////////////////////////////////////////////////
|
||||
// CheckLst,
|
||||
CheckLst, Controls, LCLType, Classes,
|
||||
////////////////////////////////////////////////////
|
||||
WSCheckLst, WSLCLClasses;
|
||||
WSCheckLst, WSLCLClasses,
|
||||
Gtk2WSStdCtrls;
|
||||
|
||||
type
|
||||
|
||||
{ TGtk2WSCheckListBox }
|
||||
|
||||
TGtk2WSCheckListBox = class(TWSCheckListBox)
|
||||
TGtk2WSCustomCheckListBox = class(TWSCustomCheckListBox)
|
||||
private
|
||||
class procedure SetCallbacks(const AGtkWidget: PGtkWidget; const AWidgetInfo: PWidgetInfo); virtual;
|
||||
protected
|
||||
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;
|
||||
|
||||
|
||||
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
|
||||
|
||||
////////////////////////////////////////////////////
|
||||
@ -58,6 +230,6 @@ initialization
|
||||
// To improve speed, register only classes
|
||||
// which actually implement something
|
||||
////////////////////////////////////////////////////
|
||||
// RegisterWSComponent(TCheckListBox, TGtk2WSCheckListBox);
|
||||
RegisterWSComponent(TCheckListBox, TGtk2WSCustomCheckListBox);
|
||||
////////////////////////////////////////////////////
|
||||
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,
|
||||
// uncomment only when needed for registration
|
||||
////////////////////////////////////////////////////
|
||||
StdCtrls,
|
||||
StdCtrls, LMessages,
|
||||
////////////////////////////////////////////////////
|
||||
glib2, gdk2pixbuf, gdk2, gtk2, Pango,
|
||||
WSStdCtrls, WSLCLClasses, GtkWSStdCtrls, Gtk2Int, LCLType, GtkDef, LCLProc,
|
||||
@ -87,6 +87,7 @@ type
|
||||
TGtk2WSCustomListBox = class(TGtkWSCustomListBox)
|
||||
private
|
||||
protected
|
||||
class procedure SetCallbacks(const AGtkWidget: PGtkWidget; const AWidgetInfo: PWidgetInfo); virtual;
|
||||
public
|
||||
class function GetSelCount(const ACustomListBox: TCustomListBox): integer; override;
|
||||
class function GetSelected(const ACustomListBox: TCustomListBox; const AIndex: integer): boolean; override;
|
||||
@ -100,6 +101,7 @@ type
|
||||
AMultiSelect: boolean); override;
|
||||
class procedure SetSorted(const ACustomListBox: TCustomListBox; AList: TStrings; ASorted: boolean); override;
|
||||
class procedure SetTopIndex(const ACustomListBox: TCustomListBox; const NewTopIndex: integer); override;
|
||||
class function CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLIntfHandle; override;
|
||||
end;
|
||||
|
||||
{ TGtk2WSListBox }
|
||||
@ -123,7 +125,9 @@ type
|
||||
TGtk2WSCustomMemo = class(TGtkWSCustomMemo)
|
||||
private
|
||||
protected
|
||||
class procedure SetCallbacks(const AGtkWidget: PGtkWidget; const AWidgetInfo: PWidgetInfo); virtual;
|
||||
public
|
||||
class function CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLIntfHandle; override;
|
||||
class function GetStrings(const ACustomMemo: TCustomMemo): TStrings; override;
|
||||
end;
|
||||
|
||||
@ -228,10 +232,22 @@ type
|
||||
|
||||
implementation
|
||||
|
||||
uses GtkWSControls;
|
||||
|
||||
{$I gtk2memostrings.inc}
|
||||
|
||||
{ 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
|
||||
): integer;
|
||||
var
|
||||
@ -373,6 +389,72 @@ begin
|
||||
inherited SetTopIndex(ACustomListBox, NewTopIndex);
|
||||
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
|
||||
): integer;
|
||||
var
|
||||
@ -447,6 +529,7 @@ end;
|
||||
|
||||
{ TGtk2WSCustomCheckBox }
|
||||
|
||||
|
||||
function TGtk2WSCustomCheckBox.RetrieveState(
|
||||
const ACustomCheckBox: TCustomCheckBox): TCheckBoxState;
|
||||
var
|
||||
@ -477,16 +560,7 @@ begin
|
||||
LockOnChange(GtkObject,-1);
|
||||
end;
|
||||
|
||||
{ TGtk2WSCustomMemo }
|
||||
|
||||
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;
|
||||
{$I gtk2wscustommemo.inc}
|
||||
|
||||
initialization
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user