* 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/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

View File

@ -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;

View File

@ -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;

View File

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

View File

@ -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

View File

@ -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

View File

@ -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.

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,
// 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