LazControls: Add OnFilterItemEx event with caption parameter to TCustomControlFilterEdit. Use it in TListFilterEdit. Issue #29793, patch from meteu.

git-svn-id: trunk@51865 -
This commit is contained in:
juha 2016-03-08 20:43:37 +00:00
parent 2f65ac21da
commit 919198e297
2 changed files with 18 additions and 9 deletions

View File

@ -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;

View File

@ -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.