diff --git a/components/lazcontrols/listfilteredit.pas b/components/lazcontrols/listfilteredit.pas index de91630bef..21035a22a2 100644 --- a/components/lazcontrols/listfilteredit.pas +++ b/components/lazcontrols/listfilteredit.pas @@ -166,29 +166,34 @@ procedure TListFilterEdit.SortAndFilter; // Copy data from fOriginalData to fSortedData in sorted order var Origi, i: Integer; - s, FilterLC: string; + Capt, FilterLC: string; Pass, Done: Boolean; begin Done:=False; fSortedData.Clear; - FilterLC := UTF8LowerCase(Filter); + FilterLC:=UTF8LowerCase(Filter); for Origi:=0 to fOriginalData.Count-1 do begin - s:=fOriginalData[Origi]; + Capt:=fOriginalData[Origi]; + // Filter with event handler if there is one. - if Assigned(OnFilterItem) then - Pass:=OnFilterItem(fOriginalData.Objects[Origi], Done) + if Assigned(fOnFilterItemEx) then + Pass:=fOnFilterItemEx(Capt, fOriginalData.Objects[Origi], Done) else Pass:=False; - // Filter by item's title text if needed. + // Support also the old filter event without a caption. + if (not (Pass and Done)) and Assigned(fOnFilterItem) then + Pass:=fOnFilterItem(fOriginalData.Objects[Origi], Done); + + // Filter by item's caption text if needed. if not (Pass or Done) then - Pass:=(FilterLC='') or (Pos(FilterLC,UTF8LowerCase(s))>0); + Pass:=(FilterLC='') or (Pos(FilterLC,UTF8LowerCase(Capt))>0); if Pass then begin i:=fSortedData.Count-1; // Always sort the data. while i>=0 do begin - if CompareFNs(s,fSortedData[i])>=0 then break; + if CompareFNs(Capt,fSortedData[i])>=0 then break; dec(i); end; - fSortedData.InsertObject(i+1, s, fOriginalData.Objects[Origi]); + fSortedData.InsertObject(i+1, Capt, fOriginalData.Objects[Origi]); end; end; end; diff --git a/lcl/editbtn.pas b/lcl/editbtn.pas index 70f0468c27..fd9a123cc9 100644 --- a/lcl/editbtn.pas +++ b/lcl/editbtn.pas @@ -189,6 +189,7 @@ type // Done=False means the data should also be filtered by its title string. // Done=True means no other filtering is needed. TFilterItemEvent = function (Item: TObject; out Done: Boolean): Boolean of object; + TFilterItemExEvent = function (ACaption: string;Item: TObject; out Done: Boolean): Boolean of object; // Can be used only for items that have a checkbox. Returns true if checked. TCheckItemEvent = function (Item: TObject): Boolean of object; @@ -219,6 +220,7 @@ type fIsFirstUpdate: Boolean; fSelectedPart: TObject; // Select this node on next update fOnFilterItem: TFilterItemEvent; + fOnFilterItemEx: TFilterItemExEvent; fOnCheckItem: TCheckItemEvent; procedure EditKeyDown(var Key: Word; Shift: TShiftState); override; procedure EditChange; override; @@ -252,6 +254,8 @@ type published property OnAfterFilter: TNotifyEvent read fOnAfterFilter write fOnAfterFilter; property OnFilterItem: TFilterItemEvent read fOnFilterItem write fOnFilterItem; + deprecated 'Use OnFilterItemEx with a caption parameter instead.'; + property OnFilterItemEx: TFilterItemExEvent read fOnFilterItemEx write fOnFilterItemEx; property OnCheckItem: TCheckItemEvent read fOnCheckItem write fOnCheckItem; property UseFormActivate: Boolean read fUseFormActivate write SetUseFormActivate default False; // TEditButton properties.