summaryrefslogtreecommitdiff
path: root/libgtk_kylix/GTKExtCtrls.pas
diff options
context:
space:
mode:
Diffstat (limited to 'libgtk_kylix/GTKExtCtrls.pas')
-rw-r--r--libgtk_kylix/GTKExtCtrls.pas77
1 files changed, 66 insertions, 11 deletions
diff --git a/libgtk_kylix/GTKExtCtrls.pas b/libgtk_kylix/GTKExtCtrls.pas
index 4cb925e..0adfc1a 100644
--- a/libgtk_kylix/GTKExtCtrls.pas
+++ b/libgtk_kylix/GTKExtCtrls.pas
@@ -23,7 +23,7 @@ unit GTKExtCtrls;
interface
-uses lazglib2, lazgobject2, lazgtk3, Classes, GTKControls, GTKStdCtrls, GTKMenus;
+uses lazglib2, lazgobject2, lazgdk3, lazgtk3, Classes, GTKControls, GTKStdCtrls, GTKMenus;
type
@@ -74,12 +74,17 @@ type
(****************************************** TGTKPANED ***************************************************************************)
TGTKPaned = class(TGTKContainer)
private
+ FPositionChangedSignalHandler: gulong;
+ FButtonPressSignalHandler: gulong;
FChild1, FChild2: TGTKControl;
- FOnResize: TNotifyEvent;
+ FOnPositionChanged: TNotifyEvent;
+ FHandlePopupMenu: TGTKControl;
function GetPosition: integer;
procedure SetPosition(Value: integer);
procedure SetChild1(Value: TGTKControl);
procedure SetChild2(Value: TGTKControl);
+ procedure SetOnPositionChanged(Value: TNotifyEvent);
+ procedure SetHandlePopupMenu(Value: TGTKControl);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
@@ -87,7 +92,8 @@ type
property Child1: TGTKControl read FChild1 write SetChild1;
property Child2: TGTKControl read FChild2 write SetChild2;
property Position: integer read GetPosition write SetPosition;
- property OnResize: TNotifyEvent read FOnResize write FOnResize;
+ property OnPositionChanged: TNotifyEvent read FOnPositionChanged write SetOnPositionChanged;
+ property HandlePopupMenu: TGTKControl read FHandlePopupMenu write SetHandlePopupMenu;
end;
(****************************************** TGTKHPANED **************************************************************************)
@@ -317,15 +323,13 @@ end;
(********************************************************************************************************************************)
(********************************************************************************************************************************)
-
-procedure TGTKPaned_resize(widget : PGtkWidget; allocation : PGtkAllocation; user_data : gpointer); cdecl;
-begin
- if Assigned(TGTKPaned(user_data).FOnResize) then TGTKPaned(user_data).FOnResize(TGTKPaned(user_data));
-end;
-
constructor TGTKPaned.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
+ FPositionChangedSignalHandler := 0;
+ FButtonPressSignalHandler := 0;
+ FOnPositionChanged := nil;
+ FHandlePopupMenu := nil;
FChild1 := nil;
FChild2 := nil;
end;
@@ -338,7 +342,6 @@ end;
procedure TGTKPaned.SetChild1(Value: TGTKControl);
begin
gtk_paned_pack1(PGtkPaned(FWidget), Value.FWidget, True, False);
- g_signal_connect_data(PGObject(Value.FWidget), 'size-allocate', TGCallback(@TGTKPaned_resize), Self, nil, G_CONNECT_DEFAULT);
end;
procedure TGTKPaned.SetChild2(Value: TGTKControl);
@@ -346,14 +349,66 @@ begin
gtk_paned_pack2(PGtkPaned(FWidget), Value.FWidget, True, False);
end;
+// Returns -1 if position has not been changed yet
function TGTKPaned.GetPosition: integer;
+var position_set: gboolean;
begin
- Result := gtk_paned_get_position(PGtkPaned(FWidget));
+ Result := -1;
+ position_set := False;
+ g_object_get(PGObject(FWidget), 'position-set', [@position_set, nil]);
+ if position_set then
+ Result := gtk_paned_get_position(PGtkPaned(FWidget));
end;
procedure TGTKPaned.SetPosition(Value: integer);
begin
+ if FPositionChangedSignalHandler > 0 then
+ g_signal_handler_block(FWidget, FPositionChangedSignalHandler);
gtk_paned_set_position(PGtkPaned(FWidget), Value);
+ if FPositionChangedSignalHandler > 0 then
+ g_signal_handler_unblock(FWidget, FPositionChangedSignalHandler);
+end;
+
+procedure TGTKPaned_resize(widget : PGtkWidget; pspec: PGParamSpec; user_data : gpointer); cdecl;
+begin
+ if Assigned(TGTKPaned(user_data).FOnPositionChanged) then TGTKPaned(user_data).FOnPositionChanged(TGTKPaned(user_data));
+end;
+
+procedure TGTKPaned.SetOnPositionChanged(Value: TNotifyEvent);
+begin
+ if @FOnPositionChanged <> @Value then begin
+ FOnPositionChanged := Value;
+ if Assigned(Value) then begin
+ if FPositionChangedSignalHandler = 0 then
+ FPositionChangedSignalHandler := g_signal_connect_data(PGObject(FWidget), 'notify::position', TGCallback(@TGTKPaned_resize), Self, nil, G_CONNECT_DEFAULT);
+ end else begin
+ g_signal_handler_disconnect(PGObject(FWidget), FPositionChangedSignalHandler);
+ FPositionChangedSignalHandler := 0;
+ end;
+ end;
+end;
+
+function TGTKPaned_button_press_event(widget: PGtkWidget; event: PGdkEventButton; user_data: gpointer):gboolean; cdecl;
+begin
+ if (event^.button = 3) and Assigned(TGTKPaned(user_data).FHandlePopupMenu) and
+ (event^.window = gtk_paned_get_handle_window(PGtkPaned(widget)))
+ then begin
+ gtk_menu_popup(PGtkMenu(TGTKMenuItem(TGTKPaned(user_data).FHandlePopupMenu).FMenu), nil, nil, nil, nil, event^.button, event^.time);
+ Result := True;
+ end;
+end;
+
+procedure TGTKPaned.SetHandlePopupMenu(Value: TGTKControl);
+begin
+ if FHandlePopupMenu <> Value then begin
+ FHandlePopupMenu := Value;
+ if not Assigned(Value) then begin
+ g_signal_handler_disconnect(PGObject(FWidget), FButtonPressSignalHandler);
+ FButtonPressSignalHandler := 0;
+ end else
+ if FButtonPressSignalHandler = 0
+ then FButtonPressSignalHandler := g_signal_connect_data(PGObject(FWidget), 'button-press-event', TGCallback(@TGTKPaned_button_press_event), Self, nil, G_CONNECT_DEFAULT)
+ end;
end;
(********************************************************************************************************************************)