diff --git a/.gitattributes b/.gitattributes
index 6e7a4f86a2..98d501248d 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -5640,6 +5640,7 @@ lcl/interfaces/customdrawn/customdrawnwsforms_cocoa.inc svneol=native#text/pasca
lcl/interfaces/customdrawn/customdrawnwsforms_win.inc svneol=native#text/pascal
lcl/interfaces/customdrawn/customdrawnwsforms_x11.inc svneol=native#text/pascal
lcl/interfaces/customdrawn/customdrawnwslazdeviceapis.pas svneol=native#text/pascal
+lcl/interfaces/customdrawn/customdrawnwsspin.pas svneol=native#text/pascal
lcl/interfaces/customdrawn/customdrawnwsstdctrls.pas svneol=native#text/pascal
lcl/interfaces/customdrawn/interfaces.pas svneol=native#text/pascal
lcl/interfaces/customdrawn/wincallback.inc svneol=native#text/pascal
diff --git a/lcl/interfaces/customdrawn/customdrawnprivate.pas b/lcl/interfaces/customdrawn/customdrawnprivate.pas
index a3866fefa9..aa0bafc794 100644
--- a/lcl/interfaces/customdrawn/customdrawnprivate.pas
+++ b/lcl/interfaces/customdrawn/customdrawnprivate.pas
@@ -9,7 +9,8 @@ uses
Types, Classes, SysUtils,
// LCL
Controls, Graphics, stdctrls, extctrls, comctrls,
- customdrawnproc, customdrawncontrols, lcltype, lclproc, lclintf;
+ customdrawnproc, customdrawncontrols, lcltype, lclproc, lclintf,
+ spin;
type
@@ -37,6 +38,11 @@ type
LCLControl: TCustomComboBox;
end;
+ TCDIntfScrollBar = class(TCDScrollBar)
+ public
+ LCLControl: TCustomScrollBar;
+ end;
+
// Additional Tab
TCDIntfStaticText = class(TCDProgressBar)
@@ -61,6 +67,13 @@ type
LCLControl: TCustomTabControl;
end;
+ // Misc
+
+ TCDIntfSpinEdit = class(TCDSpinEdit)
+ public
+ LCLControl: TCustomFloatSpinEdit;
+ end;
+
// These are default message handlers which backends might use to simplify their code
// They convert a message sent to the form into a message to the correct sub-control
procedure CallbackMouseUp(AWindowHandle: TCDForm; x, y: Integer; Button: TMouseButton; ShiftState: TShiftState = []);
diff --git a/lcl/interfaces/customdrawn/customdrawnwsfactory.pas b/lcl/interfaces/customdrawn/customdrawnwsfactory.pas
index 070429e239..4174090bf6 100644
--- a/lcl/interfaces/customdrawn/customdrawnwsfactory.pas
+++ b/lcl/interfaces/customdrawn/customdrawnwsfactory.pas
@@ -112,8 +112,8 @@ uses
CustomDrawnWSExtCtrls,
CustomDrawnWSForms,
{ WinCEWSImgList,
- WinCEWSMenus,
- WinCEWSSpin,}
+ WinCEWSMenus,}
+ CustomDrawnWSSpin,
CustomDrawnWSStdCtrls,
CustomDrawnWSLazDeviceAPIs{,
WinCEWSGrids};
@@ -268,8 +268,8 @@ end;
// StdCtrls
function RegisterCustomScrollBar: Boolean; alias : 'WSRegisterCustomScrollBar';
begin
-// RegisterWSComponent(TCustomScrollBar, TWinCEWSScrollBar);
- Result := False;
+ RegisterWSComponent(TCustomScrollBar, TCDWSScrollBar);
+ Result := True;
end;
function RegisterCustomGroupBox: Boolean; alias : 'WSRegisterCustomGroupBox';
@@ -547,8 +547,8 @@ end;
function RegisterCustomFloatSpinEdit: Boolean; alias : 'WSRegisterCustomFloatSpinEdit';
begin
-// RegisterWSComponent(TCustomFloatSpinEdit, TWinCEWSCustomFloatSpinEdit);
- Result := False;
+ RegisterWSComponent(TCustomFloatSpinEdit, TCDWSCustomFloatSpinEdit);
+ Result := True;
end;
function RegisterCustomRubberBand: Boolean; alias : 'WSRegisterCustomRubberBand';
diff --git a/lcl/interfaces/customdrawn/customdrawnwsspin.pas b/lcl/interfaces/customdrawn/customdrawnwsspin.pas
new file mode 100644
index 0000000000..c077358f3b
--- /dev/null
+++ b/lcl/interfaces/customdrawn/customdrawnwsspin.pas
@@ -0,0 +1,139 @@
+{
+ *****************************************************************************
+ * QtWSSpin.pp *
+ * ----------- *
+ * *
+ * *
+ *****************************************************************************
+
+ *****************************************************************************
+ * *
+ * This file is part of the Lazarus Component Library (LCL) *
+ * *
+ * See the file COPYING.modifiedLGPL.txt, included in this distribution, *
+ * for details about the copyright. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
+ * *
+ *****************************************************************************
+}
+unit customdrawnwsspin;
+
+{$mode objfpc}{$H+}
+
+interface
+
+{$I customdrawndefines.inc}
+
+uses
+ // RTL
+
+ // LCL
+ Spin, SysUtils, Controls, Classes, LCLType, LCLProc, LCLIntf, Forms,
+ customdrawncontrols,
+ // Widgetset
+ WSProc, WSSpin, WSLCLClasses, CustomDrawnWsControls, customdrawnproc,
+ customdrawnprivate;
+
+type
+
+ { TCDWSCustomFloatSpinEdit }
+
+ TCDWSCustomFloatSpinEdit = class(TWSCustomFloatSpinEdit)
+ public
+ class procedure InjectCDControl(const AWinControl: TWinControl; var ACDControlField: TCDControl);
+ published
+ class function CreateHandle(const AWinControl: TWinControl;
+ const AParams: TCreateParams): TLCLIntfHandle; override;
+ class procedure DestroyHandle(const AWinControl: TWinControl); override;
+ class procedure ShowHide(const AWinControl: TWinControl); override;
+
+ class procedure UpdateControl(const ACustomFloatSpinEdit: TCustomFloatSpinEdit); override;
+
+ class function GetValue(const ACustomFloatSpinEdit: TCustomFloatSpinEdit): Double; override;
+
+ (*TODO: seperation into properties instead of bulk update
+ class procedure SetIncrement(const ACustomFloatSpinEdit: TCustomFloatSpinEdit; NewIncrement: Double); virtual;
+ class procedure SetMinValue(const ACustomFloatSpinEdit: TCustomFloatSpinEdit; NewValue: Double); virtual;
+ class procedure SetMaxValue(const ACustomFloatSpinEdit: TCustomFloatSpinEdit; NewValue: Double); virtual;
+ class procedure SetValueEmpty(const ACustomFloatSpinEdit: TCustomFloatSpinEdit; NewEmpty: boolean); virtual;
+ *)
+ end;
+
+implementation
+
+class procedure TCDWSCustomFloatSpinEdit.InjectCDControl(
+ const AWinControl: TWinControl; var ACDControlField: TCDControl);
+begin
+ TCDIntfSpinEdit(ACDControlField).LCLControl := TCustomFloatSpinEdit(AWinControl);
+ ACDControlField.Caption := AWinControl.Caption;
+ ACDControlField.Parent := AWinControl;
+ ACDControlField.Align := alClient;
+end;
+
+{------------------------------------------------------------------------------
+ Method: TCDWSCustomFloatSpinEdit.CreateHandle
+ Params: None
+ Returns: Nothing
+ ------------------------------------------------------------------------------}
+class function TCDWSCustomFloatSpinEdit.CreateHandle(const AWinControl: TWinControl;
+ const AParams: TCreateParams): TLCLIntfHandle;
+var
+ lCDWinControl: TCDWinControl;
+begin
+ Result := TCDWSWinControl.CreateHandle(AWinControl, AParams);
+ lCDWinControl := TCDWinControl(Result);
+ lCDWinControl.CDControl := TCDIntfSpinEdit.Create(AWinControl);
+end;
+
+class procedure TCDWSCustomFloatSpinEdit.DestroyHandle(
+ const AWinControl: TWinControl);
+var
+ lCDWinControl: TCDWinControl;
+begin
+ lCDWinControl := TCDWinControl(AWinControl.Handle);
+ lCDWinControl.CDControl.Free;
+ lCDWinControl.Free;
+end;
+
+class procedure TCDWSCustomFloatSpinEdit.ShowHide(const AWinControl: TWinControl);
+var
+ lCDWinControl: TCDWinControl;
+begin
+ lCDWinControl := TCDWinControl(AWinControl.Handle);
+
+ TCDWSWinControl.ShowHide(AWinControl);
+
+ if not lCDWinControl.CDControlInjected then
+ begin
+ InjectCDControl(AWinControl, lCDWinControl.CDControl);
+ lCDWinControl.CDControlInjected := True;
+ end;
+end;
+
+class function TCDWSCustomFloatSpinEdit.GetValue(const ACustomFloatSpinEdit: TCustomFloatSpinEdit): Double;
+var
+ lCDWinControl: TCDWinControl;
+begin
+ lCDWinControl := TCDWinControl(ACustomFloatSpinEdit.Handle);
+ Result := TCDIntfSpinEdit(lCDWinControl.CDControl).Value;
+end;
+
+class procedure TCDWSCustomFloatSpinEdit.UpdateControl(const ACustomFloatSpinEdit: TCustomFloatSpinEdit);
+{var
+ CurrentSpinWidget: TQtAbstractSpinBox;}
+begin
+{ if not WSCheckHandleAllocated(ACustomFloatSpinEdit, 'UpdateControl') then
+ Exit;
+
+ CurrentSpinWidget := TQtAbstractSpinBox(ACustomFloatSpinEdit.Handle);
+ if ((ACustomFloatSpinEdit.DecimalPlaces > 0) and (CurrentSpinWidget is TQtSpinBox)) or
+ ((ACustomFloatSpinEdit.DecimalPlaces = 0) and (CurrentSpinWidget is TQtFloatSpinBox)) then
+ RecreateWnd(ACustomFloatSpinEdit)
+ else
+ InternalUpdateControl(CurrentSpinWidget, ACustomFloatSpinEdit);}
+end;
+
+end.
diff --git a/lcl/interfaces/customdrawn/customdrawnwsstdctrls.pas b/lcl/interfaces/customdrawn/customdrawnwsstdctrls.pas
index 0c962aae94..663cdc119c 100644
--- a/lcl/interfaces/customdrawn/customdrawnwsstdctrls.pas
+++ b/lcl/interfaces/customdrawn/customdrawnwsstdctrls.pas
@@ -42,17 +42,20 @@ type
{ TCDWSScrollBar }
TCDWSScrollBar = class(TWSScrollBar)
+ public
+ class procedure InjectCDControl(const AWinControl: TWinControl; var ACDControlField: TCDControl);
published
-{ class function CreateHandle(const AWinControl: TWinControl;
+ class function CreateHandle(const AWinControl: TWinControl;
const AParams: TCreateParams): TLCLIntfHandle; override;
+ class procedure DestroyHandle(const AWinControl: TWinControl); override;
class procedure SetKind(const AScrollBar: TCustomScrollBar; const AIsHorizontal: Boolean); override;
class procedure SetParams(const AScrollBar: TCustomScrollBar); override;
- class procedure ShowHide(const AWinControl: TWinControl); override;}
+ class procedure ShowHide(const AWinControl: TWinControl); override;
end;
{ TCDWSCustomGroupBox }
- TCDWSCustomGroupBox = class(TWSCustomGroupBox)
+ TCDWSCustomGroupBox = class(TWSCustomGroupBox) // Receives direct rendering, so no control injection
published
class function CreateHandle(const AWinControl: TWinControl;
const AParams: TCreateParams): TLCLIntfHandle; override;
@@ -328,33 +331,40 @@ implementation
{ TCDWSScrollBar }
-(*{------------------------------------------------------------------------------
- Method: TCDWSCustomScrollBar.CreateHandle
- Params: None
- Returns: Nothing
- ------------------------------------------------------------------------------}
-class function TCDWSScrollBar.CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLIntfHandle;
-var
- QtScrollBar: TQtScrollBar;
+class procedure TCDWSScrollBar.InjectCDControl(const AWinControl: TWinControl;
+ var ACDControlField: TCDControl);
begin
- QtScrollBar := TQtScrollBar.Create(AWinControl, AParams);
+ TCDIntfScrollBar(ACDControlField).LCLControl := TCustomScrollBar(AWinControl);
+ ACDControlField.Caption := AWinControl.Caption;
+ ACDControlField.Parent := AWinControl;
+ ACDControlField.Align := alClient;
+end;
- QtScrollBar.AttachEvents;
-
- case TScrollBar(AWinControl).Kind of
- sbHorizontal: QtScrollBar.SetOrientation(QtHorizontal);
- sbVertical: QtScrollBar.SetOrientation(QtVertical);
- end;
-
- Result := TLCLIntfHandle(QtScrollbar);
+class function TCDWSScrollBar.CreateHandle(const AWinControl: TWinControl;
+ const AParams: TCreateParams): TLCLIntfHandle;
+var
+ lCDWinControl: TCDWinControl;
+begin
+ Result := TCDWSWinControl.CreateHandle(AWinControl, AParams);
+ lCDWinControl := TCDWinControl(Result);
+ lCDWinControl.CDControl := TCDIntfScrollBar.Create(AWinControl);
+end;
+
+class procedure TCDWSScrollBar.DestroyHandle(const AWinControl: TWinControl);
+var
+ lCDWinControl: TCDWinControl;
+begin
+ lCDWinControl := TCDWinControl(AWinControl.Handle);
+ lCDWinControl.CDControl.Free;
+ lCDWinControl.Free;
end;
class procedure TCDWSScrollBar.SetKind(const AScrollBar: TCustomScrollBar;
const AIsHorizontal: Boolean);
-var
- QtScrollBar: TQtScrollBar;
+{var
+ QtScrollBar: TQtScrollBar; }
begin
- if not WSCheckHandleAllocated(AScrollBar, 'SetKind') then
+ {if not WSCheckHandleAllocated(AScrollBar, 'SetKind') then
Exit;
QtScrollBar := TQtScrollBar(AScrollBar.Handle);
QtScrollBar.BeginUpdate;
@@ -381,21 +391,16 @@ begin
end;
finally
QtScrollbar.EndUpdate;
- end;
+ end;}
end;
-{------------------------------------------------------------------------------
- Method: TCDWSCustomScrollBar.SetParams
- Params: None
- Returns: Nothing
- ------------------------------------------------------------------------------}
class procedure TCDWSScrollBar.SetParams(const AScrollBar: TCustomScrollBar);
-var
- QtScrollBar: TQtScrollBar;
+{var
+ QtScrollBar: TQtScrollBar; }
begin
- if not WSCheckHandleAllocated(AScrollBar, 'SetParams') then
+{ if not WSCheckHandleAllocated(AScrollBar, 'SetParams') then
Exit;
- QtScrollBar := TQtScrollBar(AScrollBar.Handle);
+ QtScrollBar := TQtScrollBar(AScrollBar.Handle);
QtScrollBar.BeginUpdate;
try
@@ -432,27 +437,23 @@ begin
end;
finally
QtScrollbar.EndUpdate;
- end;
+ end;}
end;
class procedure TCDWSScrollBar.ShowHide(const AWinControl: TWinControl);
var
- Widget: TQtWidget;
+ lCDWinControl: TCDWinControl;
begin
- if not WSCheckHandleAllocated(AWincontrol, 'ShowHide') then
- Exit;
+ lCDWinControl := TCDWinControl(AWinControl.Handle);
- Widget := TQtWidget(AWinControl.Handle);
+ TCDWSWinControl.ShowHide(AWinControl);
- {reapply params just before visible since slider isn't updated
- properly sometimes.}
- if AWinControl.HandleObjectShouldBeVisible then
- SetParams(TCustomScrollBar(AWinControl));
-
- Widget.BeginUpdate;
- Widget.setVisible(AWinControl.HandleObjectShouldBeVisible);
- Widget.EndUpdate;
-end;*)
+ if not lCDWinControl.CDControlInjected then
+ begin
+ InjectCDControl(AWinControl, lCDWinControl.CDControl);
+ lCDWinControl.CDControlInjected := True;
+ end;
+end;
{ TCDWSCustomGroupBox }
diff --git a/lcl/interfaces/lcl.lpk b/lcl/interfaces/lcl.lpk
index 40efbfccae..956c7b75f1 100644
--- a/lcl/interfaces/lcl.lpk
+++ b/lcl/interfaces/lcl.lpk
@@ -114,7 +114,7 @@ end;"/>
-
+
@@ -1956,6 +1956,11 @@ end;"/>
+
+
+
+
+