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;"/> + + + + +