diff options
Diffstat (limited to 'libgtk_kylix/GTKExtCtrls.pas')
| -rw-r--r-- | libgtk_kylix/GTKExtCtrls.pas | 77 |
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; (********************************************************************************************************************************) |
