gtk: move CreateComponent code for TPairSplitter, TScrollBox, TScrollBar to CreateHandle and FinishComponentCreate to SetCallbacks

git-svn-id: trunk@13467 -
This commit is contained in:
paul 2007-12-26 08:52:02 +00:00
parent d922bc6e85
commit 2f0de90ec1
8 changed files with 186 additions and 125 deletions

View File

@ -149,7 +149,6 @@ type
function CreateComponentWidget(Sender: TObject; ACompStyle: Integer; const ACaption: String
): PGtkWidget; virtual; // temporary solution till all are created through createhandle
function CreateAPIWidget(AWinControl: TWinControl): PGtkWidget;
function CreatePairSplitter(PairSplitterObject: TObject): PGtkWidget;
function CreateStatusBar(StatusBar: TObject): PGtkWidget;
function OldCreateStatusBarPanel(StatusBar: TObject; Index: integer): PGtkWidget;
function CreateSimpleClientAreaWidget(Sender: TObject;

View File

@ -7648,7 +7648,7 @@ end;
the client area is associated. If FormWidget=nil then the hbox will be used
as main widget.
-------------------------------------------------------------------------------}
Function CreateFormContents(AForm: TCustomForm;
function CreateFormContents(AForm: TCustomForm;
var FormWidget: Pointer): Pointer;
var
ScrolledWidget, ClientAreaWidget: PGtkWidget;
@ -7674,7 +7674,7 @@ begin
//debugln('CreateFormContents Style=',GetStyleDebugReport(WindowStyle));
gtk_container_add(PGtkContainer(ScrolledWidget), ClientAreaWidget);
gtk_object_set_data(FormWidget,odnScrollArea,ScrolledWidget);
gtk_object_set_data(FormWidget, odnScrollArea, ScrolledWidget);
gtk_widget_show(ClientAreaWidget);
SetFixedWidget(FormWidget, ClientAreaWidget);

View File

@ -4564,27 +4564,6 @@ begin
BorderStyleShadowMap[TCustomControl(AWinControl).BorderStyle]);
end;
{------------------------------------------------------------------------------
function TGtkWidgetSet.CreatePairSplitter(PairSplitterObject: TObject
): PGtkWidget;
Create a TCustomPairSplitter widget set
------------------------------------------------------------------------------}
function TGtkWidgetSet.CreatePairSplitter(PairSplitterObject: TObject
): PGtkWidget;
var
APairSplitter: TCustomPairSplitter;
PanedWidget: PGtkWidget;
begin
APairSplitter:=TCustomPairSplitter(PairSplitterObject);
// create the paned
if APairSplitter.SplitterType=pstHorizontal then
PanedWidget:=gtk_hpaned_new
else
PanedWidget:=gtk_vpaned_new;
Result:=PanedWidget;
end;
{------------------------------------------------------------------------------
function TGtkWidgetSet.CreateStatusBar(StatusBar: TObject): PGtkWidget;
@ -4731,9 +4710,7 @@ end;
function TGTKWidgetSet.CreateComponentWidget(Sender: TObject; ACompStyle: Integer; const ACaption: String): PGtkWidget;
var
p: Pointer absolute Result;
TempWidget,
TempWidget2 : PGTKWidget; // pointer to gtk-widget (local use when neccessary)
Adjustment: PGtkAdjustment;
TempWidget: PGTKWidget; // pointer to gtk-widget (local use when neccessary)
begin
Result := nil;
@ -4764,12 +4741,6 @@ begin
csWinControl: // code moved for TCustomControl
p:=CreateAPIWidget(TWinControl(Sender));
csPairSplitter:
p:=CreatePairSplitter(Sender);
csPairSplitterSide:
P:=CreateSimpleClientAreaWidget(Sender,true);
csPreviewFileControl:
P:=CreateSimpleClientAreaWidget(Sender,true);
@ -4782,20 +4753,6 @@ begin
P := gtk_progress_bar_new_with_adjustment (PGtkAdjustment (TempWidget));
end;
csScrollBar :
begin
Adjustment := PgtkAdjustment(
gtk_adjustment_new(1,TScrollBar(sender).min,
TScrollBar(sender).max,
TScrollBar(sender).SmallChange, TScrollBar(sender).LargeChange,
TScrollBar(sender).Pagesize));
if (TScrollBar(sender).kind = sbHorizontal) then
P := gtk_hscrollbar_new(Adjustment)
else
P := gtk_vscrollbar_new(Adjustment);
gtk_object_set_data(PGTKObject(Adjustment), odnScrollBar, P);
end;
csStatusBar :
begin
p:=CreateStatusBar(Sender);
@ -4812,67 +4769,8 @@ begin
P := gtk_vscale_new (PGTKADJUSTMENT (TempWidget));
gtk_scale_set_digits (PGTKSCALE (P), 0);
end;
csScrollBox :
begin
Assert(Sender is TScrollBox);
p := gtk_frame_new(nil);
gtk_frame_set_shadow_type(pGtkFrame(p),GTK_SHADOW_IN);
TempWidget := gtk_scrolled_window_new(nil,nil);
gtk_container_add(PGTKContainer(p), TempWidget);
gtk_widget_show(TempWidget);
GTK_WIDGET_UNSET_FLAGS(PGtkScrolledWindow(TempWidget)^.hscrollbar, GTK_CAN_FOCUS);
GTK_WIDGET_UNSET_FLAGS(PGtkScrolledWindow(TempWidget)^.vscrollbar, GTK_CAN_FOCUS);
gtk_scrolled_window_set_policy(PGtkScrolledWindow(TempWidget),
GTK_POLICY_NEVER,
GTK_POLICY_NEVER);
gtk_object_set_data(P,odnScrollArea, TempWidget);
Adjustment := gtk_scrolled_window_get_vadjustment(PGTKScrolledWindow(TempWidget));
if Adjustment <> nil
then gtk_object_set_data(PGTKObject(Adjustment), odnScrollBar,
PGTKScrolledWindow(TempWidget)^.vscrollbar);
Adjustment := gtk_scrolled_window_get_hadjustment(PGTKScrolledWindow(TempWidget));
if Adjustment <> nil
then gtk_object_set_data(PGTKObject(Adjustment), odnScrollBar,
PGTKScrolledWindow(TempWidget)^.hscrollbar);
TempWidget2 := gtk_layout_new(nil, nil);
gtk_container_add(PGTKContainer(TempWidget), TempWidget2);
gtk_widget_show(TempWidget2);
SetFixedWidget(p, TempWidget2);
SetMainWidget(p, TempWidget2);
end;
// All obsoletes (some of them may still be in use for gtk1/gtk2, they are overridden there)
csClistBox, csListBox, csCheckListBox,
csArrow,
csCalendar,
csComboBox,
csMemo,
csSpinEdit,
csStaticText,
csPanel,
csMenuItem,
csListView,
csHintWindow,
csGroupBox,
csForm,
csEdit,
csBitBtn,
csButton,
csToggleBox,
csRadioButton,
csPage,
csPopupMenu,
csCheckbox,
csMainMenu: DebugLn('[WARNING] Obsolete call to TGTKOBject.CreateComponent for ', Sender.ClassName);
else
DebugLn('[WARNING] Obsolete call to TGTKOBject.CreateComponent for ', Sender.ClassName);
end; //end case
end;

View File

@ -304,7 +304,10 @@ begin
Widget := PGtkWidget(AWinControl.Handle);
if GtkWidgetIsA(Widget, GTKAPIWidget_GetType) then
GTKAPIWidget_SetShadowType(PGTKAPIWidget(Widget), BorderStyleShadowMap[ABorderStyle]);
GTKAPIWidget_SetShadowType(PGTKAPIWidget(Widget), BorderStyleShadowMap[ABorderStyle])
else
if GTK_IS_FRAME(Widget) then
gtk_frame_set_shadow_type(PGtkFrame(Widget), BorderStyleShadowMap[ABorderStyle]);
end;
class procedure TGtkWSWinControl.SetCallbacks(const AGTKObject: PGTKObject;

View File

@ -44,7 +44,9 @@ type
TGtkWSScrollingWinControl = class(TWSScrollingWinControl)
private
protected
class procedure SetCallbacks(const AWidget: PGtkWidget; const AWidgetInfo: PWidgetInfo); virtual;
public
class function CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLIntfHandle; override;
class procedure ScrollBy(const AWinControl: TScrollingWinControl; const DeltaX, DeltaY: integer); override;
end;
@ -76,8 +78,8 @@ type
TGtkWSCustomForm = class(TWSCustomForm)
private
class procedure SetCallbacks(const AWinControl: TWinControl; const AWidgetInfo: PWidgetInfo); virtual;
protected
class procedure SetCallbacks(const AWinControl: TWinControl; const AWidgetInfo: PWidgetInfo); virtual;
public
class function CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLIntfHandle; override;
@ -127,7 +129,61 @@ type
implementation
{ TGtkWSCustomForm }
class procedure TGtkWSScrollingWinControl.SetCallbacks(
const AWidget: PGtkWidget; const AWidgetInfo: PWidgetInfo);
begin
TGtkWSWinControl.SetCallbacks(PGtkObject(AWidget), TComponent(AWidgetInfo^.LCLObject));
with TGTKWidgetSet(Widgetset) do
begin
SetCallback(LM_HSCROLL, PGtkObject(AWidget), AWidgetInfo^.LCLObject);
SetCallback(LM_VSCROLL, PGtkObject(AWidget), AWidgetInfo^.LCLObject);
end;
end;
class function TGtkWSScrollingWinControl.CreateHandle(
const AWinControl: TWinControl; const AParams: TCreateParams
): TLCLIntfHandle;
var
Scrolled: PGtkScrolledWindow;
Frame: PGtkFrame;
Layout: PGtkWidget;
WidgetInfo: PWidgetInfo;
Adjustment: PGtkAdjustment;
begin
Frame := PGtkFrame(gtk_frame_new(nil));
gtk_frame_set_shadow_type(Frame, BorderStyleShadowMap[TScrollingWinControl(AWinControl).BorderStyle]);
Scrolled := PGtkScrolledWindow(gtk_scrolled_window_new(nil, nil));
gtk_container_add(PGTKContainer(Frame), PGtkWidget(Scrolled));
gtk_widget_show(PGtkWidget(Scrolled));
GTK_WIDGET_UNSET_FLAGS(Scrolled^.hscrollbar, GTK_CAN_FOCUS);
GTK_WIDGET_UNSET_FLAGS(Scrolled^.vscrollbar, GTK_CAN_FOCUS);
gtk_scrolled_window_set_policy(Scrolled, GTK_POLICY_NEVER, GTK_POLICY_NEVER);
gtk_object_set_data(PGtkObject(Frame), odnScrollArea, Scrolled);
{$IFDEF DebugLCLComponents}
DebugGtkWidgets.MarkCreated(Frame, dbgsName(AWinControl));
{$ENDIF}
WidgetInfo := CreateWidgetInfo(Frame, AWinControl, AParams);
Adjustment := gtk_scrolled_window_get_vadjustment(Scrolled);
if Adjustment <> nil then
gtk_object_set_data(PGTKObject(Adjustment), odnScrollBar, Scrolled^.vscrollbar);
Adjustment := gtk_scrolled_window_get_hadjustment(Scrolled);
if Adjustment <> nil then
gtk_object_set_data(PGTKObject(Adjustment), odnScrollBar, Scrolled^.hscrollbar);
Layout := gtk_layout_new(nil, nil);
gtk_container_add(PGTKContainer(Scrolled), Layout);
gtk_widget_show(Layout);
SetFixedWidget(Frame, Layout);
SetMainWidget(Frame, Layout);
Result := TLCLIntfHandle(PtrUInt(Frame));
SetCallBacks(PGtkWidget(Frame), WidgetInfo);
end;
class procedure TGtkWSScrollingWinControl.ScrollBy(const AWinControl: TScrollingWinControl;
const DeltaX, DeltaY: integer);

View File

@ -32,26 +32,31 @@ uses
{$ELSE}
Gtk, //Glib, Gdk,
{$ENDIF}
GtkWSPrivate,
Controls, PairSplitter,
GtkWSPrivate, GtkInt, GtkDef, GtkProc, GtkWSControls,
Classes, Controls, LCLType, PairSplitter,
WSPairSplitter, WSLCLClasses, WSProc;
type
{ TGtkWSPairSplitterSide }
TGtkWSPairSplitterSide = class(TWSPairSplitterSide)
private
protected
protected
class procedure SetCallbacks(const AGtkWidget: PGtkWidget; const AWidgetInfo: PWidgetInfo); virtual;
public
class function CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLIntfHandle; override;
end;
{ TGtkWSCustomPairSplitter }
TGtkWSCustomPairSplitter = class(TWSCustomPairSplitter)
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 AddSide(ASplitter: TCustomPairSplitter; ASide: TPairSplitterSide; Side: integer): Boolean; override;
class function SetPosition(ASplitter: TCustomPairSplitter; var NewPosition: integer): Boolean; override;
// special cursor handling
@ -72,10 +77,39 @@ implementation
{ TGtkWSCustomPairSplitter }
class procedure TGtkWSCustomPairSplitter.SetCallbacks(
const AGtkWidget: PGtkWidget; const AWidgetInfo: PWidgetInfo);
begin
TGtkWSWinControl.SetCallbacks(PGtkObject(AGtkWidget), TComponent(AWidgetInfo^.LCLObject));
end;
class function TGtkWSCustomPairSplitter.CreateHandle(
const AWinControl: TWinControl; const AParams: TCreateParams
): TLCLIntfHandle;
var
Widget: PGtkWidget;
WidgetInfo: PWidgetInfo;
begin
// create the paned
if TCustomPairSplitter(AWinControl).SplitterType = pstHorizontal then
Widget := gtk_hpaned_new
else
Widget := gtk_vpaned_new;
{$IFDEF DebugLCLComponents}
DebugGtkWidgets.MarkCreated(Widget, dbgsName(AWinControl));
{$ENDIF}
Result := TLCLIntfHandle(PtrUInt(Widget));
WidgetInfo := CreateWidgetInfo(Widget, AWinControl, AParams);
SetCallBacks(Widget, WidgetInfo);
end;
class function TGtkWSCustomPairSplitter.AddSide(ASplitter: TCustomPairSplitter;
ASide: TPairSplitterSide; Side: integer): Boolean;
begin
Result:=false;
Result := False;
if not (WSCheckHandleAllocated(ASplitter, 'AddSide - splitter') and
WSCheckHandleAllocated(ASide, 'AddSide - side'))
@ -83,24 +117,24 @@ begin
if (Side<0) or (Side>1) then exit;
if Side=0 then
if Side = 0 then
gtk_paned_add1(PGtkPaned(ASplitter.Handle),PGtkWidget(ASide.Handle))
else
gtk_paned_add2(PGtkPaned(ASPlitter.Handle),PGtkWidget(ASide.Handle));
Result:=true;
Result := True;
end;
class function TGtkWSCustomPairSplitter.SetPosition(
ASplitter: TCustomPairSplitter; var NewPosition: integer): Boolean;
begin
Result:=false;
Result := False;
if not WSCheckHandleAllocated(ASplitter, 'SetPosition')
then Exit;
if NewPosition>=0 then
gtk_paned_set_position(PGtkPaned(ASplitter.Handle),NewPosition);
NewPosition:=PGtkPaned(ASplitter.Handle)^.child1_size;
Result:=true;
gtk_paned_set_position(PGtkPaned(ASplitter.Handle), NewPosition);
NewPosition := PGtkPaned(ASplitter.Handle)^.child1_size;
Result := True;
end;
class function TGtkWSCustomPairSplitter.GetSplitterCursor(
@ -115,6 +149,36 @@ begin
Result := False;
end;
{ TGtkWSPairSplitterSide }
class procedure TGtkWSPairSplitterSide.SetCallbacks(
const AGtkWidget: PGtkWidget; const AWidgetInfo: PWidgetInfo);
begin
TGtkWSWinControl.SetCallbacks(PGtkObject(AGtkWidget), TComponent(AWidgetInfo^.LCLObject));
end;
class function TGtkWSPairSplitterSide.CreateHandle(
const AWinControl: TWinControl; const AParams: TCreateParams
): TLCLIntfHandle;
var
Widget: PGtkWidget;
WidgetInfo: PWidgetInfo;
begin
Widget := GtkWidgetset.CreateSimpleClientAreaWidget(AWinControl, True);
{$IFDEF DebugLCLComponents}
DebugGtkWidgets.MarkCreated(Widget, dbgsName(AWinControl));
{$ENDIF}
Result := TLCLIntfHandle(PtrUInt(Widget));
WidgetInfo := GetWidgetInfo(Widget);
WidgetInfo^.LCLObject := AWinControl;
WidgetInfo^.Style := AParams.Style;
WidgetInfo^.ExStyle := AParams.ExStyle;
WidgetInfo^.WndProc := PtrUInt(AParams.WindowClass.lpfnWndProc);
SetCallBacks(Widget, WidgetInfo);
end;
initialization
////////////////////////////////////////////////////
@ -123,7 +187,7 @@ initialization
// To improve speed, register only classes
// which actually implement something
////////////////////////////////////////////////////
// RegisterWSComponent(TPairSplitterSide, TGtkWSPairSplitterSide);
RegisterWSComponent(TPairSplitterSide, TGtkWSPairSplitterSide);
RegisterWSComponent(TCustomPairSplitter, TGtkWSCustomPairSplitter, TGtkPrivatePaned);
// RegisterWSComponent(TPairSplitter, TGtkWSPairSplitter);
////////////////////////////////////////////////////

View File

@ -28,7 +28,7 @@ interface
uses
Classes, SysUtils, Math,
LCLType, LMessages, LCLProc, Controls, Graphics, StdCtrls,
LCLType, LMessages, LCLProc, Controls, Graphics, StdCtrls, Forms,
{$IFDEF gtk2}
glib2, gdk2pixbuf, gdk2, gtk2, Pango, Gtk2WSPrivate,
{$ELSE}
@ -46,7 +46,9 @@ type
TGtkWSScrollBar = class(TWSScrollBar)
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 procedure SetParams(const AScrollBar: TCustomScrollBar); override;
end;
@ -375,6 +377,45 @@ end;
{ TGtkWSScrollBar }
class procedure TGtkWSScrollBar.SetCallbacks(const AGtkWidget: PGtkWidget;
const AWidgetInfo: PWidgetInfo);
begin
TGtkWSWinControl.SetCallbacks(PGtkObject(AGtkWidget), TComponent(AWidgetInfo^.LCLObject));
if TScrollBar(AWidgetInfo^.LCLObject).Kind = sbHorizontal then
TGtkWidgetset(Widgetset).SetCallback(LM_HSCROLL, PGtkObject(AGtkWidget), AWidgetInfo^.LCLObject)
else
TGtkWidgetset(Widgetset).SetCallback(LM_VSCROLL, PGtkObject(AGtkWidget), AWidgetInfo^.LCLObject);
end;
class function TGtkWSScrollBar.CreateHandle(const AWinControl: TWinControl;
const AParams: TCreateParams): TLCLIntfHandle;
var
Adjustment: PgtkAdjustment;
Widget: PGtkWidget;
WidgetInfo: PWidgetInfo;
begin
with TScrollBar(AWinControl) do
begin
Adjustment := PgtkAdjustment(
gtk_adjustment_new(1, Min, Max, SmallChange, LargeChange,
Pagesize));
if (Kind = sbHorizontal) then
Widget := gtk_hscrollbar_new(Adjustment)
else
Widget := gtk_vscrollbar_new(Adjustment);
end;
gtk_object_set_data(PGTKObject(Adjustment), odnScrollBar, Widget);
Result := TLCLIntfHandle(PtrUInt(Widget));
{$IFDEF DebugLCLComponents}
DebugGtkWidgets.MarkCreated(Widget, dbgsName(AWinControl));
{$ENDIF}
WidgetInfo := CreateWidgetInfo(Pointer(Result), AWinControl, AParams);
SetCallbacks(Widget, WidgetInfo);
end;
class procedure TGtkWSScrollBar.SetParams(const AScrollBar: TCustomScrollBar);
var
Adjustment: PGtkAdjustment;

View File

@ -175,7 +175,7 @@ begin
if GTK_IS_SCROLLED_WINDOW(Widget) then
gtk_scrolled_window_set_shadow_type(PGtkScrolledWindow(Widget), BorderStyleShadowMap[ABorderStyle])
else
TWSWinControlClass(ClassParent).SetBorderStyle(AWinControl, ABorderStyle);
TGtkWSWinControl{(ClassParent)}.SetBorderStyle(AWinControl, ABorderStyle);
end;
initialization