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;
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
LockOnChange(PGtkObject(p),+1);
gtk_entry_set_text(pGtkEntry(P), pLabel);

View File

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

View File

@ -80,10 +80,15 @@ type
TGtk2WSCustomGroupBox = class(TGtkWSCustomGroupBox)
published
class function CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLIntfHandle; override;
class function GetDefaultClientRect(const AWinControl: TWinControl;
const aLeft, aTop, aWidth, aHeight: integer; var aClientRect: TRect
): 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 SetText(const AWinControl: TWinControl; const AText: string); override;
end;
{ TGtk2WSGroupBox }
@ -1673,6 +1678,57 @@ end;
{ 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(
const AWinControl: TWinControl; const aLeft, aTop, aWidth, aHeight: integer;
var aClientRect: TRect): boolean;
@ -1693,6 +1749,30 @@ begin
//if Result then DebugLn(['TGtk2WSCustomGroupBox.GetDefaultClientRect END FrameBorders=',dbgs(FrameBorders),' aClientRect=',dbgs(aClientRect)]);
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;
const AFont: TFont);
var
@ -1711,6 +1791,16 @@ begin
inherited SetFont(AWinControl, AFont);
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;
var
Msg: TLMessage;