gtk: split gtk1 and gtk2 groupbox code

git-svn-id: trunk@20288 -
This commit is contained in:
paul 2009-05-29 02:27:30 +00:00
parent 6cb0aa7f54
commit 50ad4d8937
3 changed files with 107 additions and 54 deletions

View File

@ -632,23 +632,6 @@ begin
end; end;
end; end;
csGroupBox:
{$IFDEF Gtk1}
if AText <> '' then
gtk_frame_set_label(pgtkFrame(P), pLabel)
else
gtk_frame_set_label(pgtkFrame(P), nil);
{$ELSE}
begin
aLabel := Ampersands2Underscore(pLabel);
try
gtk_label_set_text_with_mnemonic(PGtkLabel(gtk_frame_get_label_widget(pgtkFrame(P))), aLabel);
finally
StrDispose(aLabel);
end;
end;
{$ENDIF}
csEdit : begin csEdit : begin
LockOnChange(PGtkObject(p),+1); LockOnChange(PGtkObject(p),+1);
gtk_entry_set_text(pGtkEntry(P), pLabel); gtk_entry_set_text(pGtkEntry(P), pLabel);

View File

@ -60,10 +60,13 @@ type
protected protected
class procedure SetCallbacks(const AGtkWidget: PGtkWidget; const AWidgetInfo: PWidgetInfo); virtual; class procedure SetCallbacks(const AGtkWidget: PGtkWidget; const AWidgetInfo: PWidgetInfo); virtual;
published published
class function CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLIntfHandle; override; {$ifdef gtk1}
class function CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLIntfHandle; override;
class procedure GetPreferredSize(const AWinControl: TWinControl; class procedure GetPreferredSize(const AWinControl: TWinControl;
var PreferredWidth, PreferredHeight: integer; var PreferredWidth, PreferredHeight: integer;
WithThemeSpace: Boolean); override; WithThemeSpace: Boolean); override;
class procedure SetText(const AWinControl: TWinControl; const AText: string); override;
{$endif}
end; end;
{ TGtkWSGroupBox } { TGtkWSGroupBox }
@ -1911,50 +1914,25 @@ begin
TGtkWSWinControl.SetCallbacks(PGtkObject(AGtkWidget), TComponent(AWidgetInfo^.LCLObject)); TGtkWSWinControl.SetCallbacks(PGtkObject(AGtkWidget), TComponent(AWidgetInfo^.LCLObject));
end; end;
{$ifdef gtk1}
class function TGtkWSCustomGroupBox.CreateHandle( class function TGtkWSCustomGroupBox.CreateHandle(
const AWinControl: TWinControl; const AParams: TCreateParams): TLCLIntfHandle; const AWinControl: TWinControl; const AParams: TCreateParams): TLCLIntfHandle;
var var
{$if not defined(gtk1) and not defined(GtkFixedWithWindow)}
EventBox: PGtkWidget;
{$endif}
TempWidget: PGTKWidget; // pointer to gtk-widget (local use when neccessary) TempWidget: PGTKWidget; // pointer to gtk-widget (local use when neccessary)
p : pointer; // ptr to the newly created GtkWidget p : pointer; // ptr to the newly created GtkWidget
{$IFDEF Gtk2}
L : PGTKWidget;
{$ENDIF}
Allocation: TGTKAllocation; Allocation: TGTKAllocation;
WidgetInfo: PWidgetInfo; WidgetInfo: PWidgetInfo;
begin begin
{$IFDEF Gtk1}
if AParams.Caption <> '' then if AParams.Caption <> '' then
P := gtk_frame_new(AParams.Caption) P := gtk_frame_new(AParams.Caption)
else else
P := gtk_frame_new(nil); P := gtk_frame_new(nil);
{$ELSE}
L := gtk_label_new(AParams.Caption);
gtk_widget_show(L);
P := gtk_frame_new(nil);
gtk_frame_set_label_widget(GTK_FRAME(P), GTK_WIDGET(L));
{$ENDIF}
WidgetInfo := CreateWidgetInfo(P, AWinControl, AParams); WidgetInfo := CreateWidgetInfo(P, AWinControl, AParams);
{$if defined(gtk1) or defined(GtkFixedWithWindow)}
TempWidget := CreateFixedClientWidget; TempWidget := CreateFixedClientWidget;
gtk_container_add(GTK_CONTAINER(p), TempWidget); gtk_container_add(GTK_CONTAINER(p), TempWidget);
WidgetInfo^.ClientWidget := TempWidget; WidgetInfo^.ClientWidget := TempWidget;
WidgetInfo^.CoreWidget := TempWidget; WidgetInfo^.CoreWidget := TempWidget;
gtk_object_set_data(PGtkObject(TempWidget), 'widgetinfo', WidgetInfo); gtk_object_set_data(PGtkObject(TempWidget), 'widgetinfo', WidgetInfo);
{$else}
EventBox := gtk_event_box_new;
gtk_event_box_set_visible_window(PGtkEventBox(EventBox), False);
TempWidget := CreateFixedClientWidget(False);
gtk_container_add(GTK_CONTAINER(EventBox), TempWidget);
gtk_container_add(GTK_CONTAINER(p), EventBox);
gtk_widget_show(EventBox);
WidgetInfo^.ClientWidget := TempWidget;
WidgetInfo^.CoreWidget := EventBox;
gtk_object_set_data(PGtkObject(TempWidget), 'widgetinfo', WidgetInfo);
gtk_object_set_data(PGtkObject(EventBox), 'widgetinfo', WidgetInfo);
{$endif}
gtk_widget_show(TempWidget); gtk_widget_show(TempWidget);
gtk_widget_show(P); gtk_widget_show(P);
@ -1979,17 +1957,9 @@ begin
Widget := PGtkWidget(AWinControl.Handle); Widget := PGtkWidget(AWinControl.Handle);
PreferredWidth := (gtk_widget_get_xthickness(Widget)) * 2 PreferredWidth := (gtk_widget_get_xthickness(Widget)) * 2
{$ifdef gtk1}
+PGtkFrame(Widget)^.label_width; +PGtkFrame(Widget)^.label_width;
{$else}
+gtk_widget_get_xthickness(PGtkFrame(Widget)^.label_widget);
{$endif}
PreferredHeight := Max(gtk_widget_get_ythickness(Widget), PreferredHeight := Max(gtk_widget_get_ythickness(Widget),
{$ifdef gtk1}
PGtkFrame(Widget)^.label_height) PGtkFrame(Widget)^.label_height)
{$else}
gtk_widget_get_ythickness(PGtkFrame(Widget)^.label_widget))
{$endif}
+ gtk_widget_get_ythickness(Widget); + gtk_widget_get_ythickness(Widget);
if WithThemeSpace then begin if WithThemeSpace then begin
@ -1998,9 +1968,19 @@ begin
inc(PreferredWidth, border_width); inc(PreferredWidth, border_width);
inc(PreferredHeight,2*border_width); inc(PreferredHeight,2*border_width);
end; end;
//debugln('TGtkWSCustomGroupBox.GetPreferredSize ',DbgSName(AWinControl),' PreferredWidth=',dbgs(PreferredWidth),' PreferredHeight=',dbgs(PreferredHeight));
end; end;
class procedure TGtkWSCustomGroupBox.SetText(const AWinControl: TWinControl;
const AText: string);
begin
if not WSCheckHandleAllocated(AWinControl, 'SetText') then Exit;
if AText <> '' then
gtk_frame_set_label(PGtkFrame(AWinControl.Handle), PChar(AText))
else
gtk_frame_set_label(PGtkFrame(AWinControl.Handle), nil);
end;
{$endif}
{ TGtkWSRadioButton } { TGtkWSRadioButton }
class function TGtkWSRadioButton.CreateHandle(const AWinControl: TWinControl; class function TGtkWSRadioButton.CreateHandle(const AWinControl: TWinControl;

View File

@ -80,10 +80,15 @@ type
TGtk2WSCustomGroupBox = class(TGtkWSCustomGroupBox) TGtk2WSCustomGroupBox = class(TGtkWSCustomGroupBox)
published published
class function CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLIntfHandle; override;
class function GetDefaultClientRect(const AWinControl: TWinControl; class function GetDefaultClientRect(const AWinControl: TWinControl;
const aLeft, aTop, aWidth, aHeight: integer; var aClientRect: TRect const aLeft, aTop, aWidth, aHeight: integer; var aClientRect: TRect
): boolean; override; ): boolean; override;
class procedure GetPreferredSize(const AWinControl: TWinControl;
var PreferredWidth, PreferredHeight: integer;
WithThemeSpace: Boolean); override;
class procedure SetFont(const AWinControl: TWinControl; const AFont: TFont); override; class procedure SetFont(const AWinControl: TWinControl; const AFont: TFont); override;
class procedure SetText(const AWinControl: TWinControl; const AText: string); override;
end; end;
{ TGtk2WSGroupBox } { TGtk2WSGroupBox }
@ -1673,6 +1678,57 @@ end;
{ TGtk2WSCustomGroupBox } { TGtk2WSCustomGroupBox }
class function TGtk2WSCustomGroupBox.CreateHandle(
const AWinControl: TWinControl; const AParams: TCreateParams
): TLCLIntfHandle;
var
{$if not defined(GtkFixedWithWindow)}
EventBox: PGtkWidget;
{$endif}
TempWidget: PGTKWidget; // pointer to gtk-widget (local use when neccessary)
p : pointer; // ptr to the newly created GtkWidget
L : PGTKWidget;
Allocation: TGTKAllocation;
WidgetInfo: PWidgetInfo;
begin
L := gtk_label_new(AParams.Caption);
gtk_widget_show(L);
P := gtk_frame_new(nil);
gtk_frame_set_label_widget(GTK_FRAME(P), GTK_WIDGET(L));
WidgetInfo := CreateWidgetInfo(P, AWinControl, AParams);
{$if defined(GtkFixedWithWindow)}
TempWidget := CreateFixedClientWidget;
gtk_container_add(GTK_CONTAINER(p), TempWidget);
WidgetInfo^.ClientWidget := TempWidget;
WidgetInfo^.CoreWidget := TempWidget;
gtk_object_set_data(PGtkObject(TempWidget), 'widgetinfo', WidgetInfo);
{$else}
EventBox := gtk_event_box_new;
gtk_event_box_set_visible_window(PGtkEventBox(EventBox), False);
TempWidget := CreateFixedClientWidget(False);
gtk_container_add(GTK_CONTAINER(EventBox), TempWidget);
gtk_container_add(GTK_CONTAINER(p), EventBox);
gtk_widget_show(EventBox);
WidgetInfo^.ClientWidget := TempWidget;
WidgetInfo^.CoreWidget := EventBox;
gtk_object_set_data(PGtkObject(TempWidget), 'widgetinfo', WidgetInfo);
gtk_object_set_data(PGtkObject(EventBox), 'widgetinfo', WidgetInfo);
{$endif}
gtk_widget_show(TempWidget);
gtk_widget_show(P);
Result := TLCLIntfHandle(PtrUInt(P));
Allocation.X := AParams.X;
Allocation.Y := AParams.Y;
Allocation.Width := AParams.Width;
Allocation.Height := AParams.Height;
gtk_widget_size_allocate(P, @Allocation);
Set_RC_Name(AWinControl, P);
SetCallbacks(P, WidgetInfo);
end;
class function TGtk2WSCustomGroupBox.GetDefaultClientRect( class function TGtk2WSCustomGroupBox.GetDefaultClientRect(
const AWinControl: TWinControl; const aLeft, aTop, aWidth, aHeight: integer; const AWinControl: TWinControl; const aLeft, aTop, aWidth, aHeight: integer;
var aClientRect: TRect): boolean; var aClientRect: TRect): boolean;
@ -1693,6 +1749,30 @@ begin
//if Result then DebugLn(['TGtk2WSCustomGroupBox.GetDefaultClientRect END FrameBorders=',dbgs(FrameBorders),' aClientRect=',dbgs(aClientRect)]); //if Result then DebugLn(['TGtk2WSCustomGroupBox.GetDefaultClientRect END FrameBorders=',dbgs(FrameBorders),' aClientRect=',dbgs(aClientRect)]);
end; end;
class procedure TGtk2WSCustomGroupBox.GetPreferredSize(
const AWinControl: TWinControl; var PreferredWidth, PreferredHeight: integer;
WithThemeSpace: Boolean);
var
Widget: PGtkWidget;
border_width: Integer;
begin
Widget := PGtkWidget(AWinControl.Handle);
PreferredWidth := gtk_widget_get_xthickness(Widget) * 2 +
gtk_widget_get_xthickness(PGtkFrame(Widget)^.label_widget);
PreferredHeight := Max(gtk_widget_get_ythickness(Widget),
gtk_widget_get_ythickness(PGtkFrame(Widget)^.label_widget)) +
gtk_widget_get_ythickness(Widget);
if WithThemeSpace then
begin
border_width := (PGtkContainer(Widget)^.flag0 and bm_TGtkContainer_border_width) shr
bp_TGtkContainer_border_width;
inc(PreferredWidth, border_width);
inc(PreferredHeight, 2 * border_width);
end;
end;
class procedure TGtk2WSCustomGroupBox.SetFont(const AWinControl: TWinControl; class procedure TGtk2WSCustomGroupBox.SetFont(const AWinControl: TWinControl;
const AFont: TFont); const AFont: TFont);
var var
@ -1711,6 +1791,16 @@ begin
inherited SetFont(AWinControl, AFont); inherited SetFont(AWinControl, AFont);
end; end;
class procedure TGtk2WSCustomGroupBox.SetText(const AWinControl: TWinControl;
const AText: string);
var
AFrame: PGtkFrame;
begin
if not WSCheckHandleAllocated(AWinControl, 'SetText') then Exit;
AFrame := PGtkFrame(AWinControl.Handle);
Gtk2Widgetset.SetLabelCaption(PGtkLabel(gtk_frame_get_label_widget(AFrame)), ATExt);
end;
function Gtk2WSButton_Clicked(AWidget: PGtkWidget; AInfo: PWidgetInfo): GBoolean; cdecl; function Gtk2WSButton_Clicked(AWidget: PGtkWidget; AInfo: PWidgetInfo): GBoolean; cdecl;
var var
Msg: TLMessage; Msg: TLMessage;