lazarus/lcl/interfaces/qt5/qtwsstdctrls.pp

1816 lines
62 KiB
ObjectPascal

{
*****************************************************************************
* QtWSStdCtrls.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 license.
*****************************************************************************
}
unit QtWSStdCtrls;
{$mode objfpc}{$H+}
interface
{$I qtdefines.inc}
uses
// Bindings
qt5,
qtprivate, qtwidgets, qtproc, QtWsControls,
// RTL
Classes, Types, SysUtils, math,
// LCL
StdCtrls, Controls, Forms, LCLType,
// Widgetset
WSProc, WSStdCtrls, WSLCLClasses;
type
{ TQtWSScrollBar }
TQtWSScrollBar = class(TWSScrollBar)
published
class function CreateHandle(const AWinControl: TWinControl;
const AParams: TCreateParams): TLCLHandle; 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;
end;
{ TQtWSCustomGroupBox }
TQtWSCustomGroupBox = class(TWSCustomGroupBox)
published
class function CreateHandle(const AWinControl: TWinControl;
const AParams: TCreateParams): TLCLHandle; 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;
end;
{ TQtWSGroupBox }
TQtWSGroupBox = class(TWSGroupBox)
published
end;
{ TQtWSCustomComboBox }
TQtWSCustomComboBox = class(TWSCustomComboBox)
published
class function CreateHandle(const AWinControl: TWinControl;
const AParams: TCreateParams): TLCLHandle; override;
class function GetDroppedDown(const ACustomComboBox: TCustomComboBox
): Boolean; override;
class function GetItemIndex(const ACustomComboBox: TCustomComboBox): integer; override;
class function GetItems(const ACustomComboBox: TCustomComboBox): TStrings; override;
class function GetMaxLength(const ACustomComboBox: TCustomComboBox): integer; override;
class procedure GetPreferredSize(const AWinControl: TWinControl;
var PreferredWidth, PreferredHeight: integer; WithThemeSpace: Boolean); override;
class function GetSelStart(const ACustomComboBox: TCustomComboBox): integer; override;
class function GetSelLength(const ACustomComboBox: TCustomComboBox): integer; override;
class procedure SetSelStart(const ACustomComboBox: TCustomComboBox; NewStart: integer); override;
class procedure SetSelLength(const ACustomComboBox: TCustomComboBox; NewLength: integer); override;
class procedure SetArrowKeysTraverseList(const ACustomComboBox: TCustomComboBox;
NewTraverseList: boolean); override;
class procedure SetDropDownCount(const ACustomComboBox: TCustomComboBox; NewCount: Integer); override;
class procedure SetDroppedDown(const ACustomComboBox: TCustomComboBox;
ADroppedDown: Boolean); override;
class procedure SetItemIndex(const ACustomComboBox: TCustomComboBox; NewIndex: integer); override;
class procedure SetMaxLength(const ACustomComboBox: TCustomComboBox; NewLength: integer); override;
class procedure SetStyle(const ACustomComboBox: TCustomComboBox; NewStyle: TComboBoxStyle); override;
class procedure SetReadOnly(const ACustomComboBox: TCustomComboBox; NewReadOnly: boolean); override;
class procedure SetTextHint(const ACustomComboBox: TCustomComboBox; const ATextHint: string); override;
class procedure Sort(const ACustomComboBox: TCustomComboBox; AList: TStrings; IsSorted: boolean); override;
class function GetItemHeight(const ACustomComboBox: TCustomComboBox): Integer; override;
class procedure SetItemHeight(const ACustomComboBox: TCustomComboBox; const AItemHeight: Integer); override;
end;
{ TQtWSComboBox }
TQtWSComboBox = class(TWSComboBox)
published
end;
{ TQtWSCustomListBox }
TQtWSCustomListBox = class(TWSCustomListBox)
published
class function CreateHandle(const AWinControl: TWinControl;
const AParams: TCreateParams): TLCLHandle; override;
class function GetIndexAtXY(const ACustomListBox: TCustomListBox; X, Y: integer): integer; override;
class function GetItemIndex(const ACustomListBox: TCustomListBox): integer; override;
class function GetItemRect(const ACustomListBox: TCustomListBox; Index: integer; var ARect: TRect): boolean; override;
class function GetScrollWidth(const ACustomListBox: TCustomListBox): Integer; override;
class function GetSelCount(const ACustomListBox: TCustomListBox): integer; override;
class function GetSelected(const ACustomListBox: TCustomListBox; const AIndex: integer): boolean; override;
class function GetStrings(const ACustomListBox: TCustomListBox): TStrings; override;
class function GetTopIndex(const ACustomListBox: TCustomListBox): integer; override;
class procedure SelectItem(const ACustomListBox: TCustomListBox; AIndex: integer; ASelected: boolean); override;
class procedure SetBorder(const ACustomListBox: TCustomListBox); override;
class procedure SetColumnCount(const ACustomListBox: TCustomListBox; ACount: Integer); override;
class procedure SetItemIndex(const ACustomListBox: TCustomListBox; const AIndex: integer); override;
class procedure SetScrollWidth(const ACustomListBox: TCustomListBox; const AScrollWidth: Integer); override;
class procedure SetSelectionMode(const ACustomListBox: TCustomListBox; const AExtendedSelect, AMultiSelect: boolean); override;
class procedure SetSorted(const ACustomListBox: TCustomListBox; AList: TStrings; ASorted: boolean); override;
class procedure SetStyle(const ACustomListBox: TCustomListBox); override;
class procedure SetTopIndex(const ACustomListBox: TCustomListBox; const NewTopIndex: integer); override;
end;
{ TQtWSListBox }
TQtWSListBox = class(TWSListBox)
published
end;
{ TQtWSCustomEdit }
TQtWSCustomEdit = class(TWSCustomEdit)
published
class function CreateHandle(const AWinControl: TWinControl;
const AParams: TCreateParams): HWND; override;
class procedure SetAlignment(const ACustomEdit: TCustomEdit; const AAlignment: TAlignment); override;
class function GetCaretPos(const ACustomEdit: TCustomEdit): TPoint; override;
class function GetCanUndo(const ACustomEdit: TCustomEdit): Boolean; override;
class procedure SetCaretPos(const ACustomEdit: TCustomEdit; const NewPos: TPoint); override;
class procedure SetEchoMode(const ACustomEdit: TCustomEdit; NewMode: TEchoMode); override;
class procedure SetMaxLength(const ACustomEdit: TCustomEdit; NewLength: integer); override;
class procedure SetNumbersOnly(const ACustomEdit: TCustomEdit; NewNumbersOnly: Boolean); override;
class procedure SetReadOnly(const ACustomEdit: TCustomEdit; NewReadOnly: boolean); override;
class function GetSelStart(const ACustomEdit: TCustomEdit): integer; override;
class function GetSelLength(const ACustomEdit: TCustomEdit): integer; override;
class procedure SetSelStart(const ACustomEdit: TCustomEdit; NewStart: integer); override;
class procedure SetSelLength(const ACustomEdit: TCustomEdit; NewLength: integer); override;
class procedure SetTextHint(const ACustomEdit: TCustomEdit; const ATextHint: string); override;
//class procedure SetPasswordChar(const ACustomEdit: TCustomEdit; NewChar: char); override;
class procedure Cut(const ACustomEdit: TCustomEdit); override;
class procedure Copy(const ACustomEdit: TCustomEdit); override;
class procedure Paste(const ACustomEdit: TCustomEdit); override;
class procedure Undo(const ACustomEdit: TCustomEdit); override;
end;
{ TQtWSCustomMemo }
TQtWSCustomMemo = class(TWSCustomMemo)
published
class function CreateHandle(const AWinControl: TWinControl;
const AParams: TCreateParams): HWND; override;
class procedure AppendText(const ACustomMemo: TCustomMemo; const AText: string); override;
class function GetStrings(const ACustomMemo: TCustomMemo): TStrings; override;
class procedure SetAlignment(const ACustomEdit: TCustomEdit; const AAlignment: TAlignment); override;
class procedure SetCaretPos(const ACustomEdit: TCustomEdit; const NewPos: TPoint); override;
class procedure SetScrollbars(const ACustomMemo: TCustomMemo; const NewScrollbars: TScrollStyle); override;
class procedure SetWantReturns(const ACustomMemo: TCustomMemo; const NewWantReturns: boolean); override;
class procedure SetWantTabs(const ACustomMemo: TCustomMemo; const NewWantTabs: boolean); override;
class procedure SetWordWrap(const ACustomMemo: TCustomMemo; const NewWordWrap: boolean); override;
end;
{ TQtWSEdit }
TQtWSEdit = class(TWSEdit)
published
end;
{ TQtWSMemo }
TQtWSMemo = class(TWSMemo)
published
end;
{ TQtWSButtonControl }
TQtWSButtonControl = class(TWSButtonControl)
published
end;
{ TQtWSButton }
TQtWSButton = class(TWSButton)
published
class function CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLHandle; override;
class procedure SetDefault(const AButton: TCustomButton; ADefault: Boolean); override;
class procedure SetShortcut(const AButton: TCustomButton; const ShortCutK1, ShortCutK2: TShortcut); override;
end;
{ TQtWSCustomCheckBox }
TQtWSCustomCheckBox = class(TWSCustomCheckBox)
published
class function CreateHandle(const AWinControl: TWinControl;
const AParams: TCreateParams): TLCLHandle; override;
class procedure SetShortCut(const ACustomCheckBox: TCustomCheckBox; const ShortCutK1, ShortCutK2: TShortCut); override;
class procedure SetState(const ACustomCheckBox: TCustomCheckBox; const NewState: TCheckBoxState); override;
class procedure SetAlignment(const ACustomCheckBox: TCustomCheckBox; const NewAlignment: TLeftRight); override;
class procedure ShowHide(const AWinControl: TWinControl); override;
class function RetrieveState(const ACustomCheckBox: TCustomCheckBox): TCheckBoxState; override;
end;
{ TQtWSCheckBox }
TQtWSCheckBox = class(TWSCheckBox)
published
end;
{ TQtWSToggleBox }
TQtWSToggleBox = class(TWSToggleBox)
published
class function CreateHandle(const AWinControl: TWinControl;
const AParams: TCreateParams): TLCLHandle; override;
class procedure SetShortCut(const ACustomCheckBox: TCustomCheckBox; const ShortCutK1, ShortCutK2: TShortCut); override;
class procedure SetState(const ACustomCheckBox: TCustomCheckBox; const NewState: TCheckBoxState); override;
class function RetrieveState(const ACustomCheckBox: TCustomCheckBox): TCheckBoxState; override;
end;
{ TQtWSRadioButton }
TQtWSRadioButton = class(TWSRadioButton)
published
class function CreateHandle(const AWinControl: TWinControl;
const AParams: TCreateParams): TLCLHandle; override;
class procedure SetShortCut(const ACustomCheckBox: TCustomCheckBox; const ShortCutK1, ShortCutK2: TShortCut); override;
class procedure SetState(const ACustomCheckBox: TCustomCheckBox; const NewState: TCheckBoxState); override;
class function RetrieveState(const ACustomCheckBox: TCustomCheckBox): TCheckBoxState; override;
end;
{ TQtWSCustomStaticText }
TQtWSCustomStaticText = class(TWSCustomStaticText)
published
class function CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLHandle; override;
class procedure SetAlignment(const ACustomStaticText: TCustomStaticText; const NewAlignment: TAlignment); override;
class procedure SetStaticBorderStyle(const ACustomStaticText: TCustomStaticText; const NewBorderStyle: TStaticBorderStyle); override;
end;
{ TQtWSStaticText }
TQtWSStaticText = class(TWSStaticText)
published
end;
implementation
uses qtint, LCLProc;
const
QtMaxEditLength = 32767;
WordWrapMap: array[Boolean] of QTextEditLineWrapMode =
(
QTextEditNoWrap,
QTextEditWidgetWidth
);
StaticBorderFrameShapeMap: array[TStaticBorderStyle] of QFrameShape =
(
QFrameNoFrame,
QFrameStyledPanel,
QFramePanel
);
StaticBorderFrameShadowMap: array[TStaticBorderStyle] of QFrameShadow =
(
QFramePlain,
QFramePlain,
QFrameSunken
);
{ TQtWSScrollBar }
{------------------------------------------------------------------------------
Method: TQtWSCustomScrollBar.CreateHandle
Params: None
Returns: Nothing
------------------------------------------------------------------------------}
class function TQtWSScrollBar.CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLHandle;
var
QtScrollBar: TQtScrollBar;
begin
QtScrollBar := TQtScrollBar.Create(AWinControl, AParams);
QtScrollBar.AttachEvents;
case TScrollBar(AWinControl).Kind of
sbHorizontal: QtScrollBar.SetOrientation(QtHorizontal);
sbVertical: QtScrollBar.SetOrientation(QtVertical);
end;
Result := TLCLHandle(QtScrollbar);
end;
class procedure TQtWSScrollBar.SetKind(const AScrollBar: TCustomScrollBar;
const AIsHorizontal: Boolean);
var
QtScrollBar: TQtScrollBar;
begin
if not WSCheckHandleAllocated(AScrollBar, 'SetKind') then
Exit;
QtScrollBar := TQtScrollBar(AScrollBar.Handle);
QtScrollBar.BeginUpdate;
try
case AScrollBar.Kind of
sbHorizontal:
begin
if QtScrollBar.getOrientation <> QtHorizontal then
QtScrollBar.SetOrientation(QtHorizontal);
if QtScrollBar.getInvertedAppereance then
QtScrollBar.setInvertedAppereance(False);
if QtScrollbar.getInvertedControls then
QtScrollBar.setInvertedControls(False);
end;
sbVertical:
begin
if QtScrollBar.getOrientation <> QtVertical then
QtScrollBar.SetOrientation(QtVertical);
if QtScrollBar.getInvertedAppereance then
QtScrollBar.setInvertedAppereance(False);
if not QtScrollbar.getInvertedControls then
QtScrollBar.setInvertedControls(True);
end;
end;
finally
QtScrollbar.EndUpdate;
end;
end;
{------------------------------------------------------------------------------
Method: TQtWSCustomScrollBar.SetParams
Params: None
Returns: Nothing
------------------------------------------------------------------------------}
class procedure TQtWSScrollBar.SetParams(const AScrollBar: TCustomScrollBar);
var
QtScrollBar: TQtScrollBar;
begin
if not WSCheckHandleAllocated(AScrollBar, 'SetParams') then
Exit;
QtScrollBar := TQtScrollBar(AScrollBar.Handle);
QtScrollBar.BeginUpdate;
try
if (QtScrollBar.getMin <> AScrollBar.Min) or
(QtScrollBar.getMax <> (AScrollbar.Max - AScrollBar.PageSize)) then
QtScrollBar.setRange(AScrollBar.Min, AScrollBar.Max - AScrollBar.PageSize);
if QtScrollBar.getPageStep <> AScrollBar.PageSize then
begin
QtScrollBar.setPageStep(AScrollBar.PageSize);
QtScrollBar.setSingleStep((AScrollBar.PageSize div 6) + 1);
end;
if QtScrollbar.getValue <> AScrollBar.Position then
begin
if AScrollBar.Position > QtScrollBar.getMax then
QtScrollBar.setValue(QtScrollBar.getMax)
else
QtScrollBar.setValue(AScrollBar.Position);
end;
case AScrollBar.Kind of
sbHorizontal:
begin
if QtScrollBar.getOrientation <> QtHorizontal then
QtScrollBar.SetOrientation(QtHorizontal);
if QtScrollBar.getInvertedAppereance then
QtScrollBar.setInvertedAppereance(False);
if QtScrollbar.getInvertedControls then
QtScrollBar.setInvertedControls(False);
end;
sbVertical:
begin
if QtScrollBar.getOrientation <> QtVertical then
QtScrollBar.SetOrientation(QtVertical);
if QtScrollBar.getInvertedAppereance then
QtScrollBar.setInvertedAppereance(False);
if not QtScrollbar.getInvertedControls then
QtScrollBar.setInvertedControls(True);
end;
end;
finally
QtScrollbar.EndUpdate;
end;
end;
class procedure TQtWSScrollBar.ShowHide(const AWinControl: TWinControl);
var
Widget: TQtWidget;
begin
if not WSCheckHandleAllocated(AWincontrol, 'ShowHide') then
Exit;
Widget := TQtWidget(AWinControl.Handle);
{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;
{ TQtWSCustomListBox }
{------------------------------------------------------------------------------
Method: TQtWSCustomListBox.CreateHandle
Params: None
Returns: Nothing
------------------------------------------------------------------------------}
class function TQtWSCustomListBox.CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLHandle;
var
QtListWidget: TQtListWidget;
SelMode: QAbstractItemViewSelectionMode;
begin
QtListWidget := TQtListWidget.Create(AWinControl, AParams);
if TCustomListBox(AWinControl).MultiSelect then
if TCustomListBox(AWinControl).ExtendedSelect then
SelMode := QAbstractItemViewExtendedSelection
else
SelMode := QAbstractItemViewMultiSelection
else
SelMode := QAbstractItemViewSingleSelection;
QtListWidget.setSelectionMode(SelMode);
//Set BorderStyle according to the provided Params
if (AParams.ExStyle and WS_EX_CLIENTEDGE) > 0 then
QtListWidget.setFrameShape(QFrameStyledPanel)
else
QtListWidget.setFrameShape(QFrameNoFrame);
QtListWidget.setUniformItemSizes(TCustomListBox(AWinControl).Style in [lbStandard, lbOwnerDrawFixed]);
QtListWidget.AttachEvents;
// create our FList helper
QtListWidget.FList := TQtListStrings.Create(AWinControl, QtListWidget);
QtListWidget.OwnerDrawn := TCustomListBox(AWinControl).Style in [lbOwnerDrawFixed, lbOwnerDrawVariable];
Result := TLCLHandle(QtListWidget);
end;
class function TQtWSCustomListBox.GetIndexAtXY(
const ACustomListBox: TCustomListBox; X, Y: integer): integer;
var
APoint: TQtPoint;
begin
if not WSCheckHandleAllocated(ACustomListBox, 'GetIndexAtXY') then
Exit(-1);
APoint := QtPoint(X, Y);
Result := TQtListWidget(ACustomListBox.Handle).indexAt(@APoint);
end;
{------------------------------------------------------------------------------
Method: TQtWSCustomListBox.GetSelCount
Params: None
Returns: Nothing
------------------------------------------------------------------------------}
class function TQtWSCustomListBox.GetSelCount(const ACustomListBox: TCustomListBox): integer;
var
QtListWidget: TQtListWidget;
begin
if not WSCheckHandleAllocated(ACustomListBox, 'GetSelCount') then
Exit(0);
QtListWidget := TQtListWidget(ACustomListBox.Handle);
Result := QtListWidget.getSelCount;
end;
{------------------------------------------------------------------------------
Method: TQtWSCustomListBox.GetSelected
Params: None
Returns: Nothing
------------------------------------------------------------------------------}
class function TQtWSCustomListBox.GetSelected(const ACustomListBox: TCustomListBox; const AIndex: integer): boolean;
var
QtListWidget: TQtListWidget;
ListItem: QListWidgetItemH;
begin
if not WSCheckHandleAllocated(ACustomListBox, 'GetSelected') then
Exit(False);
QtListWidget := TQtListWidget(ACustomListBox.Handle);
ListItem := QtListWidget.getItem(AIndex);
Result := QtListWidget.getItemSelected(ListItem);
end;
{------------------------------------------------------------------------------
Method: TQtWSCustomListBox.GetStrings
Params: None
Returns: Nothing
------------------------------------------------------------------------------}
class function TQtWSCustomListBox.GetStrings(const ACustomListBox: TCustomListBox): TStrings;
var
ListWidget: TQtListWidget;
begin
Result := nil;
if not WSCheckHandleAllocated(ACustomListBox, 'GetStrings') then
Exit;
ListWidget := TQtListWidget(ACustomListBox.Handle);
if not Assigned(ListWidget.FList) then
ListWidget.FList := TQtListStrings.Create(ACustomListBox, ListWidget);
Result := ListWidget.FList;
end;
{------------------------------------------------------------------------------
Method: TQtWSCustomListBox.GetItemIndex
Params: None
Returns: Nothing
------------------------------------------------------------------------------}
class function TQtWSCustomListBox.GetItemIndex(const ACustomListBox: TCustomListBox): integer;
begin
if not WSCheckHandleAllocated(ACustomListBox, 'GetItemIndex') then
Exit(-1);
Result := TQtListWidget(ACustomListBox.Handle).currentRow;
end;
class function TQtWSCustomListBox.GetItemRect(
const ACustomListBox: TCustomListBox; Index: integer; var ARect: TRect
): boolean;
var
QtListWidget: TQtListWidget;
Item: QListWidgetItemH;
begin
if not WSCheckHandleAllocated(ACustomListBox, 'GetItemRect') then
Exit(False);
QtListWidget := TQtListWidget(ACustomListBox.Handle);
Item := QtListWidget.getItem(Index);
Result := Item <> nil;
if Result then
ARect := QtListWidget.getVisualItemRect(Item)
else
ARect := Rect(-1,-1,-1,-1);
end;
class function TQtWSCustomListBox.GetScrollWidth(
const ACustomListBox: TCustomListBox): Integer;
var
QtListWidget: TQtListWidget;
begin
if not WSCheckHandleAllocated(ACustomListBox, 'GetScrollWidth') then
Exit(0);
QtListWidget := TQtListWidget(ACustomListBox.Handle);
Result := QtListWidget.horizontalScrollBar.getMax;
end;
{------------------------------------------------------------------------------
Method: TQtWSCustomListBox.GetTopIndex
Params: None
Returns: Nothing
------------------------------------------------------------------------------}
class function TQtWSCustomListBox.GetTopIndex(const ACustomListBox: TCustomListBox): integer;
begin
Result := 0;
end;
{------------------------------------------------------------------------------
Method: TQtWSCustomListBox.SelectItem
Params: None
Returns: Nothing
------------------------------------------------------------------------------}
class procedure TQtWSCustomListBox.SelectItem(const ACustomListBox: TCustomListBox;
AIndex: integer; ASelected: boolean);
var
QtListWidget: TQtListWidget;
begin
if not WSCheckHandleAllocated(ACustomListBox, 'SelectItem') then
Exit;
QtListWidget := TQtListWidget(ACustomListBox.Handle);
QtListWidget.Selected[AIndex] := ASelected;
end;
{------------------------------------------------------------------------------
Method: TQtWSCustomListBox.SetBorder
Params: None
Returns: Nothing
------------------------------------------------------------------------------}
class procedure TQtWSCustomListBox.SetBorder(const ACustomListBox: TCustomListBox);
begin
if not WSCheckHandleAllocated(ACustomListBox, 'SetBorder') then
Exit;
TQtWSWinControl.SetBorderStyle(ACustomListBox, ACustomListBox.BorderStyle);
end;
class procedure TQtWSCustomListBox.SetColumnCount(const ACustomListBox: TCustomListBox;
ACount: Integer);
{var
QtListWidget: TQtListWidget;
AModel: QAbstractItemModelH;}
begin
{$note implement TQtWSCustomListBox.SetColumnCount}
{ QtListWidget := TQtListWidget(ACustomListBox.Handle);
AModel := QtListWidget.getModel;
if QAbstractItemModel_columnCount(AModel) <> ACount then
QAbstractItemModel_insertColumns(AModel, 0, ACount);
}
end;
{------------------------------------------------------------------------------
Method: TQtWSCustomListBox.SetItemIndex
Params: None
Returns: Nothing
------------------------------------------------------------------------------}
class procedure TQtWSCustomListBox.SetItemIndex(const ACustomListBox: TCustomListBox;
const AIndex: integer);
begin
if not WSCheckHandleAllocated(ACustomListBox, 'SetItemIndex') then
Exit;
if TQtListWidget(ACustomListBox.Handle).currentRow <> AIndex then
TQtListWidget(ACustomListBox.Handle).clearSelection;
TQtListWidget(ACustomListBox.Handle).setCurrentRow(AIndex);
end;
class procedure TQtWSCustomListBox.SetScrollWidth(const ACustomListBox: TCustomListBox; const AScrollWidth: Integer);
const
BoolToPolicy: array[Boolean] of QtScrollBarPolicy = (QtScrollBarAlwaysOff, QtScrollBarAlwaysOn);
var
QtListWidget: TQtListWidget;
ClientWidth: Integer;
begin
if not WSCheckHandleAllocated(ACustomListBox, 'SetScrollWidth') then
Exit;
QtListWidget := TQtListWidget(ACustomListBox.Handle);
QtListWidget.horizontalScrollBar.setMaximum(AScrollWidth);
with QtListWidget.getClientBounds do
ClientWidth := Right - Left;
QtListWidget.ScrollBarPolicy[False] := BoolToPolicy[AScrollWidth > ClientWidth];
end;
{------------------------------------------------------------------------------
Method: TQtWSCustomListBox.SetSelectionMode
Params: None
Returns: Nothing
------------------------------------------------------------------------------}
class procedure TQtWSCustomListBox.SetSelectionMode(
const ACustomListBox: TCustomListBox; const AExtendedSelect, AMultiSelect: boolean);
var
QtListWidget: TQtListWidget;
SelMode: QAbstractItemViewSelectionMode;
begin
if not WSCheckHandleAllocated(ACustomListBox, 'SetSelectionMode') then
Exit;
QtListWidget := TQtListWidget(ACustomListBox.Handle);
if AMultiSelect then
if AExtendedSelect then
SelMode := QAbstractItemViewExtendedSelection
else
SelMode := QAbstractItemViewMultiSelection
else
SelMode := QAbstractItemViewSingleSelection;
QtListWidget.setSelectionMode(SelMode);
end;
{------------------------------------------------------------------------------
Method: TQtWSCustomListBox.SetSorted
Params: None
Returns: Nothing
------------------------------------------------------------------------------}
class procedure TQtWSCustomListBox.SetSorted(const ACustomListBox: TCustomListBox;
AList: TStrings; ASorted: boolean);
begin
TQtListStrings(AList).Sorted := ASorted;
end;
class procedure TQtWSCustomListBox.SetStyle(const ACustomListBox: TCustomListBox);
begin
if not WSCheckHandleAllocated(ACustomListBox, 'SetStyle') then
Exit;
TQtListWidget(ACustomListBox.Handle).setUniformItemSizes(ACustomListBox.Style in [lbStandard, lbOwnerDrawFixed]);
TQtListWidget(ACustomListBox.Handle).OwnerDrawn :=
ACustomListBox.Style in [lbOwnerDrawFixed, lbOwnerDrawVariable];
end;
{------------------------------------------------------------------------------
Method: TQtWSCustomListBox.SetTopIndex
Params: None
Returns: Nothing
------------------------------------------------------------------------------}
class procedure TQtWSCustomListBox.SetTopIndex(const ACustomListBox: TCustomListBox;
const NewTopIndex: integer);
begin
if not WSCheckHandleAllocated(ACustomListBox, 'SetTopIndex') then
Exit;
TQtListWidget(ACustomListBox.Handle).scrollToItem(NewTopIndex,
QAbstractItemViewPositionAtTop);
end;
{ TQtWSCustomMemo }
{------------------------------------------------------------------------------
Method: TQtWSCustomMemo.CreateHandle
Params: None
Returns: Nothing
------------------------------------------------------------------------------}
class function TQtWSCustomMemo.CreateHandle(const AWinControl: TWinControl;
const AParams: TCreateParams): HWND;
var
QtTextEdit: TQtTextEdit;
begin
QtTextEdit := TQtTextEdit.Create(AWinControl, AParams);
QtTextEdit.AcceptRichText := False;
QtTextEdit.ClearText;
QtTextEdit.setBorder(TCustomMemo(AWinControl).BorderStyle = bsSingle);
QtTextEdit.setReadOnly(TCustomMemo(AWinControl).ReadOnly);
QtTextEdit.setLineWrapMode(WordWrapMap[TCustomMemo(AWinControl).WordWrap]);
// create our FList helper
QtTextEdit.FList := TQtMemoStrings.Create(TCustomMemo(AWinControl));
QtTextEdit.setScrollStyle(TCustomMemo(AWinControl).ScrollBars);
QtTextEdit.setTabChangesFocus(not TCustomMemo(AWinControl).WantTabs);
QtTextEdit.AttachEvents;
Result := TLCLHandle(QtTextEdit);
end;
{------------------------------------------------------------------------------
Method: TQtWSCustomMemo.AppendText
Params: None
Returns: Nothing
------------------------------------------------------------------------------}
class procedure TQtWSCustomMemo.AppendText(const ACustomMemo: TCustomMemo; const AText: string);
var
AStr: WideString;
begin
if not WSCheckHandleAllocated(ACustomMemo, 'AppendText') or (Length(AText) = 0) then
Exit;
AStr := {%H-}AText;
TQtTextEdit(ACustomMemo.Handle).BeginUpdate;
TQtTextEdit(ACustomMemo.Handle).Append(AStr);
TQtTextEdit(ACustomMemo.Handle).EndUpdate;
end;
{------------------------------------------------------------------------------
Method: TQtWSCustomMemo.GetStrings
Params: None
Returns: Memo Contents as TStrings
------------------------------------------------------------------------------}
class function TQtWSCustomMemo.GetStrings(const ACustomMemo: TCustomMemo): TStrings;
begin
if not WSCheckHandleAllocated(ACustomMemo, 'GetStrings') then
Exit(Nil);
if not Assigned(TQtTextEdit(ACustomMemo.Handle).FList) then
TQtTextEdit(ACustomMemo.Handle).FList := TQtMemoStrings.Create(ACustomMemo);
Result := TQtTextEdit(ACustomMemo.Handle).FList;
end;
class procedure TQtWSCustomMemo.SetAlignment(const ACustomEdit: TCustomEdit;
const AAlignment: TAlignment);
begin
if not WSCheckHandleAllocated(ACustomEdit, 'SetAlignment') then
Exit;
TQtTextEdit(ACustomEdit.Handle).setAlignment(AlignmentMap[AAlignment]);
end;
class procedure TQtWSCustomMemo.SetCaretPos(const ACustomEdit: TCustomEdit;
const NewPos: TPoint);
begin
if not WSCheckHandleAllocated(ACustomEdit, 'SetCaretPos') then
Exit;
TQtTextEdit(ACustomEdit.Handle).setCursorPosition(NewPos);
end;
class procedure TQtWSCustomMemo.SetScrollbars(const ACustomMemo: TCustomMemo;
const NewScrollbars: TScrollStyle);
begin
if not WSCheckHandleAllocated(ACustomMemo, 'SetScrollBars') then
Exit;
TQtTextEdit(ACustomMemo.Handle).setScrollStyle(NewScrollBars);
end;
class procedure TQtWSCustomMemo.SetWantReturns(const ACustomMemo: TCustomMemo;
const NewWantReturns: boolean);
begin
if not WSCheckHandleAllocated(ACustomMemo, 'SetWantReturns') then
Exit;
with TQtTextEdit(ACustomMemo.Handle) do
begin
if NewWantReturns then
KeysToEat := KeysToEat - [VK_RETURN]
else
KeysToEat := KeysToEat + [VK_RETURN];
end;
end;
class procedure TQtWSCustomMemo.SetWantTabs(const ACustomMemo: TCustomMemo;
const NewWantTabs: boolean);
begin
if not WSCheckHandleAllocated(ACustomMemo, 'SetWantTabs') then
Exit;
with TQtTextEdit(ACustomMemo.Handle) do
begin
setTabChangesFocus(not NewWantTabs);
if NewWantTabs then
KeysToEat := KeysToEat - [VK_TAB]
else
KeysToEat := KeysToEat + [VK_TAB];
end;
end;
{------------------------------------------------------------------------------
Method: TQtWSCustomMemo.SetWordWrap
Params: NewWordWrap boolean
Returns: Nothing
------------------------------------------------------------------------------}
class procedure TQtWSCustomMemo.SetWordWrap(const ACustomMemo: TCustomMemo; const NewWordWrap: boolean);
begin
if not WSCheckHandleAllocated(ACustomMemo, 'SetWordWrap') then
Exit;
TQtTextEdit(ACustomMemo.Handle).setLineWrapMode(WordWrapMap[NewWordWrap]);
end;
{ TQtWSCustomEdit }
{------------------------------------------------------------------------------
Method: TQtWSCustomEdit.CreateHandle
Params: None
Returns: Nothing
------------------------------------------------------------------------------}
class function TQtWSCustomEdit.CreateHandle(const AWinControl: TWinControl;
const AParams: TCreateParams): HWND;
var
QtLineEdit: TQtLineEdit;
begin
QtLineEdit := TQtLineEdit.Create(AWinControl, AParams);
QtLineEdit.setBorder(TCustomEdit(AWinControl).BorderStyle = bsSingle);
QtLineEdit.setAlignment(AlignmentMap[TCustomEdit(AWinControl).Alignment]);
QtLineEdit.NumbersOnly := TCustomEdit(AWinControl).NumbersOnly;
QtLineEdit.AttachEvents;
Result := TLCLHandle(QtLineEdit);
end;
class procedure TQtWSCustomEdit.SetAlignment(const ACustomEdit: TCustomEdit;
const AAlignment: TAlignment);
begin
if not WSCheckHandleAllocated(ACustomEdit, 'SetAlignment') then
Exit;
TQtLineEdit(ACustomEdit.Handle).setAlignment(AlignmentMap[AAlignment]);
end;
class function TQtWSCustomEdit.GetCaretPos(const ACustomEdit: TCustomEdit
): TPoint;
var
Widget: TQtWidget;
QtEdit: IQtEdit;
begin
Result := Point(0,0);
if not WSCheckHandleAllocated(ACustomEdit, 'GetCaretPos') then
Exit;
Widget := TQtWidget(ACustomEdit.Handle);
if Supports(Widget, IQtEdit, QtEdit) then
Result := QtEdit.getCursorPosition;
end;
class function TQtWSCustomEdit.GetCanUndo(const ACustomEdit: TCustomEdit): Boolean;
var
Widget: TQtWidget;
QtEdit: IQtEdit;
begin
Result := False;
if not WSCheckHandleAllocated(ACustomEdit, 'GetCanUndo') then
Exit;
Widget := TQtWidget(ACustomEdit.Handle);
if Supports(Widget, IQtEdit, QtEdit) then
Result := QtEdit.isUndoAvailable;
end;
class procedure TQtWSCustomEdit.SetCaretPos(const ACustomEdit: TCustomEdit;
const NewPos: TPoint);
var
Widget: TQtWidget;
QtEdit: IQtEdit;
begin
if not WSCheckHandleAllocated(ACustomEdit, 'SetCaretPos') then
Exit;
Widget := TQtWidget(ACustomEdit.Handle);
if Supports(Widget, IQtEdit, QtEdit) then
QtEdit.setCursorPosition(NewPos.X);
end;
{------------------------------------------------------------------------------
Method: TQtWSCustomEdit.SetEchoMode
Params: None
Returns: Nothing
------------------------------------------------------------------------------}
class procedure TQtWSCustomEdit.SetEchoMode(const ACustomEdit: TCustomEdit; NewMode: TEchoMode);
var
Widget: TQtWidget;
QtEdit: IQtEdit;
begin
if not WSCheckHandleAllocated(ACustomEdit, 'SetEchoMode') then
Exit;
Widget := TQtWidget(ACustomEdit.Handle);
if Supports(Widget, IQtEdit, QtEdit) then
QtEdit.setEchoMode(QLineEditEchoMode(Ord(NewMode)));
end;
{------------------------------------------------------------------------------
Method: TQtWSCustomEdit.SetMaxLength
Params: None
Returns: Nothing
------------------------------------------------------------------------------}
class procedure TQtWSCustomEdit.SetMaxLength(const ACustomEdit: TCustomEdit; NewLength: integer);
var
Widget: TQtWidget;
QtEdit: IQtEdit;
MaxLength: Integer;
begin
if not WSCheckHandleAllocated(ACustomEdit, 'SetMaxLength') then
Exit;
Widget := TQtWidget(ACustomEdit.Handle);
if Supports(Widget, IQtEdit, QtEdit) then
begin
// qt doesn't accept -1
MaxLength := QtEdit.getMaxLength;
if (NewLength <= 0) or (NewLength > QtMaxEditLength) then
NewLength := QtMaxEditLength;
if NewLength <> MaxLength then
QtEdit.setMaxLength(NewLength);
end;
end;
class procedure TQtWSCustomEdit.SetNumbersOnly(const ACustomEdit: TCustomEdit;
NewNumbersOnly: Boolean);
begin
if not WSCheckHandleAllocated(ACustomEdit, 'SetNumbersOnly') then
Exit;
if TQtWidget(ACustomEdit.Handle) is TQtLineEdit then
TQtLineEdit(ACustomEdit.Handle).NumbersOnly := NewNumbersOnly;
end;
{------------------------------------------------------------------------------
Method: TQtWSCustomEdit.SetReadOnly
Params: None
Returns: Nothing
------------------------------------------------------------------------------}
class procedure TQtWSCustomEdit.SetReadOnly(const ACustomEdit: TCustomEdit; NewReadOnly: boolean);
var
Widget: TQtWidget;
QtEdit: IQtEdit;
begin
if not WSCheckHandleAllocated(ACustomEdit, 'SetReadOnly') then
Exit;
Widget := TQtWidget(ACustomEdit.Handle);
if Supports(Widget, IQtEdit, QtEdit) then
QtEdit.setReadOnly(NewReadOnly);
end;
class function TQtWSCustomEdit.GetSelStart(const ACustomEdit: TCustomEdit): integer;
var
Widget: TQtWidget;
QtEdit: IQtEdit;
begin
Result := 0;
if not WSCheckHandleAllocated(ACustomEdit, 'GetSelStart') then
Exit;
Widget := TQtWidget(ACustomEdit.Handle);
if Supports(Widget, IQtEdit, QtEdit) then
Result := QtEdit.getSelectionStart;
end;
class function TQtWSCustomEdit.GetSelLength(const ACustomEdit: TCustomEdit): integer;
var
Widget: TQtWidget;
QtEdit: IQtEdit;
begin
Result := 0;
if not WSCheckHandleAllocated(ACustomEdit, 'GetSelLength') then
Exit;
Widget := TQtWidget(ACustomEdit.Handle);
if Supports(Widget, IQtEdit, QtEdit) then
Result := QtEdit.getSelectionLength;
end;
class procedure TQtWSCustomEdit.SetSelStart(const ACustomEdit: TCustomEdit;
NewStart: integer);
var
Widget: TQtWidget;
QtEdit: IQtEdit;
// ALength: Integer;
begin
if not WSCheckHandleAllocated(ACustomEdit, 'SetSelStart') then
Exit;
Widget := TQtWidget(ACustomEdit.Handle);
// issue #11802, make qt consistent with gtk2 and win32.
// Delphi docs says that setting selection start should reset sellength !
// ALength := GetSelLength(ACustomEdit);
if Supports(Widget, IQtEdit, QtEdit) then
QtEdit.setSelection(NewStart, 0);
end;
class procedure TQtWSCustomEdit.SetSelLength(const ACustomEdit: TCustomEdit;
NewLength: integer);
var
Widget: TQtWidget;
QtEdit: IQtEdit;
AStart: Integer;
begin
if not WSCheckHandleAllocated(ACustomEdit, 'SetSelLength') then
Exit;
Widget := TQtWidget(ACustomEdit.Handle);
AStart := GetSelStart(ACustomEdit);
if Supports(Widget, IQtEdit, QtEdit) then
QtEdit.setSelection(AStart, NewLength);
end;
class procedure TQtWSCustomEdit.SetTextHint(const ACustomEdit: TCustomEdit;
const ATextHint: string);
var
Widget: TQtWidget;
QtEdit: IQtEdit;
begin
Widget := TQtWidget(ACustomEdit.Handle);
if Supports(Widget, IQtEdit, QtEdit) then
QtEdit.setTextHint(ATextHint);
end;
class procedure TQtWSCustomEdit.Cut(const ACustomEdit: TCustomEdit);
var
Widget: TQtWidget;
QtEdit: IQtEdit;
begin
Widget := TQtWidget(ACustomEdit.Handle);
if Supports(Widget, IQtEdit, QtEdit) then
QtEdit.Cut;
end;
class procedure TQtWSCustomEdit.Copy(const ACustomEdit: TCustomEdit);
var
Widget: TQtWidget;
QtEdit: IQtEdit;
begin
Widget := TQtWidget(ACustomEdit.Handle);
if Supports(Widget, IQtEdit, QtEdit) then
QtEdit.Copy;
end;
class procedure TQtWSCustomEdit.Paste(const ACustomEdit: TCustomEdit);
var
Widget: TQtWidget;
QtEdit: IQtEdit;
begin
Widget := TQtWidget(ACustomEdit.Handle);
if Supports(Widget, IQtEdit, QtEdit) then
QtEdit.Paste;
end;
class procedure TQtWSCustomEdit.Undo(const ACustomEdit: TCustomEdit);
var
Widget: TQtWidget;
QtEdit: IQtEdit;
begin
if not WSCheckHandleAllocated(ACustomEdit, 'Undo') then
Exit;
Widget := TQtWidget(ACustomEdit.Handle);
if Supports(Widget, IQtEdit, QtEdit) then
QtEdit.Undo;
end;
{ TQtWSStaticText }
{------------------------------------------------------------------------------
Method: TQtWSCustomStaticText.CreateHandle
Params: None
Returns: Nothing
------------------------------------------------------------------------------}
class function TQtWSCustomStaticText.CreateHandle(const AWinControl: TWinControl;
const AParams: TCreateParams): TLCLHandle;
var
QtStaticText: TQtStaticText;
begin
QtStaticText := TQtStaticText.Create(AWinControl, AParams);
//QtStaticText.WordWrap := True; issue #41515
QtStaticText.AttachEvents;
QtStaticText.setAlignment(AlignmentMap[TCustomStaticText(AWinControl).Alignment]);
QtStaticText.setFrameShape(StaticBorderFrameShapeMap[TCustomStaticText(AWinControl).BorderStyle]);
QtStaticText.setFrameShadow(StaticBorderFrameShadowMap[TCustomStaticText(AWinControl).BorderStyle]);
// Returns the Handle
Result := TLCLHandle(QtStaticText);
end;
{------------------------------------------------------------------------------
Method: TQtWSCustomStaticText.SetAlignment
Params: None
Returns: Nothing
------------------------------------------------------------------------------}
class procedure TQtWSCustomStaticText.SetAlignment(
const ACustomStaticText: TCustomStaticText; const NewAlignment: TAlignment);
begin
TQtStaticText(ACustomStaticText.Handle).setAlignment(AlignmentMap[NewAlignment]);
end;
class procedure TQtWSCustomStaticText.SetStaticBorderStyle(
const ACustomStaticText: TCustomStaticText;
const NewBorderStyle: TStaticBorderStyle);
begin
TQtStaticText(ACustomStaticText.Handle).setFrameShape(StaticBorderFrameShapeMap[NewBorderStyle]);
TQtStaticText(ACustomStaticText.Handle).setFrameShadow(StaticBorderFrameShadowMap[NewBorderStyle]);
end;
{ TQtWSButton }
{------------------------------------------------------------------------------
Function: TQtWSButton.CreateHandle
Params: None
Returns: Nothing
Allocates memory and resources for the control and shows it
------------------------------------------------------------------------------}
class function TQtWSButton.CreateHandle(const AWinControl: TWinControl;
const AParams: TCreateParams): TLCLHandle;
var
QtPushButton: TQtPushButton;
begin
QtPushButton := TQtPushButton.Create(AWinControl, AParams);
QtPushButton.AttachEvents;
// Returns the Handle
Result := TLCLHandle(QtPushButton);
end;
class procedure TQtWSButton.SetDefault(const AButton: TCustomButton;
ADefault: Boolean);
var
QtPushButton: TQtPushButton;
begin
if not WSCheckHandleAllocated(AButton, 'SetDefault') then Exit;
QtPushButton := TQtPushButton(AButton.Handle);
QtPushButton.SetDefault(ADefault);
end;
class procedure TQtWSButton.SetShortcut(const AButton: TCustomButton;
const ShortCutK1, ShortCutK2: TShortcut);
begin
if not WSCheckHandleAllocated(AButton, 'SetShortcut') then Exit;
TQtPushButton(AButton.Handle).setShortcut(ShortCutK1, ShortCutK2);
end;
{ TQtWSCustomCheckBox }
{------------------------------------------------------------------------------
Method: TQtWSCustomCheckBox.RetrieveState
Params: None
Returns: Nothing
------------------------------------------------------------------------------}
class function TQtWSCustomCheckBox.RetrieveState(const ACustomCheckBox: TCustomCheckBox): TCheckBoxState;
begin
case TQtCheckBox(ACustomCheckBox.Handle).CheckState of
QtPartiallyChecked: Result := cbGrayed;
QtChecked: Result := cbChecked;
else
Result := cbUnchecked;
end;
end;
{------------------------------------------------------------------------------
Method: TQtWSCustomCheckBox.SetShortCut
Params: None
Returns: Nothing
------------------------------------------------------------------------------}
class procedure TQtWSCustomCheckBox.SetShortCut(const ACustomCheckBox: TCustomCheckBox;
const ShortCutK1, ShortCutK2: TShortCut);
begin
if not WSCheckHandleAllocated(ACustomCheckBox, 'SetShortcut') then Exit;
TQtCheckBox(ACustomCheckBox.Handle).setShortcut(ShortCutK1, ShortCutK2);
end;
{------------------------------------------------------------------------------
Method: TQtWSCustomCheckBox.SetState
Params: None
Returns: Nothing
------------------------------------------------------------------------------}
class procedure TQtWSCustomCheckBox.SetState(const ACustomCheckBox: TCustomCheckBox; const NewState: TCheckBoxState);
var
QtCheckBox: TQtCheckBox;
begin
//enclose the call between Begin/EndUpdate to avoid send LM_CHANGE message
QtCheckBox := TQtCheckBox(ACustomCheckBox.Handle);
QtCheckBox.BeginUpdate;
QtCheckBox.setTriState(ACustomCheckBox.AllowGrayed);
case NewState of
cbGrayed: QtCheckBox.setCheckState(QtPartiallyChecked);
cbChecked: QtCheckBox.setCheckState(QtChecked);
else
QtCheckBox.setCheckState(QtUnchecked);
end;
QtCheckBox.EndUpdate;
end;
class procedure TQtWSCustomCheckBox.SetAlignment(
const ACustomCheckBox: TCustomCheckBox; const NewAlignment: TLeftRight);
begin
if not WSCheckHandleAllocated(ACustomCheckBox, 'SetAlignment') then
Exit;
TQtCheckBox(ACustomCheckBox.Handle).BeginUpdate;
if NewAlignment = taLeftJustify then
QWidget_setLayoutDirection(TQtCheckBox(ACustomCheckBox.Handle).Widget, QtRightToLeft)
else
QWidget_setLayoutDirection(TQtCheckBox(ACustomCheckBox.Handle).Widget, QtLeftToRight);
TQtCheckBox(ACustomCheckBox.Handle).EndUpdate;
end;
class procedure TQtWSCustomCheckBox.ShowHide(const AWinControl: TWinControl);
var
Widget: TQtWidget;
begin
if not WSCheckHandleAllocated(AWincontrol, 'ShowHide') then
Exit;
Widget := TQtWidget(AWinControl.Handle);
Widget.BeginUpdate;
// issue #28437, #30966 - regression from r53365: when FontChanged() is called
// here handle is recreated inside LCL, so we are dead - SEGFAULT.
if AWinControl.HandleObjectShouldBeVisible and
IsFontNameDefault(AWinControl.Font.Name) then
begin
if AWinControl.IsParentFont and Assigned(AWinControl.Parent) then
SetFont(AWinControl, AWinControl.Parent.Font) {DO NOT TOUCH THIS PLEASE !}
else
SetFont(AWinControl, AWinControl.Font); {DO NOT TOUCH THIS PLEASE !}
end;
if TCustomCheckBox(AWinControl).Alignment = taLeftJustify then
QWidget_setLayoutDirection(TQtCheckBox(AWinControl.Handle).Widget, QtRightToLeft)
else
QWidget_setLayoutDirection(TQtCheckBox(AWinControl.Handle).Widget, QtLeftToRight);
Widget.setVisible(AWinControl.HandleObjectShouldBeVisible);
Widget.EndUpdate;
end;
{------------------------------------------------------------------------------
Method: TQtWSCustomCheckBox.CreateHandle
Params: None
Returns: Nothing
Allocates memory and resources for the control and shows it
------------------------------------------------------------------------------}
class function TQtWSCustomCheckBox.CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLHandle;
var
QtCheckBox: TQtCheckBox;
begin
QtCheckBox := TQtCheckBox.Create(AWinControl, AParams);
QtCheckBox.setTriState(TCustomCheckBox(AWinControl).AllowGrayed);
QtCheckBox.AttachEvents;
Result := TLCLHandle(QtCheckBox);
end;
{ TQtWSRadioButton }
{------------------------------------------------------------------------------
Method: TQtWSRadioButton.RetrieveState
Params: None
Returns: The state of the control
------------------------------------------------------------------------------}
class function TQtWSRadioButton.RetrieveState(const ACustomCheckBox: TCustomCheckBox): TCheckBoxState;
begin
if TQtRadioButton(ACustomCheckBox.Handle).isChecked then
Result := cbChecked
else
Result := cbUnchecked;
end;
{------------------------------------------------------------------------------
Method: TQtWSRadioButton.SetShortCut
Params: None
Returns: Nothing
------------------------------------------------------------------------------}
class procedure TQtWSRadioButton.SetShortCut(const ACustomCheckBox: TCustomCheckBox;
const ShortCutK1, ShortCutK2: TShortCut);
begin
TQtRadioButton(ACustomCheckBox.Handle).setShortcut(ShortCutK1, ShortCutK2);
end;
{------------------------------------------------------------------------------
Method: TQtWSRadioButton.SetState
Params: None
Returns: Nothing
Sets the state of the control
------------------------------------------------------------------------------}
class procedure TQtWSRadioButton.SetState(const ACustomCheckBox: TCustomCheckBox; const NewState: TCheckBoxState);
var
QtRadioButton: TQtRadioButton;
begin
//enclose the call between Begin/EndUpdate to avoid send LM_CHANGE message
QtRadioButton := TQtRadioButton(ACustomCheckBox.Handle);
QtRadioButton.BeginUpdate;
QtRadioButton.setChecked(NewState = cbChecked);
QtRadioButton.EndUpdate;
end;
{------------------------------------------------------------------------------
Method: TQtWSRadioButton.CreateHandle
Params: None
Returns: Nothing
Allocates memory and resources for the control and shows it
------------------------------------------------------------------------------}
class function TQtWSRadioButton.CreateHandle(const AWinControl: TWinControl;
const AParams: TCreateParams): TLCLHandle;
var
QtRadioButton: TQtRadioButton;
begin
QtRadioButton := TQtRadioButton.Create(AWinControl, AParams);
QtRadioButton.AttachEvents;
Result := TLCLHandle(QtRadioButton);
end;
{ TQtWSCustomGroupBox }
{------------------------------------------------------------------------------
Method: TQtWSCustomGroupBox.CreateHandle
Params: None
Returns: Nothing
Allocates memory and resources for the control and shows it
------------------------------------------------------------------------------}
class function TQtWSCustomGroupBox.CreateHandle(const AWinControl: TWinControl;
const AParams: TCreateParams): TLCLHandle;
var
QtGroupBox: TQtGroupBox;
begin
QtGroupBox := TQtGroupBox.Create(AWinControl, AParams);
QtGroupBox.AttachEvents;
Result := TLCLHandle(QtGroupBox);
end;
class function TQtWSCustomGroupBox.GetDefaultClientRect(
const AWinControl: TWinControl; const aLeft, aTop, aWidth, aHeight: integer;
var aClientRect: TRect): boolean;
var
dx, dy: integer;
begin
Result:=false;
if AWinControl.HandleAllocated then
begin
end else
begin
dx := GetPixelMetric(QStylePM_LayoutLeftMargin, nil, nil) +
GetPixelMetric(QStylePM_LayoutRightMargin, nil, nil);
dy := GetPixelMetric(QStylePM_LayoutTopMargin, nil, nil) +
GetPixelMetric(QStylePM_LayoutBottomMargin, nil, nil);
aClientRect:=Rect(0,0,
Max(0, aWidth - dx),
Max(0, aHeight - dy));
Result:=true;
end;
end;
class procedure TQtWSCustomGroupBox.GetPreferredSize(
const AWinControl: TWinControl; var PreferredWidth, PreferredHeight: integer;
WithThemeSpace: Boolean);
begin
if AWinControl.HandleAllocated then
TQtGroupBox(AWinControl.Handle).PreferredSize(PreferredWidth,
PreferredHeight, WithThemeSpace);
end;
{ TQtWSCustomComboBox }
{------------------------------------------------------------------------------
Method: TQtWSCustomComboBox.CreateHandle
Params: None
Returns: Nothing
Allocates memory and resources for the control and shows it
------------------------------------------------------------------------------}
class function TQtWSCustomComboBox.CreateHandle(const AWinControl: TWinControl;
const AParams: TCreateParams): TLCLHandle;
var
QtComboBox: TQtComboBox;
ItemIndex: Integer;
Text: String;
begin
QtComboBox := TQtComboBox.Create(AWinControl, AParams);
// create our FList helper
QtComboBox.FList := TQtComboStrings.Create(AWinControl, QtComboBox);
QtComboBox.setMaxVisibleItems(TCustomComboBox(AWinControl).DropDownCount);
// load combo data imediatelly and set LCLs itemIndex and Text otherwise
// qt will set itemindex to 0 if lcl itemindex = -1.
ItemIndex := TCustomComboBox(AWinControl).ItemIndex;
Text := TCustomComboBox(AWinControl).Text;
QtComboBox.FList.Assign(TCustomComboBox(AWinControl).Items);
QtComboBox.setCurrentIndex(ItemIndex);
QtComboBox.setText(Text{%H-});
QtComboBox.setEditable((AParams.Style and CBS_DROPDOWN <> 0) or
(AParams.Style and CBS_SIMPLE <> 0));
QtComboBox.DropList.setUniformItemSizes(AParams.Style and CBS_OWNERDRAWFIXED <> 0);
QtComboBox.AttachEvents;
QtComboBox.OwnerDrawn := (AParams.Style and CBS_OWNERDRAWFIXED <> 0) or
(AParams.Style and CBS_OWNERDRAWVARIABLE <> 0);
Result := TLCLHandle(QtComboBox);
end;
class function TQtWSCustomComboBox.GetDroppedDown(
const ACustomComboBox: TCustomComboBox): Boolean;
var
QtComboBox: TQtComboBox;
begin
Result := False;
if not WSCheckHandleAllocated(ACustomComboBox, 'GetDroppedDown') then
Exit;
QtComboBox := TQtComboBox(ACustomComboBox.Handle);
Result := QtComboBox.getDroppedDown;
end;
{------------------------------------------------------------------------------
Method: TQtWSCustomComboBox.GetItemIndex
Params: None
Returns: The state of the control
------------------------------------------------------------------------------}
class function TQtWSCustomComboBox.GetItemIndex(
const ACustomComboBox: TCustomComboBox): integer;
var
QtComboBox: TQtComboBox;
WStr, WStr2: WideString;
i: Integer;
begin
Result := -1;
if not WSCheckHandleAllocated(ACustomComboBox, 'GetItemIndex') then
Exit;
QtComboBox := TQtComboBox(ACustomComboBox.Handle);
if QtComboBox.getEditable then
begin
Result := QtComboBox.findText(QtComboBox.getText);
if Result = -1 then
exit;
Result := QtComboBox.currentIndex;
end else
Result := QtComboBox.currentIndex;
end;
class function TQtWSCustomComboBox.GetMaxLength(
const ACustomComboBox: TCustomComboBox): integer;
var
LineEdit: TQtLineEdit;
begin
Result := 0;
if not WSCheckHandleAllocated(ACustomComboBox, 'GetMaxLength') then
Exit;
LineEdit := TQtComboBox(ACustomComboBox.Handle).LineEdit;
if LineEdit <> nil then
begin
Result := LineEdit.getMaxLength;
if Result = QtMaxEditLength then
Result := 0;
end;
end;
{------------------------------------------------------------------------------
Set's the size of a TComboBox when autosized
------------------------------------------------------------------------------}
class procedure TQtWSCustomComboBox.GetPreferredSize(
const AWinControl: TWinControl; var PreferredWidth, PreferredHeight: integer;
WithThemeSpace: Boolean);
begin
if AWinControl.HandleAllocated then
TQtWidget(AWinControl.Handle).PreferredSize(PreferredWidth,
PreferredHeight, WithThemeSpace);
// The correct behavior for the LCL is not forcing any specific value for
// TComboBox.Width, so we set it to zero to signal that here
PreferredWidth := 0;
end;
class function TQtWSCustomComboBox.GetSelStart(const ACustomComboBox: TCustomComboBox): integer;
var
Widget: TQtWidget;
QtEdit: IQtEdit;
begin
Result := 0;
if not WSCheckHandleAllocated(ACustomComboBox, 'GetSelStart') then
Exit;
Widget := TQtWidget(ACustomComboBox.Handle);
if Supports(Widget, IQtEdit, QtEdit) then
Result := QtEdit.getSelectionStart;
end;
class function TQtWSCustomComboBox.GetSelLength(const ACustomComboBox: TCustomComboBox): integer;
var
Widget: TQtWidget;
QtEdit: IQtEdit;
begin
Result := 0;
if not WSCheckHandleAllocated(ACustomComboBox, 'GetSelLength') then
Exit;
Widget := TQtWidget(ACustomComboBox.Handle);
if Supports(Widget, IQtEdit, QtEdit) then
Result := QtEdit.getSelectionLength;
end;
class procedure TQtWSCustomComboBox.SetSelStart(const ACustomComboBox: TCustomComboBox;
NewStart: integer);
var
Widget: TQtWidget;
QtEdit: IQtEdit;
// ALength: Integer;
begin
if not WSCheckHandleAllocated(ACustomComboBox, 'SetSelStart') then
Exit;
Widget := TQtWidget(ACustomComboBox.Handle);
// issue #11802, make qt consistent with gtk2 and win32.
// Delphi docs says that setting selection start should reset sellength !
// ALength := GetSelLength(ACustomComboBox);
if Supports(Widget, IQtEdit, QtEdit) then
QtEdit.setSelection(NewStart, 0);
end;
class procedure TQtWSCustomComboBox.SetSelLength(
const ACustomComboBox: TCustomComboBox; NewLength: integer);
var
Widget: TQtWidget;
QtEdit: IQtEdit;
AStart: Integer;
begin
if not WSCheckHandleAllocated(ACustomComboBox, 'SetSelLength') then
Exit;
Widget := TQtWidget(ACustomComboBox.Handle);
AStart := GetSelStart(ACustomComboBox);
if Supports(Widget, IQtEdit, QtEdit) then
QtEdit.setSelection(AStart, NewLength);
end;
class procedure TQtWSCustomComboBox.SetArrowKeysTraverseList(
const ACustomComboBox: TCustomComboBox; NewTraverseList: boolean);
begin
{$note implement TQtWSCustomComboBox.SetArrowKeysTraverseList}
end;
class procedure TQtWSCustomComboBox.SetDropDownCount(
const ACustomComboBox: TCustomComboBox; NewCount: Integer);
begin
if not WSCheckHandleAllocated(ACustomComboBox, 'SetDropDownCount') then
Exit;
TQtComboBox(ACustomComboBox.Handle).setMaxVisibleItems(NewCount);
end;
class procedure TQtWSCustomComboBox.SetDroppedDown(
const ACustomComboBox: TCustomComboBox; ADroppedDown: Boolean);
var
QtComboBox: TQtComboBox;
begin
if not WSCheckHandleAllocated(ACustomComboBox, 'SetDroppedDown') then
Exit;
QtComboBox := TQtComboBox(ACustomComboBox.Handle);
QtComboBox.setDroppedDown(ADroppedDown);
end;
{------------------------------------------------------------------------------
Method: TQtWSCustomComboBox.SetItemIndex
Params: None
Returns: The state of the control
------------------------------------------------------------------------------}
class procedure TQtWSCustomComboBox.SetItemIndex(const ACustomComboBox: TCustomComboBox; NewIndex: integer);
begin
if not WSCheckHandleAllocated(ACustomComboBox, 'SetItemIndex') then
Exit;
TQtComboBox(ACustomComboBox.Handle).setCurrentIndex(NewIndex);
end;
class procedure TQtWSCustomComboBox.SetMaxLength(
const ACustomComboBox: TCustomComboBox; NewLength: integer);
var
Widget: TQtWidget;
QtEdit: IQtEdit;
MaxLength: Integer;
begin
if not WSCheckHandleAllocated(ACustomComboBox, 'SetMaxLength') then
Exit;
Widget := TQtWidget(ACustomComboBox.Handle);
if Supports(Widget, IQtEdit, QtEdit) then
begin
// qt doesn't accept -1
MaxLength := QtEdit.getMaxLength;
if (NewLength <= 0) or (NewLength > QtMaxEditLength) then
NewLength := QtMaxEditLength;
if NewLength <> MaxLength then
QtEdit.setMaxLength(NewLength);
end;
end;
class procedure TQtWSCustomComboBox.SetStyle(
const ACustomComboBox: TCustomComboBox; NewStyle: TComboBoxStyle);
begin
TQtComboBox(ACustomComboBox.Handle).setEditable(NewStyle.HasEditBox);
TQtComboBox(ACustomComboBox.Handle).OwnerDrawn := NewStyle.IsOwnerDrawn;
// TODO: implement styles: csSimple
inherited SetStyle(ACustomComboBox, NewStyle);
end;
class procedure TQtWSCustomComboBox.SetReadOnly(const ACustomComboBox: TCustomComboBox; NewReadOnly: boolean);
var
LineEdit : TQtLineEdit;
begin
if not WSCheckHandleAllocated(ACustomComboBox, 'SetReadOnly') then
Exit;
LineEdit := TQtComboBox(ACustomComboBox.Handle).LineEdit;
if LineEdit <> nil then
LineEdit.setReadOnly(NewReadOnly);
end;
class procedure TQtWSCustomComboBox.SetTextHint(
const ACustomComboBox: TCustomComboBox; const ATextHint: string);
var
Widget: TQtWidget;
QtEdit: IQtEdit;
begin
Widget := TQtWidget(ACustomComboBox.Handle);
if Supports(Widget, IQtEdit, QtEdit) then
QtEdit.setTextHint(ATextHint);
end;
{------------------------------------------------------------------------------
Method: TQtWSCustomComboBox.GetItems
Params: None
Returns: ComboBox items
------------------------------------------------------------------------------}
class function TQtWSCustomComboBox.GetItems(const ACustomComboBox: TCustomComboBox): TStrings;
var
ComboBox: TQtComboBox;
begin
if not WSCheckHandleAllocated(ACustomComboBox, 'GetItems') then
Exit(Nil);
ComboBox := TQtComboBox(ACustomComboBox.Handle);
if not Assigned(ComboBox.FList) then
begin
ComboBox.BeginUpdate;
ComboBox.FList := TQtComboStrings.Create(ACustomComboBox, ComboBox);
ComboBox.EndUpdate;
end;
Result := ComboBox.FList;
end;
class procedure TQtWSCustomComboBox.Sort(
const ACustomComboBox: TCustomComboBox; AList: TStrings; IsSorted: boolean);
begin
TQtComboStrings(AList).Sorted := IsSorted;
end;
class function TQtWSCustomComboBox.GetItemHeight(
const ACustomComboBox: TCustomComboBox): Integer;
var
ComboBox: TQtComboBox;
AText: WideString;
ACombo: QComboBoxH;
AItems: QStringListH;
begin
Result := 0;
if not WSCheckHandleAllocated(ACustomComboBox, 'GetItemHeight') then
Exit;
{only for csDropDown, csDropDownList, csSimple}
ComboBox := TQtComboBox(ACustomComboBox.Handle);
if ACustomComboBox.Items.Count > 0 then
Result := ComboBox.DropList.getRowHeight(0)
else
begin
// no way to get themed item size, so we must construct dummy QComboBox
// with one item.
ACombo := QComboBox_create(nil);
try
QWidget_setFont(ACombo, ComboBox.getFont);
QComboBox_setEditable(ACombo, ACustomComboBox.Style.HasEditBox);
AText := 'Mtjx';
AItems := QStringList_create(PWideString(@AText));
QComboBox_addItems(ACombo, AItems);
QStringList_destroy(AItems);
Result := QAbstractItemView_sizeHintForRow(QComboBox_view(ACombo), 0);
finally
QComboBox_destroy(ACombo);
end;
end;
end;
class procedure TQtWSCustomComboBox.SetItemHeight(
const ACustomComboBox: TCustomComboBox; const AItemHeight: Integer);
var
ComboBox: TQtComboBox;
begin
if not WSCheckHandleAllocated(ACustomComboBox, 'SetItemHeight') then
Exit;
{only for OwnerDrawn}
ComboBox := TQtComboBox(ACustomComboBox.Handle);
if ComboBox.getDroppedDown then
begin
ComboBox.DropList.setUniformItemSizes(False);
ComboBox.DropList.setUniformItemSizes(ACustomComboBox.Style.IsOwnerDrawn);
end else
RecreateWnd(ACustomComboBox);
end;
{ TQtWSToggleBox }
{------------------------------------------------------------------------------
Method: TQtWSToggleBox.RetrieveState
Params: None
Returns: Nothing
------------------------------------------------------------------------------}
class function TQtWSToggleBox.RetrieveState(const ACustomCheckBox: TCustomCheckBox): TCheckBoxState;
begin
Result := cbUnChecked;
if not WSCheckHandleAllocated(ACustomCheckBox, 'RetrieveState') then
Exit;
if TQtToggleBox(ACustomCheckBox.Handle).isChecked then
Result := cbChecked;
end;
{------------------------------------------------------------------------------
Method: TQtWSToggleBox.SetShortCut
Params: None
Returns: Nothing
------------------------------------------------------------------------------}
class procedure TQtWSToggleBox.SetShortCut(const ACustomCheckBox: TCustomCheckBox;
const ShortCutK1, ShortCutK2: TShortCut);
begin
if not WSCheckHandleAllocated(ACustomCheckBox, 'SetShortCut') then
Exit;
TQtToggleBox(ACustomCheckBox.Handle).setShortcut(ShortCutK1, ShortCutK2);
end;
{------------------------------------------------------------------------------
Method: TQtWSToggleBox.SetState
Params: None
Returns: Nothing
------------------------------------------------------------------------------}
class procedure TQtWSToggleBox.SetState(const ACustomCheckBox: TCustomCheckBox; const NewState: TCheckBoxState);
begin
if not WSCheckHandleAllocated(ACustomCheckBox, 'SetState') then
Exit;
TQtToggleBox(ACustomCheckBox.Handle).BeginUpdate;
TQtToggleBox(ACustomCheckBox.Handle).setChecked(NewState = cbChecked);
TQtToggleBox(ACustomCheckBox.Handle).EndUpdate;
end;
{------------------------------------------------------------------------------
Method: TQtWSToggleBox.CreateHandle
Params: None
Returns: Nothing
Allocates memory and resources for the control and shows it
------------------------------------------------------------------------------}
class function TQtWSToggleBox.CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLHandle;
var
QtToggleBox: TQtToggleBox;
begin
QtToggleBox := TQtToggleBox.Create(AWinControl, AParams);
QtToggleBox.setCheckable(True);
QtToggleBox.AttachEvents;
Result := TLCLHandle(QtToggleBox);
end;
end.