mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-17 21:41:35 +02:00
LazControls: Select always a node in a filtered TreeView. Issue #24795
git-svn-id: trunk@42253 -
This commit is contained in:
parent
7f0567f9f6
commit
5ca336a4a2
@ -16,8 +16,8 @@ unit TreeFilterEdit;
|
|||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
Classes, SysUtils, Forms, LResources, Graphics,
|
Classes, SysUtils, Forms, Graphics, Controls, ComCtrls, EditBtn,
|
||||||
Controls, ComCtrls, EditBtn, LCLType, FileUtil, LazUTF8, AvgLvlTree, fgl;
|
LResources, LCLType, LCLProc, FileUtil, LazUTF8, AvgLvlTree, fgl;
|
||||||
|
|
||||||
type
|
type
|
||||||
TImageIndexEvent = function (Str: String; Data: TObject;
|
TImageIndexEvent = function (Str: String; Data: TObject;
|
||||||
@ -64,10 +64,11 @@ type
|
|||||||
fFilteredTreeview: TCustomTreeview; // A control showing the (filtered) data.
|
fFilteredTreeview: TCustomTreeview; // A control showing the (filtered) data.
|
||||||
fImageIndexDirectory: integer; // Needed if directory structure is shown.
|
fImageIndexDirectory: integer; // Needed if directory structure is shown.
|
||||||
fSelectionList: TStringList; // Store/restore the old selections here.
|
fSelectionList: TStringList; // Store/restore the old selections here.
|
||||||
fShowDirHierarchy: Boolean; // Show direcories / files as a tree structure.
|
fShowDirHierarchy: Boolean; // Show directories / files as a tree structure.
|
||||||
fBranches: TBranchList; // Items under these nodes can be sorted.
|
fBranches: TBranchList; // Items under these nodes can be sorted.
|
||||||
fExpandAllInitially: Boolean; // Expand all levels when searched for the first time.
|
fExpandAllInitially: Boolean; // Expand all levels when searched for the first time.
|
||||||
fIsFirstTime: Boolean; // Needed for fExpandAllInitially.
|
fIsFirstTime: Boolean; // Needed for fExpandAllInitially.
|
||||||
|
fTempSelected: Boolean;
|
||||||
fOnGetImageIndex: TImageIndexEvent;
|
fOnGetImageIndex: TImageIndexEvent;
|
||||||
procedure SetFilteredTreeview(const AValue: TCustomTreeview);
|
procedure SetFilteredTreeview(const AValue: TCustomTreeview);
|
||||||
procedure SetShowDirHierarchy(const AValue: Boolean);
|
procedure SetShowDirHierarchy(const AValue: Boolean);
|
||||||
@ -144,9 +145,7 @@ end;
|
|||||||
|
|
||||||
destructor TTreeFilterBranch.Destroy;
|
destructor TTreeFilterBranch.Destroy;
|
||||||
begin
|
begin
|
||||||
|
|
||||||
Clear;
|
Clear;
|
||||||
|
|
||||||
FreeAndNil(fNodeTextToFullFilenameMap);
|
FreeAndNil(fNodeTextToFullFilenameMap);
|
||||||
FreeAndNil(fNodeTextToDataMap);
|
FreeAndNil(fNodeTextToDataMap);
|
||||||
FreeAndNil(fSortedData);
|
FreeAndNil(fSortedData);
|
||||||
@ -475,8 +474,7 @@ procedure TTreeFilterEdit.ApplyFilterCore;
|
|||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
begin
|
begin
|
||||||
if fFilteredTreeview = nil then
|
if fFilteredTreeview = nil then Exit;
|
||||||
exit;
|
|
||||||
fFilteredTreeview.BeginUpdate;
|
fFilteredTreeview.BeginUpdate;
|
||||||
if Assigned(fBranches) then begin // Apply filter for the branches
|
if Assigned(fBranches) then begin // Apply filter for the branches
|
||||||
for i:=0 to fBranches.Count-1 do
|
for i:=0 to fBranches.Count-1 do
|
||||||
@ -497,35 +495,34 @@ procedure TTreeFilterEdit.StoreSelection;
|
|||||||
var
|
var
|
||||||
ANode: TTreeNode;
|
ANode: TTreeNode;
|
||||||
begin
|
begin
|
||||||
fSelectionList.Clear;
|
if fFilteredTreeview = nil then Exit;
|
||||||
if fFilteredTreeview = nil then
|
|
||||||
exit;
|
|
||||||
ANode:=fFilteredTreeview.Selected;
|
ANode:=fFilteredTreeview.Selected;
|
||||||
while ANode<>nil do begin
|
if (ANode=nil) then Exit;
|
||||||
fSelectionList.Insert(0,ANode.Text);
|
if fTempSelected and (ANode=fFilteredTreeview.Items.GetFirstVisibleNode) then Exit;
|
||||||
ANode:=ANode.Parent;
|
fSelectionList.Clear; // Clear old selection only if there is new one.
|
||||||
end;
|
fSelectionList.Add(ANode.Text);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TTreeFilterEdit.RestoreSelection;
|
procedure TTreeFilterEdit.RestoreSelection;
|
||||||
var
|
var
|
||||||
ANode: TTreeNode;
|
ANode: TTreeNode;
|
||||||
CurText: string;
|
CurText: string;
|
||||||
|
i: Integer;
|
||||||
begin
|
begin
|
||||||
ANode:=nil;
|
fTempSelected:=fSelectionList.Count>0;
|
||||||
while fSelectionList.Count>0 do begin
|
for i:=fSelectionList.Count-1 downto 0 do begin
|
||||||
CurText:=fSelectionList[0];
|
CurText:=fSelectionList[i];
|
||||||
if ANode=nil then
|
ANode:=fFilteredTreeview.Items.GetFirstVisibleNode;
|
||||||
ANode:=fFilteredTreeview.Items.GetFirstNode
|
|
||||||
else
|
|
||||||
ANode:=ANode.GetFirstChild;
|
|
||||||
while (ANode<>nil) and (ANode.Text<>CurText) do
|
while (ANode<>nil) and (ANode.Text<>CurText) do
|
||||||
ANode:=ANode.GetNextSibling;
|
ANode:=ANode.GetNextVisible;
|
||||||
if ANode=nil then break;
|
if ANode<>nil then begin // Selection found
|
||||||
fSelectionList.Delete(0);
|
|
||||||
end;
|
|
||||||
if ANode<>nil then
|
|
||||||
fFilteredTreeview.Selected:=ANode;
|
fFilteredTreeview.Selected:=ANode;
|
||||||
|
fSelectionList.Delete(i);
|
||||||
|
fTempSelected:=False;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
if fTempSelected then // Original selection will be restored later.
|
||||||
|
fFilteredTreeview.Selected:=fFilteredTreeview.Items.GetFirstVisibleNode;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TTreeFilterEdit.GetExistingBranch(ARootNode: TTreeNode): TTreeFilterBranch;
|
function TTreeFilterEdit.GetExistingBranch(ARootNode: TTreeNode): TTreeFilterBranch;
|
||||||
|
Loading…
Reference in New Issue
Block a user