diff --git a/components/exctrls/examples/CheckComboBoxEx/demo.lpi b/components/exctrls/examples/CheckComboBoxEx/demo.lpi
new file mode 100644
index 000000000..7eacddfbe
--- /dev/null
+++ b/components/exctrls/examples/CheckComboBoxEx/demo.lpi
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
diff --git a/components/exctrls/examples/CheckComboBoxEx/demo.lpr b/components/exctrls/examples/CheckComboBoxEx/demo.lpr
new file mode 100644
index 000000000..b1e90102e
--- /dev/null
+++ b/components/exctrls/examples/CheckComboBoxEx/demo.lpr
@@ -0,0 +1,25 @@
+program demo;
+
+{$mode objfpc}{$H+}
+
+uses
+ {$IFDEF UNIX}
+ cthreads,
+ {$ENDIF}
+ {$IFDEF HASAMIGA}
+ athreads,
+ {$ENDIF}
+ Interfaces, // this includes the LCL widgetset
+ Forms, runtimetypeinfocontrols, Main
+ { you can add units after this };
+
+{$R *.res}
+
+begin
+ RequireDerivedFormResource:=True;
+ Application.Scaled:=True;
+ Application.Initialize;
+ Application.CreateForm(TMainForm, MainForm);
+ Application.Run;
+end.
+
diff --git a/components/exctrls/examples/CheckComboBoxEx/main.lfm b/components/exctrls/examples/CheckComboBoxEx/main.lfm
new file mode 100644
index 000000000..440cc98cb
--- /dev/null
+++ b/components/exctrls/examples/CheckComboBoxEx/main.lfm
@@ -0,0 +1,96 @@
+object MainForm: TMainForm
+ Left = 261
+ Height = 335
+ Top = 139
+ Width = 706
+ Caption = 'CheckComboBoxEx Demonstration'
+ ClientHeight = 335
+ ClientWidth = 706
+ OnCreate = FormCreate
+ LCLVersion = '2.3.0.0'
+ object Memo1: TMemo
+ Left = 196
+ Height = 323
+ Top = 6
+ Width = 279
+ Align = alRight
+ BorderSpacing.Around = 6
+ ScrollBars = ssAutoVertical
+ TabOrder = 0
+ end
+ object TIPropertyGrid1: TTIPropertyGrid
+ Left = 492
+ Height = 323
+ Top = 6
+ Width = 208
+ Align = alRight
+ BackgroundColor = clWindow
+ BorderSpacing.Around = 6
+ CheckboxForBoolean = True
+ DefaultValueFont.Color = clWindowText
+ Filter = [tkInteger, tkChar, tkEnumeration, tkFloat, tkSet, tkMethod, tkSString, tkLString, tkAString, tkWString, tkVariant, tkArray, tkRecord, tkInterface, tkClass, tkObject, tkWChar, tkBool, tkInt64, tkQWord, tkDynArray, tkInterfaceRaw, tkProcVar, tkUString, tkUChar, tkHelper, tkFile, tkClassRef, tkPointer]
+ Indent = 16
+ NameFont.Color = clWindowText
+ ValueFont.Color = clMaroon
+ end
+ object Splitter1: TSplitter
+ Left = 185
+ Height = 335
+ Top = 0
+ Width = 5
+ Align = alRight
+ ResizeAnchor = akRight
+ end
+ object Splitter2: TSplitter
+ Left = 481
+ Height = 335
+ Top = 0
+ Width = 5
+ Align = alRight
+ ResizeAnchor = akRight
+ end
+ object Panel1: TPanel
+ Left = 0
+ Height = 335
+ Top = 0
+ Width = 185
+ Align = alClient
+ BevelOuter = bvNone
+ ClientHeight = 335
+ ClientWidth = 185
+ TabOrder = 4
+ object Button4: TButton
+ Left = 16
+ Height = 25
+ Top = 269
+ Width = 74
+ Anchors = [akLeft, akBottom]
+ AutoSize = True
+ Caption = 'Check all'
+ OnClick = Button4Click
+ TabOrder = 0
+ end
+ object Button5: TButton
+ Left = 96
+ Height = 25
+ Top = 269
+ Width = 87
+ Anchors = [akLeft, akBottom]
+ AutoSize = True
+ Caption = 'Uncheck all'
+ OnClick = Button5Click
+ TabOrder = 1
+ end
+ object Button1: TButton
+ Left = 16
+ Height = 25
+ Top = 301
+ Width = 108
+ Anchors = [akLeft, akBottom]
+ AutoSize = True
+ Caption = 'Toggle "Item 1"'
+ OnClick = Button1Click
+ TabOrder = 2
+ end
+ end
+end
diff --git a/components/exctrls/examples/CheckComboBoxEx/main.pas b/components/exctrls/examples/CheckComboBoxEx/main.pas
new file mode 100644
index 000000000..081dead66
--- /dev/null
+++ b/components/exctrls/examples/CheckComboBoxEx/main.pas
@@ -0,0 +1,102 @@
+unit Main;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, Forms, Controls, Graphics, Dialogs, EditBtn, CheckLst,
+ StdCtrls, ExtCtrls, RTTIGrids, ExCheckCombo, PropEdits, ObjectInspector;
+
+type
+
+ { TMainForm }
+
+ TMainForm = class(TForm)
+ Button1: TButton;
+ Button4: TButton;
+ Button5: TButton;
+ Memo1: TMemo;
+ Panel1: TPanel;
+ Splitter1: TSplitter;
+ Splitter2: TSplitter;
+ TIPropertyGrid1: TTIPropertyGrid;
+ procedure Button1Click(Sender: TObject);
+ procedure Button4Click(Sender: TObject);
+ procedure Button5Click(Sender: TObject);
+ procedure FormCreate(Sender: TObject);
+ private
+ FCombo: TCheckComboBoxEx;
+ procedure CheckComboChange(Sender: TObject);
+ procedure CheckComboItemChange(Sender: TObject; Index: Integer);
+ procedure CheckComboItemClick(Sender: TObject; Index: Integer);
+
+ public
+
+ end;
+
+var
+ MainForm: TMainForm;
+
+implementation
+
+{$R *.lfm}
+
+{ TMainForm }
+
+procedure TMainForm.FormCreate(Sender: TObject);
+begin
+ FCombo := TCheckComboBoxEx.Create(self);
+ FCombo.Align := alTop;
+ FCombo.BorderSpacing.Around := 6;
+ FCombo.AutoDropDown := true;
+ FCombo.Items.Add('Item 1');
+ FCombo.Items.Add('Item 2');
+ FCombo.Items.Add('Item 3');
+ FCombo.AddItem('Item 4', true);
+ FCombo.AddItem('Item 5', true, false);
+ FCombo.AddItem('Item 0');
+ FCombo.Parent := Panel1;
+ FCombo.Hint := 'Default hint';
+ FCombo.TextHint := 'Check items, please...';
+ FCombo.OnChange := @CheckComboChange;
+ FCombo.OnItemChange := @CheckComboItemChange;
+ FCombo.OnItemClick := @CheckComboItemClick;
+
+ TIPropertyGrid1.TIObject := FCombo;
+
+ ActiveControl := FCombo;
+end;
+
+procedure TMainForm.CheckComboChange(Sender: TObject);
+begin
+ Memo1.Lines.Add('CheckComboBoxEx.OnChange');
+end;
+
+procedure TMainForm.CheckComboItemChange(Sender: TObject; Index: Integer);
+begin
+ Memo1.Lines.Add('CheckComboBoxEx.OnItemChange, Index ' + Index.ToString);
+end;
+
+procedure TMainForm.CheckComboItemClick(Sender: TObject; Index: Integer);
+begin
+ Memo1.Lines.Add('CheckComboBoxEx.OnItemClick, Index ' + Index.ToString);
+end;
+
+procedure TMainForm.Button1Click(Sender: TObject);
+begin
+ FCombo.Checked[0] := not FCombo.Checked[0];
+end;
+
+procedure TMainForm.Button4Click(Sender: TObject);
+begin
+ FCombo.CheckAll(cbChecked);;
+end;
+
+procedure TMainForm.Button5Click(Sender: TObject);
+begin
+ FCombo.CheckAll(cbUnchecked);
+end;
+
+end.
+
diff --git a/components/exctrls/exctrlspkg.lpk b/components/exctrls/exctrlspkg.lpk
index 40676a88b..7ef1b82b5 100644
--- a/components/exctrls/exctrlspkg.lpk
+++ b/components/exctrls/exctrlspkg.lpk
@@ -9,6 +9,7 @@
+
@@ -18,7 +19,7 @@
- TRadioButton, TCheckbox, TRadioGroup and TCheckGroup: drawn by ThemeServices/Canvas, not by widgetset, button/text layout, wordwrap, user-provided check images
- TColumnComboBoxEx"/>
-
+
@@ -40,6 +41,10 @@
+
+
+
+
diff --git a/components/exctrls/exctrlspkg.pas b/components/exctrls/exctrlspkg.pas
index d1f919833..997e8d46b 100644
--- a/components/exctrls/exctrlspkg.pas
+++ b/components/exctrls/exctrlspkg.pas
@@ -8,7 +8,8 @@ unit ExCtrlsPkg;
interface
uses
- ExCheckCtrls, ExEditCtrls, ExCtrlsReg, ExButtons, ExCombo, LazarusPackageIntf;
+ ExCheckCtrls, ExEditCtrls, ExCtrlsReg, ExButtons, ExCombo, ExCheckCombo,
+ LazarusPackageIntf;
implementation
diff --git a/components/exctrls/images/imagelist.txt b/components/exctrls/images/imagelist.txt
index 969e87d03..dbc21413c 100644
--- a/components/exctrls/images/imagelist.txt
+++ b/components/exctrls/images/imagelist.txt
@@ -22,3 +22,6 @@ tfloatsispineditex_200.png
tcolumncomboboxex.png
tcolumncomboboxex_150.png
tcolumncomboboxex_200.png
+tcheckcomboboxex.png
+tcheckcomboboxex_150.png
+tcheckcomboboxex_200.png
diff --git a/components/exctrls/source/excheckcombo.pas b/components/exctrls/source/excheckcombo.pas
new file mode 100644
index 000000000..b61fe44e3
--- /dev/null
+++ b/components/exctrls/source/excheckcombo.pas
@@ -0,0 +1,645 @@
+unit ExCheckCombo;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ LCLIntf, LCLType, LMessages,
+ Classes, SysUtils, Controls, StdCtrls, GroupedEdit, EditBtn, CheckLst, Forms;
+
+type
+ { TCheckComboBoxEx }
+
+ TCheckItemChange = procedure(Sender: TObject; AIndex: Integer) of object;
+ TCheckComboBoxHintMode = (cbhmDefault, cbhmItems);
+
+ TCheckComboBoxEx = class(TEditButton)
+ private
+ FAutoDropDown: Boolean;
+ FCheckListBox: TCheckListBox;
+ FDelimiter: Char;
+ FDropDownCount: Integer;
+ FDropDownForm: TForm;
+ FDroppedDown: Boolean;
+ FEscCancels: Boolean;
+ FItemIndex: Integer;
+ FItemWidth: Integer;
+ FHintMode: TCheckComboBoxHintMode;
+ FSavedChecks: array of Integer;
+ FOnChange: TNotifyEvent;
+ FOnCloseUp: TNotifyEvent;
+ FOnDropDown: TNotifyEvent;
+ FOnItemChange: TCheckItemChange;
+ FOnItemClick: TCheckListClicked;
+ procedure CloseUpHandler(Sender: TObject);
+ function GetAllowGrayed: Boolean;
+ function GetChecked(AIndex: Integer): Boolean;
+ function GetItemEnabled(AIndex: Integer): Boolean;
+ function GetItemIndex: Integer;
+ function GetItems: TStrings;
+ function GetSorted: Boolean;
+ function GetState(AIndex: Integer): TCheckBoxState;
+ procedure ItemClickHandler(Sender: TObject; AIndex: Integer);
+ procedure SetAllowGrayed(AValue: Boolean);
+ procedure SetChecked(AIndex: Integer; const AValue: Boolean);
+ procedure SetDelimiter(AValue: Char);
+ procedure SetDropDownCount(AValue: Integer);
+ procedure SetItemEnabled(AIndex: Integer; const AValue: Boolean);
+ procedure SetItemIndex(AValue: Integer);
+ procedure SetItems(const AValue: TStrings);
+ procedure SetItemWidth(AValue: Integer);
+ procedure SetSorted(AValue: Boolean);
+ procedure SetState(AIndex: Integer; const AValue: TCheckboxState);
+ protected
+ procedure ButtonClick; override;
+ procedure CloseUp;
+ procedure DoEnter; override;
+ procedure DoChange; virtual;
+ procedure DoItemChange(AIndex: Integer); virtual;
+ procedure DoCloseUp; virtual;
+ procedure DoDropDown; virtual;
+ procedure DoItemClick(AIndex: Integer); virtual;
+ procedure DoOnShowHint(HintInfo: PHintInfo); override;
+ procedure EditKeyDown(var Key: Word; Shift: TShiftState); override;
+ function GetBuddyClassType: TControlClass; override;
+ function GetEditorClassType: TGEEditClass; override;
+ procedure RestoreInitialChecks;
+ procedure SaveInitialChecks;
+ procedure SetBiDiMode(AValue: TBiDiMode); override;
+ procedure ShowPopup;
+ procedure UpdateCaption;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ function AddItem(AText: String; AChecked: Boolean = false; AEnabled: Boolean = true): Integer;
+ procedure CheckAll(AState: TCheckBoxState; aAllowGrayed: Boolean = true; aAllowDisabled: Boolean = true);
+ procedure Clear;
+ procedure Toggle(AIndex: Integer);
+ // public properties
+ property Checked[AIndex: Integer]: Boolean read GetChecked write SetChecked;
+ property DroppedDown: Boolean read FDroppedDown;
+ property ItemEnabled[AIndex: Integer]: Boolean read GetItemEnabled write SetItemEnabled;
+ property Text;
+ published
+ property AllowGrayed: Boolean read GetAllowGrayed write SetAllowGrayed default false;
+ property AutoDropDown: Boolean read FAutoDropDown write FAutoDropDown default false;
+ property Delimiter: char read FDelimiter write SetDelimiter default ';';
+ property DropDownCount: Integer read FDropDownCount write SetDropDownCount default 8;
+ property EscCancels: Boolean read FEscCancels write FEscCancels default true;
+ property HintMode: TCheckComboBoxHintMode read FHintMode write FHintMode default cbhmDefault;
+ property ItemIndex: Integer read FItemIndex write SetItemIndex default -1;
+ property Items: TStrings read GetItems write SetItems;
+ property ItemWidth: Integer read FItemWidth write FItemWidth default 0;
+ property Sorted: Boolean read GetSorted write SetSorted default false;
+ property OnChange: TNotifyEvent read FOnChange write FOnChange;
+ property OnCloseUp: TNotifyEvent read FOnCloseUp write FOnCloseUp;
+ property OnDropDown: TNotifyEvent read FOnDropDown write FOnDropDown;
+ property OnItemChange: TCheckItemChange read FOnItemChange write FOnItemChange;
+ property OnItemClick: TCheckListClicked read FOnItemClick write FOnItemClick;
+ // inherited properties
+ property Align;
+ property Anchors;
+ property AutoSize;
+ property BiDiMode;
+ property BorderSpacing;
+ property Color;
+ property Constraints;
+ property DragCursor;
+ property DragKind;
+ property DragMode;
+ property Enabled;
+ property Font;
+ property Hint;
+ property ParentBidiMode;
+ property ParentColor;
+ property ParentFont;
+ property ParentShowHint;
+ property PopupMenu;
+ property ShowHint;
+ property Spacing default 0;
+ property TabOrder;
+ property TabStop;
+ property TextHint;
+ property Visible;
+ // inherited events
+ property OnChangeBounds;
+ property OnClick;
+ property OnContextPopup;
+ property OnDblClick;
+ property OnDragDrop;
+ property OnDragOver;
+ property OnEndDrag;
+ property OnEnter;
+ property OnExit;
+ property OnKeyDown;
+ property OnKeyPress;
+ property OnKeyUp;
+ property OnMouseDown;
+ property OnMouseEnter;
+ property OnMouseLeave;
+ property OnMouseMove;
+ property OnMouseUp;
+ property OnStartDrag;
+ end;
+
+
+implementation
+
+uses
+ Buttons, Themes, WSForms;
+
+{ TCCBEdit } // CCB = CheckComboBox
+type
+ TCCBEdit = class(TEbEdit)
+ protected
+ procedure DoOnShowHint(HintInfo: PHintInfo); override;
+ end;
+
+procedure TCCBEdit.DoOnShowHint(HintInfo: PHintInfo);
+begin
+ (Parent as TCheckComboBoxEx).DoOnShowHint(HintInfo);
+end;
+
+
+{ TCCBButton }
+type
+ TCCBButton = class(TSpeedButton)
+ protected
+ procedure DoOnShowHint(HintInfo: PHintInfo); override;
+ procedure Paint; override;
+ end;
+
+procedure TCCBButton.DoOnShowHint(HintInfo: PHintInfo);
+begin
+ (Parent as TCheckComboBoxEx).DoOnShowHint(HintInfo);
+end;
+
+procedure TCCBButton.Paint;
+const
+ DETAILS: array[TButtonState] of TThemedComboBox = (
+ tcDropDownButtonNormal, // bsUp = button is up
+ tcDropDownButtonDisabled, // bsDisabled = button is disabled
+ tcDropDownButtonPressed, // bsPressed = button is down
+ tcDropDownButtonPressed, // (not used)
+ tcDropDownButtonHot // bsHot = mouse is under mouse
+ );
+var
+ detail: TThemedElementDetails;
+begin
+ inherited Paint;
+ detail := ThemeServices.GetElementDetails(DETAILS[FState]);
+ ThemeServices.DrawElement(Canvas.Handle, detail, ClientRect);
+end;
+
+
+{ TCheckComboBoxForm }
+type
+ TCheckComboBoxForm = class(TForm)
+ private
+ FCaller: TControl;
+ FCheckListBox: TCheckListBox;
+ FDropDownCount: Integer;
+ protected
+ procedure ActivateDoubleBuffered;
+ procedure DblClickHandler(Sender: TObject);
+ procedure Deactivate; override;
+ procedure KeepInView(APopupOrigin: TPoint);
+ procedure KeyDownHandler(Sender: TObject; var Key: Word; Shift: TShiftState);
+ procedure MeasureHeight(out AHeight: Integer);
+ public
+ constructor CreateNew(AOwner: TComponent; Num: Integer = 0); override;
+ procedure Initialize(ADropdownCount: Integer; APosition: TPoint; AWidth: Integer);
+ end;
+
+constructor TCheckComboBoxForm.CreateNew(AOwner: TComponent; Num: Integer = 0);
+begin
+ inherited CreateNew(AOwner, Num);
+ BorderStyle := bsNone;
+ FCheckListbox := TCheckListbox.Create(self);
+ FCheckListbox.Align := alClient;
+ FCheckListbox.Parent := self;
+ FCheckListbox.OnDblClick := @DblClickHandler;
+ FCheckListbox.OnKeyDown := @KeyDownHandler;
+ FDropDownCount := 8;
+end;
+
+procedure TCheckComboBoxForm.ActivateDoubleBuffered;
+begin
+ DoubleBuffered := TWSCustomFormClass(WidgetSetClass).GetDefaultDoubleBuffered;
+end;
+
+procedure TCheckComboBoxForm.Deactivate;
+begin
+ Close;
+end;
+
+procedure TCheckComboboxForm.DblClickHandler(Sender: TObject);
+begin
+ Close;
+end;
+
+procedure TCheckComboBoxForm.Initialize(ADropDownCount: Integer;
+ APosition: TPoint; AWidth: Integer);
+var
+ h: Integer;
+begin
+ FDropDownCount := ADropDownCount;
+ MeasureHeight(h);
+ SetBounds(APosition.X, APosition.Y, AWidth, h);
+ KeepInView(APosition);
+ AutoScroll := FCheckListBox.Items.Count > FDropDownCount;
+end;
+
+procedure TCheckComboBoxForm.KeepInView(APopupOrigin: TPoint);
+var
+ R: TRect;
+begin
+ R := Screen.MonitorFromPoint(APopupOrigin).WorkAreaRect; // take care of taskbar
+
+ if APopupOrigin.X + Width > R.Right then
+ Left := R.Right - Width
+ else if APopupOrigin.X < R.Left then
+ Left := R.Left
+ else
+ Left := APopupOrigin.X;
+
+ if APopupOrigin.Y + Height > R.Bottom then
+ begin
+ if Assigned(FCaller) then
+ Top := APopupOrigin.Y - FCaller.Height - Height
+ else
+ Top := R.Bottom - Height;
+ end else if APopupOrigin.Y < R.Top then
+ Top := R.Top
+ else
+ Top := APopupOrigin.Y;
+
+ if Left < R.Left then Left := 0;
+ if Top < R.Top then Top := 0;
+end;
+
+procedure TCheckComboBoxForm.KeyDownHandler(Sender: TObject; var Key: Word;
+ Shift: TShiftState);
+begin
+ inherited;
+ if (Key = VK_ESCAPE) and TCheckComboBoxEx(FCaller).EscCancels then
+ TCheckComboBoxEx(FCaller).RestoreInitialChecks;
+ if (Key = VK_ESCAPE) or (Key = VK_TAB) or (Key = VK_RETURN) or
+ (((Key = VK_UP) or (Key = VK_DOWN)) and (Shift = [ssAlt]))
+ then
+ Close;
+end;
+
+procedure TCheckComboBoxForm.MeasureHeight(out AHeight: Integer);
+var
+ i: Integer;
+ h: Integer;
+begin
+ AHeight := 0;
+ for i := 0 to FCheckListbox.Items.Count-1 do
+ if i < FDropDownCount then
+ begin
+ FCheckListbox.MeasureItem(i, h);
+ inc(AHeight,h);
+ end;
+ inc(AHeight, 6);
+end;
+
+
+{ TCheckComboBoxEx }
+
+constructor TCheckComboBoxEx.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ Spacing := 0;
+ Button.Flat := true;
+ Button.Width := GetSystemMetrics(SM_CXVSCROLL);
+ FDelimiter := ';';
+ FDropDownCount := 8;
+ FDropDownForm := TCheckComboBoxForm.CreateNew(Self);
+ with TCheckComboBoxForm(FDropDownForm) do
+ begin
+ Self.FCheckListbox := FCheckListbox;
+ FCaller := self;
+ OnHide := @CloseUpHandler;
+ FCheckListbox.OnItemClick := @ItemClickHandler;
+ end;
+ FEscCancels := true;
+end;
+
+destructor TCheckComboBoxEx.Destroy;
+begin
+ inherited Destroy;
+end;
+
+function TCheckComboBoxEx.AddItem(AText: String; AChecked: Boolean = false;
+ AEnabled: Boolean = true): Integer;
+begin
+ with FCheckListBox do
+ begin
+ Result := Items.Add(AText);
+ Checked[Result] := AChecked;
+ ItemEnabled[Result] := AEnabled;
+ end;
+ UpdateCaption;
+end;
+
+procedure TCheckComboBoxEx.ButtonClick;
+begin
+ ShowPopup;
+end;
+
+procedure TCheckComboBoxEx.CheckAll(AState: TCheckBoxState;
+ AAllowGrayed: Boolean = true; AAllowDisabled: Boolean = true);
+begin
+ with FCheckListBox do
+ CheckAll(AState, AAllowGrayed, AAllowDisabled);
+ UpdateCaption;
+ DoChange;
+end;
+
+procedure TCheckComboBoxEx.Clear;
+begin
+ FCheckListBox.Clear;
+ UpdateCaption;
+ DoChange;
+end;
+
+procedure TCheckComboBoxEx.CloseUp;
+begin
+ FDroppedDown := false;
+ UpdateCaption;
+ DoCloseUp;
+end;
+
+procedure TCheckComboBoxEx.CloseUpHandler(Sender: TObject);
+begin
+ CloseUp;
+end;
+
+procedure TCheckComboBoxEx.DoChange;
+begin
+ if Assigned(FOnChange) then FOnChange(self);
+end;
+
+procedure TCheckComboBoxEx.DoCloseUp;
+begin
+ if Assigned(FOnCloseUp) then FOnCloseUp(self);
+end;
+
+procedure TCheckComboBoxEx.DoDropDown;
+begin
+ if Assigned(FOnDropDown) then FOnDropDown(self);
+end;
+
+procedure TCheckComboBoxEx.DoEnter;
+begin
+ inherited;
+ if FAutoDropDown then ShowPopup;
+end;
+
+procedure TCheckComboBoxEx.DoItemChange(AIndex: Integer);
+begin
+ if Assigned(FOnItemChange) then
+ FOnItemChange(self, AIndex);
+end;
+
+procedure TCheckComboBoxEx.DoItemClick(AIndex: Integer);
+begin
+ if Assigned(FOnItemClick) then
+ FOnItemClick(self, AIndex);
+end;
+
+procedure TCheckComboBoxEx.DoOnShowHint(HintInfo: PHintInfo);
+begin
+ if FHintMode = cbhmItems then
+ HintInfo^.HintStr := StringReplace(Text, FDelimiter+' ', LineEnding, [rfReplaceAll]);
+ inherited;
+end;
+
+procedure TCheckComboBoxEx.EditKeyDown(var Key: Word; Shift: TShiftState);
+begin
+ if (Key = VK_TAB) then
+ begin
+ inherited;
+ exit;
+ end;
+
+ if (Key = VK_RETURN) or (Key = VK_SPACE) or
+ (((Key = VK_DOWN) or (Key = VK_UP)) and (Shift = [ssAlt]))
+ then
+ ShowPopup;
+
+ // Kill all other keys
+ Key := 0;
+end;
+
+function TCheckComboBoxEx.GetAllowGrayed: Boolean;
+begin
+ Result := FCheckListbox.AllowGrayed;
+end;
+
+function TCheckComboBoxEx.GetBuddyClassType: TControlClass;
+begin
+ Result := TCCBButton;
+end;
+
+function TCheckComboBoxEx.GetChecked(AIndex: Integer): Boolean;
+begin
+ Result := FCheckListBox.Checked[AIndex];
+end;
+
+function TCheckComboBoxEx.GetEditorClassType: TGEEditClass;
+begin
+ Result := TCCBEdit;
+end;
+
+function TCheckComboBoxEx.GetItemEnabled(AIndex: Integer): Boolean;
+begin
+ Result := FCheckListbox.ItemEnabled[AIndex];
+end;
+
+function TCheckComboBoxEx.GetItemIndex: Integer;
+begin
+ Result := TCheckComboBoxForm(FDropDownForm).FCheckListBox.ItemIndex;
+end;
+
+function TCheckComboBoxEx.GetItems: TStrings;
+begin
+ Result := FCheckListBox.Items;
+end;
+
+function TCheckComboBoxEx.GetSorted: Boolean;
+begin
+ Result := FCheckListbox.Sorted;
+end;
+
+function TCheckComboBoxEx.GetState(AIndex: Integer): TCheckboxState;
+begin
+ Result := FCheckListBox.State[AIndex];
+end;
+
+procedure TCheckComboBoxEx.ItemClickHandler(Sender: TObject; AIndex: Integer);
+begin
+ UpdateCaption;
+ DoChange;
+ DoItemChange(AIndex);
+ DoItemClick(AIndex);
+end;
+
+procedure TCheckComboBoxEx.RestoreInitialChecks;
+var
+ i: Integer;
+begin
+ for i := 0 to FCheckListbox.Items.Count-1 do
+ FCheckListbox.Checked[i] := false;
+ for i := 0 to High(FSavedChecks) do
+ FCheckListbox.Checked[FSavedChecks[i]] := true;
+end;
+
+procedure TCheckComboBoxEx.SaveInitialChecks;
+var
+ i, n: Integer;
+begin
+ SetLength(FSavedChecks, FCheckListbox.Items.Count);
+ n := 0;
+ for i := 0 to FCheckListbox.Items.Count-1 do
+ if FCheckListbox.Checked[i] then
+ begin
+ FSavedChecks[n] := i;
+ inc(n);
+ end;
+ SetLength(FSavedChecks, n);
+end;
+
+procedure TCheckComboBoxEx.SetAllowGrayed(AValue: Boolean);
+begin
+ if GetAllowGrayed = AValue then exit;
+ FCheckListBox.AllowGrayed := AValue;
+end;
+
+procedure TCheckComboBoxEx.SetBiDiMode(AValue: TBiDiMode);
+begin
+ if AValue = BiDiMode then exit;
+ inherited SetBiDiMode(AValue);
+ FDropDownForm.BiDiMode := AValue;
+ if IsRightToLeft then
+ Buddy.Align := alLeft
+ else
+ Buddy.Align := alRight;
+ UpdateCaption;
+end;
+
+procedure TCheckComboBoxEx.SetChecked(AIndex: Integer; const AValue: Boolean);
+begin
+ if GetChecked(AIndex) = AValue then
+ exit;
+ FCheckListBox.Checked[AIndex] := AValue;
+ UpdateCaption;
+ DoChange;
+ DoItemChange(AIndex);
+end;
+
+procedure TCheckComboBoxEx.SetDelimiter(AValue: Char);
+begin
+ if FDelimiter = AValue then exit;
+ FDelimiter := AValue;
+ UpdateCaption;
+end;
+
+procedure TCheckComboBoxEx.SetDropDownCount(AValue: Integer);
+begin
+ if (FDropDownCount = AValue) or (AValue <= 0) then exit;
+ FDropDownCount := AValue;
+end;
+
+procedure TCheckComboBoxEx.SetItemEnabled(AIndex: Integer; const AValue: Boolean);
+begin
+ if GetItemEnabled(AIndex) = AValue then exit;
+ FCheckListbox.ItemEnabled[AIndex] := AValue;
+end;
+
+procedure TCheckComboBoxEx.SetItemIndex(AValue: Integer);
+begin
+ if GetItemIndex() = AValue then exit;
+ FCheckListBox.ItemIndex := AValue;
+ // todo: scroll in view
+end;
+
+procedure TCheckComboBoxEx.SetItems(const AValue: TStrings);
+begin
+ FCheckListBox.Items.Assign(AValue);
+end;
+
+procedure TCheckComboBoxEx.SetItemWidth(AValue: Integer);
+begin
+ if FItemWidth = AValue then exit;
+ if AValue < 0 then
+ FItemWidth := 0
+ else
+ FItemWidth := AValue;
+end;
+
+procedure TCheckComboBoxEx.SetSorted(AValue: Boolean);
+begin
+ FCheckListbox.Sorted := AValue;
+ UpdateCaption;
+end;
+
+procedure TCheckComboBoxEx.SetState(AIndex: Integer; const AValue: TCheckBoxState);
+begin
+ FCheckListbox.State[AIndex] := AValue;
+ DoChange;
+ DoItemChange(AIndex);
+end;
+
+procedure TCheckComboBoxEx.ShowPopup;
+var
+ PopupOrigin: TPoint;
+ PopupWidth: Integer;
+begin
+ if DoubleBuffered then
+ TCheckComboBoxForm(FDropDownForm).ActivateDoubleBuffered;
+ PopupOrigin := ControlToScreen(Point(0, Height));
+ if FItemWidth > 0 then
+ PopupWidth := FItemWidth
+ else
+ PopupWidth := Self.Width;
+ TCheckComboBoxForm(FDropDownForm).Initialize(FDropDownCount, PopupOrigin, PopupWidth);
+ SaveInitialChecks;
+ FDropDownForm.Show;
+ FDroppedDown := true;
+ DoDropDown;
+end;
+
+procedure TCheckComboBoxEx.Toggle(AIndex: Integer);
+begin
+ SetChecked(AIndex, not GetChecked(AIndex));
+end;
+
+procedure TCheckComboBoxEx.UpdateCaption;
+var
+ i: Integer;
+ s: String;
+begin
+ s := '';
+ if IsRightToLeft then
+ begin
+ for i := FCheckListBox.Count-1 downto 0 do
+ if FCheckListbox.Checked[i] then
+ s := s + FCheckListbox.items[i] + FDelimiter + ' '
+ end else
+ begin
+ for i := 0 to FCheckListbox.Count-1 do
+ if FCheckListbox.Checked[i] then
+ s := s + FCheckListbox.Items[i] + FDelimiter + ' ';
+ end;
+ if s <> '' then
+ SetLength(s, Length(s)-2);
+ Text := s;
+end;
+
+
+end.
+
diff --git a/components/exctrls/source/excombo.pas b/components/exctrls/source/excombo.pas
index f8f928e2b..05faa6f38 100644
--- a/components/exctrls/source/excombo.pas
+++ b/components/exctrls/source/excombo.pas
@@ -150,148 +150,6 @@ type
end;
- { TCustomCheckComboBoxEx }
-
- TCheckComboItemState = class
- public
- State: TCheckBoxState;
- Enabled: Boolean;
- Data: TObject;
- end;
- TCheckItemChange = procedure(Sender: TObject; AIndex: Integer) of object;
-
- TCustomCheckComboBoxEx = class(TCustomComboBox)
- private
- FAllowGrayed: Boolean;
- FOnItemChange: TCheckItemChange;
- procedure AsyncCheckItemStates(Data: PtrInt);
- function GetChecked(AIndex: Integer): Boolean;
- function GetCount: Integer;
- function GetItemEnabled(AIndex: Integer): Boolean;
- function GetObject(AIndex: Integer): TObject;
- function GetState(AIndex: Integer): TCheckBoxState;
- procedure SetChecked(AIndex: Integer; AValue: Boolean);
- procedure SetItemEnabled(AIndex: Integer; AValue: Boolean);
- procedure SetObject(AIndex: Integer; AValue: TObject);
- procedure SetState(AIndex: Integer; AValue: TCheckBoxState);
- protected
- FCheckHighlight: Boolean;
- FCheckSize: TSize;
- FDropped: Boolean;
- FHilightedIndex: Integer;
- FHiLiteLeft: Integer;
- FHiLiteRight: Integer;
- FNeedMeasure: Boolean;
- FRejectDropDown: Boolean;
- FRejectToggleOnSelect: Boolean;
- FRightToLeft: Boolean;
- FTextHeight: SmallInt;
- procedure CMBiDiModeChanged(var Message: TLMessage); message CM_BIDIMODECHANGED;
- procedure ClearItemStates;
- procedure CloseUp; override;
- procedure DrawItem(Index: Integer; ARect: TRect; State: TOwnerDrawState); override;
- procedure DropDown; override;
- procedure FontChanged(Sender: TObject); override;
- procedure InitializeWnd; override;
- procedure InitItemStates;
- procedure CheckItemStates;
- procedure QueueCheckItemStates;
- procedure KeyDown(var Key: Word; Shift: TShiftState); override;
- procedure Loaded; override;
- procedure MouseLeave; override;
- procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
- procedure SetItemHeight(const AValue: Integer); override;
- procedure SetItems(const Value: TStrings); override;
- procedure Select; override;
- public
- constructor Create(AOwner: TComponent); override;
- destructor Destroy; override;
- procedure AddItem(const AItem: string; AState: TCheckBoxState; AEnabled: Boolean = True); reintroduce;
- procedure AssignItems(AItems: TStrings);
- procedure Clear; override;
- procedure DeleteItem(AIndex: Integer);
- procedure CheckAll(AState: TCheckBoxState; AAllowGrayed: Boolean = True; AAllowDisabled: Boolean = True);
- procedure Toggle(AIndex: Integer);
- property AllowGrayed: Boolean read FAllowGrayed write FAllowGrayed default False;
- property Count: Integer read GetCount;
- property Checked[AIndex: Integer]: Boolean read GetChecked write SetChecked;
- property ItemEnabled[AIndex: Integer]: Boolean read GetItemEnabled write SetItemEnabled;
- property Objects[AIndex: Integer]: TObject read GetObject write SetObject;
- property State[AIndex: Integer]: TCheckBoxState read GetState write SetState;
- property OnItemChange: TCheckItemChange read FOnItemChange write FOnItemChange;
- end;
-
- { TCheckComboBox }
- TCheckComboBoxEx = class(TCustomCheckComboBoxEx)
- published
- property Align;
- property AllowGrayed;
- property Anchors;
- property ArrowKeysTraverseList;
- property AutoDropDown;
- property AutoSize;
- property BidiMode;
- property BorderSpacing;
- property BorderStyle;
- property Color;
- property Constraints;
- property Count;
- property DragCursor;
- property DragKind;
- property DragMode;
- property DropDownCount;
- property Enabled;
- property Font;
- property ItemHeight;
- property ItemIndex;
- property Items;
- property ItemWidth;
- property MaxLength;
- property OnChange;
- property OnChangeBounds;
- property OnClick;
- property OnCloseUp;
- property OnContextPopup;
- property OnDblClick;
- property OnDragDrop;
- property OnDragOver;
- property OnEndDrag;
- property OnDropDown;
- property OnEditingDone;
- property OnEnter;
- property OnExit;
- property OnGetItems;
- property OnItemChange;
- property OnKeyDown;
- property OnKeyPress;
- property OnKeyUp;
- property OnMouseDown;
- property OnMouseEnter;
- property OnMouseLeave;
- property OnMouseMove;
- property OnMouseUp;
- property OnMouseWheel;
- property OnMouseWheelDown;
- property OnMouseWheelUp;
- property OnStartDrag;
- property OnSelect;
- property OnUTF8KeyPress;
- property ParentBidiMode;
- property ParentColor;
- property ParentFont;
- property ParentShowHint;
- property PopupMenu;
- property ShowHint;
- property Sorted;
- property TabOrder;
- property TabStop;
- property Text;
- property TextHint;
- property Visible;
- end;
-
-
-
implementation
uses
@@ -614,423 +472,5 @@ begin
inherited SetStyle(AValue);
end;
-
-{ TCustomCheckComboBoxEx }
-
-constructor TCustomCheckComboBoxEx.Create(AOwner: TComponent);
-begin
- inherited Create(AOwner);
- TStringList(Items).Duplicates:=dupIgnore;
- Style:=csOwnerDrawFixed;
- FNeedMeasure:=True;
- FRejectToggleOnSelect:=True;
-end;
-
-destructor TCustomCheckComboBoxEx.Destroy;
-begin
- ClearItemStates;
- inherited Destroy;
-end;
-
-procedure TCustomCheckComboBoxEx.AddItem(const AItem: string; AState: TCheckBoxState; AEnabled: Boolean);
-var pItemState: TCheckComboItemState;
-begin
- pItemState:=TCheckComboItemState.Create;
- pItemState.State:=aState;
- pItemState.Enabled:=AEnabled;
- pItemState.Data:=nil;
- inherited AddItem(AItem, pItemState);
-end;
-
-procedure TCustomCheckComboBoxEx.AssignItems(AItems: TStrings);
-begin
- ClearItemStates;
- Items.Assign(AItems);
- InitItemStates;
-end;
-
-procedure TCustomCheckComboBoxEx.CheckAll(AState: TCheckBoxState; AAllowGrayed: Boolean;
- AAllowDisabled: Boolean);
-var i: Integer;
-begin
- for i:=0 to Items.Count-1 do
- begin
- if (AAllowGrayed or (State[i]<>cbGrayed)) and (AAllowDisabled or ItemEnabled[i])
- then State[i]:=AState;
- end;
-end;
-
-procedure TCustomCheckComboBoxEx.Clear;
-begin
- ClearItemStates;
- inherited Clear;
-end;
-
-procedure TCustomCheckComboBoxEx.ClearItemStates;
-var i: Integer;
-begin
- for i:=0 to Items.Count-1 do
- begin
- Items.Objects[i].Free;
- Items.Objects[i]:=nil;
- end;
-end;
-
-procedure TCustomCheckComboBoxEx.CloseUp;
-begin
- FDropped:=False;
- if FRejectDropDown then
- begin
- FRejectDropDown:=False;
- Update;
- end else
- inherited CloseUp;
-end;
-
-procedure TCustomCheckComboBoxEx.CMBiDiModeChanged(var Message: TLMessage);
-begin
- inherited CMBiDiModeChanged(Message);
- FRightToLeft:=IsRightToLeft;
- FNeedMeasure:=True;
- Invalidate;
-end;
-
-procedure TCustomCheckComboBoxEx.DeleteItem(AIndex: Integer);
-begin
- if (AIndex>=0) and (AIndex0) and not aDropped);
- {$ELSE}
- aFocusedEditableMainItemNoDD := False;
- {$ENDIF}
- if (ARect.Left=0) or aFocusedEditableMainItemNoDD then
- begin
- if odSelected in State then
- begin
- if not aEnabled then
- begin
- aGray:=ColorToGray(Canvas.Brush.Color);
- Canvas.Brush.Color:=RGBToColor(aGray, aGray, aGray);
- end;
- end else
- Canvas.Brush.Color:=clWindow;
- Canvas.Brush.Style:=bsSolid;
- Canvas.FillRect(ARect);
- end;
- if not (csDesigning in ComponentState)
- then aState:=ItemState.State
- else aState:=cbUnchecked;
- aDetail:=ThemeServices.GetElementDetails(caCheckThemes
- [aEnabled, aState, not aDropped and FCheckHighlight]);
- if FNeedMeasure then
- begin
- FCheckSize:=ThemeServices.GetDetailSize(aDetail);
- FTextHeight:=Canvas.TextHeight('ŠjÁÇ');
- if not aDropped then
- begin
- if not FRightToLeft then
- begin
- FHiLiteLeft:=-1;
- FHiLiteRight:=ARect.Right;
- end else
- begin
- FHiLiteLeft:=ARect.Left;
- FHiLiteRight:=ARect.Right;
- end;
- FNeedMeasure := False;
- end;
- end;
- if not FRightToLeft
- then anyRect.Left:=ARect.Left+cCheckIndent
- else anyRect.Left:=ARect.Right-cCheckIndent-FCheckSize.cx;
- anyRect.Right:=anyRect.Left+FCheckSize.cx;
- anyRect.Top:=(ARect.Bottom+ARect.Top-FCheckSize.cy) div 2;
- anyRect.Bottom:=anyRect.Top+FCheckSize.cy;
- ThemeServices.DrawElement(Canvas.Handle, aDetail, anyRect);
- Canvas.Brush.Style:=bsClear;
- if (not (odSelected in State) or not aDropped) and not aFocusedEditableMainItemNoDD
- then Canvas.Font.Color:=clWindowText
- else begin
- Canvas.Font.Color:=clHighlightText;
- FHilightedIndex:=Index;
- end;
- if aFocusedEditableMainItemNoDD then
- begin
- LCLIntf.SetBkColor(Canvas.Handle, ColorToRGB(clBtnFace));
- LCLIntf.DrawFocusRect(Canvas.Handle, aRect);
- end;
- aFlags:=DT_END_ELLIPSIS+DT_VCENTER+DT_SINGLELINE+DT_NOPREFIX;
- if not FRightToLeft then
- begin
- anyRect.Left:=ARect.Left+cCheckIndent+FCheckSize.cx+cTextIndent;
- anyRect.Right:=ARect.Right;
- end else
- begin
- anyRect.Right:=anyRect.Left-cTextIndent;
- anyRect.Left:=ARect.Left;
- aFlags:=aFlags or DT_RIGHT or DT_RTLREADING;
- end;
- anyRect.Top:=(ARect.Top+ARect.Bottom-FTextHeight) div 2;
- anyRect.Bottom:=anyRect.Top+FTextHeight;
- DrawText(Canvas.Handle, PChar(Items[Index]), Length(Items[Index]), anyRect, aFlags);
-end;
-
-procedure TCustomCheckComboBoxEx.DropDown;
-{$IF DEFINED(LCLWin32) or DEFINED(LCLWin64)}
-{$ELSE}
-var aCursorPos: TPoint;
- aRect: TRect;
-{$ENDIF}
-begin
- {$IF DEFINED(LCLWin32) or DEFINED(LCLWin64)}
- FRejectDropDown:=False;
- {$ELSE}
- aCursorPos:=ScreenToControl(Mouse.CursorPos);
- aRect:=Rect(FHiLiteLeft, 0, FHiLiteRight, Height);
- FRejectDropDown:=PtInRect(aRect, aCursorPos);
- {$ENDIF}
- FDropped:=True;
- if not FRejectDropDown then
- begin
- inherited DropDown;
- FRejectToggleOnSelect:=False;
- end else
- if (ItemIndex>=0) and ItemEnabled[ItemIndex] then Toggle(ItemIndex);
-end;
-
-procedure TCustomCheckComboBoxEx.FontChanged(Sender: TObject);
-begin
- FNeedMeasure:=True;
- inherited FontChanged(Sender);
-end;
-
-procedure TCustomCheckComboBoxEx.InitializeWnd;
-begin
- InitItemStates;
- inherited InitializeWnd;
- CheckItemStates;
- FRightToLeft:=IsRightToLeft;
-end;
-
-procedure TCustomCheckComboBoxEx.InitItemStates;
-var i: Integer;
- pItemState: TCheckComboItemState;
-begin
- for i:=0 to Items.Count-1 do
- if Items.Objects[i]=nil then begin
- pItemState:=TCheckComboItemState.Create;
- pItemState.Enabled:=True;
- pItemState.State:=cbUnchecked;
- pItemState.Data:=nil;
- Items.Objects[i]:=pItemState;
- end else if not (Items.Objects[i] is TCheckComboItemState) then
- raise Exception.Create(DbgSName(Self)+': Item '+IntToStr(i)+' is not a TCheckComboItemState');
-end;
-
-procedure TCustomCheckComboBoxEx.CheckItemStates;
-var
- i: Integer;
-begin
- for i:=0 to Items.Count-1 do
- if not (Items.Objects[i] is TCheckComboItemState) then
- raise Exception.Create(DbgSName(Self)+': Item '+IntToStr(i)+' is not a TCheckComboItemState');
-end;
-
-procedure TCustomCheckComboBoxEx.QueueCheckItemStates;
-begin
- Application.QueueAsyncCall(@AsyncCheckItemStates,0);
-end;
-
-procedure TCustomCheckComboBoxEx.KeyDown(var Key: Word; Shift: TShiftState);
-begin
- case Key of
- VK_RETURN:
- if FDropped then
- if (ItemIndex=FHilightedIndex) and ItemEnabled[ItemIndex] then Toggle(ItemIndex);
- VK_SPACE:
- if DroppedDown then
- if (ItemIndex>=0) and ItemEnabled[ItemIndex] then
- begin
- if ItemIndex<>FHilightedIndex then
- begin
- ItemIndex:=FHilightedIndex;
- inherited Select;
- end;
- Toggle(ItemIndex);
- DroppedDown:=False;
- end;
- end;
- inherited KeyDown(Key, Shift);
-end;
-
-procedure TCustomCheckComboBoxEx.Loaded;
-begin
- inherited Loaded;
- InitItemStates;
-end;
-
-procedure TCustomCheckComboBoxEx.MouseLeave;
-begin
- FCheckHighlight:=False;
- inherited MouseLeave;
-end;
-
-procedure TCustomCheckComboBoxEx.MouseMove(Shift: TShiftState; X, Y: Integer);
-var aHighlight: Boolean;
-begin
- inherited MouseMove(Shift, X, Y);
- aHighlight:=((X>FHiLiteLeft) and (XFCheckHighlight then
- begin
- FCheckHighlight:=aHighlight;
- Invalidate;
- end;
-end;
-
-procedure TCustomCheckComboBoxEx.Select;
-begin
- inherited Select;
- {$IF DEFINED(LCLWin32) or DEFINED(LCLWin64)}
- if DroppedDown then FRejectToggleOnSelect:=True;
- {$ENDIF}
- if not FRejectToggleOnSelect then
- begin
- if (ItemIndex >= 0) and ItemEnabled[ItemIndex] then Toggle(ItemIndex);
- FRejectToggleOnSelect:=True;
- end;
- FDropped:=False;
-end;
-
-procedure TCustomCheckComboBoxEx.SetItemHeight(const AValue: Integer);
-begin
- inherited SetItemHeight(AValue);
- FNeedMeasure:=True;
-end;
-
-procedure TCustomCheckComboBoxEx.SetItems(const Value: TStrings);
-begin
- ClearItemStates;
- inherited SetItems(Value);
- InitItemStates;
-end;
-
-procedure TCustomCheckComboBoxEx.Toggle(AIndex: Integer);
-const caNewStateMap: array [TCheckBoxState, Boolean] of TCheckBoxState =
- { False (AllowGrayed) True }
- ((cbChecked, cbGrayed), { cbUnchecked }
- (cbUnChecked, cbUnChecked), { cbChecked }
- (cbChecked, cbChecked)); { cbGrayed }
-begin
- State[AIndex]:=caNewStateMap[State[AIndex], AllowGrayed];
-end;
-
-{ TCustomCheckCombo.Getters and Setters }
-
-function TCustomCheckComboBoxEx.GetChecked(AIndex: Integer): Boolean;
-begin
- Result:=(TCheckComboItemState(Items.Objects[AIndex]).State=cbChecked);
-end;
-
-procedure TCustomCheckComboBoxEx.AsyncCheckItemStates(Data: PtrInt);
-begin
- CheckItemStates;
-end;
-
-function TCustomCheckComboBoxEx.GetCount: Integer;
-begin
- Result:=Items.Count;
-end;
-
-function TCustomCheckComboBoxEx.GetItemEnabled(AIndex: Integer): Boolean;
-begin
- Result:=TCheckComboItemState(Items.Objects[AIndex]).Enabled;
-end;
-
-function TCustomCheckComboBoxEx.GetObject(AIndex: Integer): TObject;
-begin
- Result:=TCheckComboItemState(Items.Objects[AIndex]).Data;
-end;
-
-function TCustomCheckComboBoxEx.GetState(AIndex: Integer): TCheckBoxState;
-begin
- Result:=TCheckComboItemState(Items.Objects[AIndex]).State;
-end;
-
-procedure TCustomCheckComboBoxEx.SetChecked(AIndex: Integer; AValue: Boolean);
-begin
- if AValue=(TCheckComboItemState(Items.Objects[AIndex]).State=cbChecked) then exit;
- if AValue
- then TCheckComboItemState(Items.Objects[AIndex]).State:=cbChecked
- else TCheckComboItemState(Items.Objects[AIndex]).State:=cbUnchecked;
- if Assigned(FOnItemChange) then
- FOnItemChange(Self, AIndex);
- if AIndex=ItemIndex then
- Invalidate;
-end;
-
-procedure TCustomCheckComboBoxEx.SetItemEnabled(AIndex: Integer; AValue: Boolean);
-begin
- if TCheckComboItemState(Items.Objects[AIndex]).Enabled=AValue then exit;
- TCheckComboItemState(Items.Objects[AIndex]).Enabled:=AValue;
- if AIndex=ItemIndex then
- Invalidate;
-end;
-
-procedure TCustomCheckComboBoxEx.SetObject(AIndex: Integer; AValue: TObject);
-begin
- TCheckComboItemState(Items.Objects[AIndex]).Data:=AValue;
-end;
-
-procedure TCustomCheckComboBoxEx.SetState(AIndex: Integer; AValue: TCheckBoxState);
-begin
- if TCheckComboItemState(Items.Objects[AIndex]).State=AValue then exit;
- TCheckComboItemState(Items.Objects[AIndex]).State:=AValue;
- if Assigned(FOnItemChange) then
- FOnItemChange(self, AIndex);
- if AIndex=ItemIndex then
- Invalidate;
-end;
-
-
end.
diff --git a/components/exctrls/source/exctrlsreg.pas b/components/exctrls/source/exctrlsreg.pas
index c3c0ec69d..afd5b5c5d 100644
--- a/components/exctrls/source/exctrlsreg.pas
+++ b/components/exctrls/source/exctrlsreg.pas
@@ -12,7 +12,7 @@ procedure Register;
implementation
uses
- ExButtons, ExCheckCtrls, ExEditCtrls, ExCombo;
+ ExButtons, ExCheckCtrls, ExEditCtrls, ExCombo, ExCheckCombo;
{$R exctrlsreg.res}
diff --git a/components/exctrls/source/exctrlsreg.res b/components/exctrls/source/exctrlsreg.res
index f7980e2c0..3507cc6c2 100644
Binary files a/components/exctrls/source/exctrlsreg.res and b/components/exctrls/source/exctrlsreg.res differ