|
@@ -17,15 +17,18 @@ type
|
|
|
FItemIndex: integer;
|
|
|
FItems: TStrings;
|
|
|
FOnChange: TNotifyEvent;
|
|
|
- procedure CaptionDivMouseDown(Event: TAbstractEvent);
|
|
|
function GetCaption: string;
|
|
|
- procedure SetCaption(const AValue: string);
|
|
|
- procedure SetItemIndex(const AValue: integer);
|
|
|
- procedure SetItems(const AValue: TStrings);
|
|
|
protected
|
|
|
- procedure SetName(const NewName: TComponentName); override;
|
|
|
+ procedure DoCaptionDivClick(Event: TAbstractEvent); virtual;
|
|
|
+ procedure DoChange; virtual;
|
|
|
+ procedure DoItemClick(Event: TAbstractEvent); virtual;
|
|
|
+ procedure FPOObservedChanged(ASender: TObject; {%H-}Operation: TFPObservedOperation; {%H-}Data: Pointer); override;
|
|
|
+ procedure Loaded; override;
|
|
|
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
|
|
|
- Procedure FPOObservedChanged(ASender: TObject; {%H-}Operation: TFPObservedOperation; {%H-}Data: Pointer); override;
|
|
|
+ procedure SetCaption(const AValue: string); virtual;
|
|
|
+ procedure SetItemIndex(const AValue: integer); virtual;
|
|
|
+ procedure SetItems(const AValue: TStrings); virtual;
|
|
|
+ procedure SetName(const NewName: TComponentName); override;
|
|
|
public
|
|
|
// default styles
|
|
|
const
|
|
@@ -81,6 +84,7 @@ type
|
|
|
procedure Clear; virtual;
|
|
|
class function GetCSSTypeStyle: TCSSString; override;
|
|
|
procedure UpdateItems; virtual;
|
|
|
+ procedure UpdateCaption; virtual;
|
|
|
property OnChange: TNotifyEvent read FOnChange write FOnChange;
|
|
|
property Items: TStrings read FItems write SetItems;
|
|
|
property ItemIndex: integer read FItemIndex write SetItemIndex;
|
|
@@ -100,6 +104,12 @@ begin
|
|
|
UpdateItems;
|
|
|
end;
|
|
|
|
|
|
+procedure TDemoCombobox.DoChange;
|
|
|
+begin
|
|
|
+ if Assigned(OnChange) then
|
|
|
+ OnChange(Self);
|
|
|
+end;
|
|
|
+
|
|
|
procedure TDemoCombobox.SetName(const NewName: TComponentName);
|
|
|
var
|
|
|
WasCaption: Boolean;
|
|
@@ -128,6 +138,17 @@ begin
|
|
|
end;
|
|
|
end;
|
|
|
|
|
|
+procedure TDemoCombobox.Loaded;
|
|
|
+begin
|
|
|
+ inherited Loaded;
|
|
|
+ if FItemIndex>=Content.NodeCount then
|
|
|
+ FItemIndex:=-1;
|
|
|
+ UpdateCaption;
|
|
|
+ if (FItemIndex>=0) then
|
|
|
+ Content.Nodes[FItemIndex].AddCSSClass('ComboboxSelected');
|
|
|
+ UpdateCaption;
|
|
|
+end;
|
|
|
+
|
|
|
procedure TDemoCombobox.FPOObservedChanged(ASender: TObject; Operation: TFPObservedOperation;
|
|
|
Data: Pointer);
|
|
|
begin
|
|
@@ -141,13 +162,19 @@ procedure TDemoCombobox.SetItemIndex(const AValue: integer);
|
|
|
begin
|
|
|
if FItemIndex=AValue then Exit;
|
|
|
if (csDestroying in ComponentState) or (Content=nil) then exit;
|
|
|
- if (AValue>=Content.NodeCount) and not (csLoading in ComponentState) then
|
|
|
+ if csLoading in ComponentState then
|
|
|
+ begin
|
|
|
+ FItemIndex:=AValue;
|
|
|
+ exit;
|
|
|
+ end;
|
|
|
+ if (AValue>=Content.NodeCount) then
|
|
|
exit;
|
|
|
- if (FItemIndex>=0) and (FItemIndex<Content.NodeCount) then
|
|
|
+ if (FItemIndex>=0) then
|
|
|
Content.Nodes[FItemIndex].RemoveCSSClass('ComboboxSelected');
|
|
|
FItemIndex:=AValue;
|
|
|
- if (FItemIndex>=0) and (FItemIndex<Content.NodeCount) then
|
|
|
+ if (FItemIndex>=0) then
|
|
|
Content.Nodes[FItemIndex].AddCSSClass('ComboboxSelected');
|
|
|
+ UpdateCaption;
|
|
|
end;
|
|
|
|
|
|
function TDemoCombobox.GetCaption: string;
|
|
@@ -158,8 +185,20 @@ begin
|
|
|
Result:='';
|
|
|
end;
|
|
|
|
|
|
-procedure TDemoCombobox.CaptionDivMouseDown(Event: TAbstractEvent);
|
|
|
+procedure TDemoCombobox.DoItemClick(Event: TAbstractEvent);
|
|
|
+var
|
|
|
+ Item: TFresnelElement;
|
|
|
+begin
|
|
|
+ writeln('TDemoCombobox.OnItemClick Sender=',DbgSName(Event.Sender));
|
|
|
+ Item:=Event.Sender as TFresnelElement;
|
|
|
+ ItemIndex:=Item.Tag;
|
|
|
+ DoChange;
|
|
|
+ Menu.SetStyleAttr('display','none');
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TDemoCombobox.DoCaptionDivClick(Event: TAbstractEvent);
|
|
|
begin
|
|
|
+ if Event=nil then ;
|
|
|
if Menu.GetStyleAttr('display')='none' then
|
|
|
Menu.SetStyleAttr('display','')
|
|
|
else
|
|
@@ -188,7 +227,7 @@ begin
|
|
|
Name:='CaptionDiv';
|
|
|
CSSClasses.Add('ComboboxCaption');
|
|
|
Parent:=Self;
|
|
|
- AddEventListener(evtMouseDown,@CaptionDivMouseDown);
|
|
|
+ AddEventListener(evtClick,@DoCaptionDivClick);
|
|
|
end;
|
|
|
|
|
|
CaptionLabel:=TLabel.Create(Self);
|
|
@@ -244,6 +283,7 @@ begin
|
|
|
FItems.Clear;
|
|
|
while Content.NodeCount>FItems.Count do
|
|
|
Content.Nodes[Content.NodeCount-1].Free;
|
|
|
+ SetCaption(' ');
|
|
|
end;
|
|
|
|
|
|
class function TDemoCombobox.GetCSSTypeStyle: TCSSString;
|
|
@@ -258,21 +298,28 @@ var
|
|
|
ItemDiv: TDiv;
|
|
|
aLabel: TLabel;
|
|
|
begin
|
|
|
+ if FItemIndex>FItems.Count then
|
|
|
+ FItemIndex:=-1;
|
|
|
+
|
|
|
for i:=0 to FItems.Count-1 do
|
|
|
begin
|
|
|
ItemCaption:=FItems[i];
|
|
|
- ItemDiv:=FItems.Objects[i] as TDiv;
|
|
|
- if ItemDiv=nil then
|
|
|
+ if i>=Content.NodeCount then
|
|
|
begin
|
|
|
ItemDiv:=TDiv.Create(Self);
|
|
|
ItemDiv.Name:='ItemDiv'+IntToStr(i);
|
|
|
ItemDiv.CSSClasses.Add('ComboboxItem');
|
|
|
+ ItemDiv.Tag:=i;
|
|
|
+
|
|
|
aLabel:=TLabel.Create(Self);
|
|
|
aLabel.Name:='ItemLabel'+IntToStr(i);
|
|
|
aLabel.Caption:=ItemCaption;
|
|
|
aLabel.Parent:=ItemDiv;
|
|
|
ItemDiv.Parent:=Content;
|
|
|
+
|
|
|
+ ItemDiv.AddEventListener(evtClick,@DoItemClick);
|
|
|
end else begin
|
|
|
+ ItemDiv:=Content.Nodes[i] as TDiv;
|
|
|
aLabel:=ItemDiv.Nodes[0] as TLabel;
|
|
|
aLabel.Caption:=ItemCaption;
|
|
|
end;
|
|
@@ -283,6 +330,15 @@ begin
|
|
|
end;
|
|
|
while Content.NodeCount>FItems.Count do
|
|
|
Content.Nodes[Content.NodeCount-1].Free;
|
|
|
+ UpdateCaption;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TDemoCombobox.UpdateCaption;
|
|
|
+begin
|
|
|
+ if (FItemIndex>=0) then
|
|
|
+ SetCaption(FItems[FItemIndex])
|
|
|
+ else
|
|
|
+ SetCaption(' ');
|
|
|
end;
|
|
|
|
|
|
end.
|