mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-16 09:59:23 +02:00
IDE: Expand nodes in Code Explorer matching a filter. Reduce some parameters. Issue #36787.
git-svn-id: trunk@62818 -
This commit is contained in:
parent
864df52f4a
commit
56a4a9e0d5
@ -223,15 +223,12 @@ type
|
|||||||
CodeNode: TCodeTreeNode): integer;
|
CodeNode: TCodeTreeNode): integer;
|
||||||
function GetDirectiveNodeImage(CodeNode: TCodeTreeNode): integer;
|
function GetDirectiveNodeImage(CodeNode: TCodeTreeNode): integer;
|
||||||
procedure CreateIdentifierNodes(ACodeTool: TCodeTool; CodeNode: TCodeTreeNode;
|
procedure CreateIdentifierNodes(ACodeTool: TCodeTool; CodeNode: TCodeTreeNode;
|
||||||
ParentViewNode, InFrontViewNode: TTreeNode;
|
ParentViewNode: TTreeNode);
|
||||||
CreateSiblings: boolean);
|
|
||||||
function GetCTNodePath(ACodeTool: TCodeTool; CodeNode: TCodeTreeNode): string;
|
function GetCTNodePath(ACodeTool: TCodeTool; CodeNode: TCodeTreeNode): string;
|
||||||
procedure CreateNodePath(ACodeTool: TCodeTool; aNodeData: TObject);
|
procedure CreateNodePath(ACodeTool: TCodeTool; aNodeData: TObject);
|
||||||
procedure AddImplementationNode(ACodeTool: TCodeTool; CodeNode: TCodeTreeNode);
|
procedure AddImplementationNode(ACodeTool: TCodeTool; CodeNode: TCodeTreeNode);
|
||||||
procedure CreateDirectiveNodes(ADirectivesTool: TDirectivesTool;
|
procedure CreateDirectiveNodes(ADirectivesTool: TDirectivesTool;
|
||||||
CodeNode: TCodeTreeNode;
|
CodeNode: TCodeTreeNode; ParentViewNode: TTreeNode);
|
||||||
ParentViewNode, InFrontViewNode: TTreeNode;
|
|
||||||
CreateSiblings: boolean);
|
|
||||||
procedure CreateObservations(Tool: TCodeTool);
|
procedure CreateObservations(Tool: TCodeTool);
|
||||||
function CreateObserverNode(Tool: TCodeTool; f: TCEObserverCategory): TTreeNode;
|
function CreateObserverNode(Tool: TCodeTool; f: TCEObserverCategory): TTreeNode;
|
||||||
procedure CreateObserverNodesForStatement(Tool: TCodeTool;
|
procedure CreateObserverNodesForStatement(Tool: TCodeTool;
|
||||||
@ -250,7 +247,8 @@ type
|
|||||||
procedure ApplyCodeFilter;
|
procedure ApplyCodeFilter;
|
||||||
procedure ApplyDirectivesFilter;
|
procedure ApplyDirectivesFilter;
|
||||||
function CompareCodeNodes(Node1, Node2: TTreeNode): integer;
|
function CompareCodeNodes(Node1, Node2: TTreeNode): integer;
|
||||||
function FilterNode(ANode: TTreeNode; const TheFilter: string; DoTopLevel: Boolean): boolean;
|
function FilterNode(ANode: TTreeNode; const TheFilter: string;
|
||||||
|
KeepTopLevel: Boolean): boolean;
|
||||||
public
|
public
|
||||||
procedure BeginUpdate;
|
procedure BeginUpdate;
|
||||||
procedure EndUpdate;
|
procedure EndUpdate;
|
||||||
@ -982,18 +980,17 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCodeExplorerView.CreateIdentifierNodes(ACodeTool: TCodeTool;
|
procedure TCodeExplorerView.CreateIdentifierNodes(ACodeTool: TCodeTool;
|
||||||
CodeNode: TCodeTreeNode;
|
CodeNode: TCodeTreeNode; ParentViewNode: TTreeNode);
|
||||||
ParentViewNode, InFrontViewNode: TTreeNode; CreateSiblings: boolean);
|
|
||||||
var
|
var
|
||||||
NodeData: TViewNodeData;
|
NodeData: TViewNodeData;
|
||||||
NodeText: String;
|
NodeText: String;
|
||||||
ViewNode: TTreeNode;
|
ViewNode, CurParentViewNode, InFrontViewNode: TTreeNode;
|
||||||
NodeImageIndex: Integer;
|
NodeImageIndex: Integer;
|
||||||
ShowNode: Boolean;
|
ShowNode: Boolean;
|
||||||
ShowChilds: Boolean;
|
ShowChilds: Boolean;
|
||||||
Category: TCodeExplorerCategory;
|
Category: TCodeExplorerCategory;
|
||||||
CurParentViewNode: TTreeNode;
|
|
||||||
begin
|
begin
|
||||||
|
InFrontViewNode:=nil;
|
||||||
while CodeNode<>nil do begin
|
while CodeNode<>nil do begin
|
||||||
ShowNode:=true;
|
ShowNode:=true;
|
||||||
ShowChilds:=true;
|
ShowChilds:=true;
|
||||||
@ -1133,23 +1130,22 @@ begin
|
|||||||
AddImplementationNode(ACodeTool,CodeNode);
|
AddImplementationNode(ACodeTool,CodeNode);
|
||||||
end;
|
end;
|
||||||
if ShowChilds then
|
if ShowChilds then
|
||||||
CreateIdentifierNodes(ACodeTool,CodeNode.FirstChild,ViewNode,nil,true);
|
CreateIdentifierNodes(ACodeTool,CodeNode.FirstChild,ViewNode);
|
||||||
if not CreateSiblings then break;
|
|
||||||
CodeNode:=CodeNode.NextBrother;
|
CodeNode:=CodeNode.NextBrother;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCodeExplorerView.CreateDirectiveNodes(ADirectivesTool: TDirectivesTool;
|
procedure TCodeExplorerView.CreateDirectiveNodes(ADirectivesTool: TDirectivesTool;
|
||||||
CodeNode: TCodeTreeNode; ParentViewNode, InFrontViewNode: TTreeNode;
|
CodeNode: TCodeTreeNode; ParentViewNode: TTreeNode);
|
||||||
CreateSiblings: boolean);
|
|
||||||
var
|
var
|
||||||
NodeData: TViewNodeData;
|
NodeData: TViewNodeData;
|
||||||
NodeText: String;
|
NodeText: String;
|
||||||
ViewNode: TTreeNode;
|
ViewNode, InFrontViewNode: TTreeNode;
|
||||||
NodeImageIndex: Integer;
|
NodeImageIndex: Integer;
|
||||||
ShowNode: Boolean;
|
ShowNode: Boolean;
|
||||||
ShowChilds: Boolean;
|
ShowChilds: Boolean;
|
||||||
begin
|
begin
|
||||||
|
InFrontViewNode:=nil;
|
||||||
while CodeNode<>nil do begin
|
while CodeNode<>nil do begin
|
||||||
ShowNode:=true;
|
ShowNode:=true;
|
||||||
ShowChilds:=true;
|
ShowChilds:=true;
|
||||||
@ -1177,8 +1173,7 @@ begin
|
|||||||
InFrontViewNode:=ViewNode;
|
InFrontViewNode:=ViewNode;
|
||||||
end;
|
end;
|
||||||
if ShowChilds then
|
if ShowChilds then
|
||||||
CreateDirectiveNodes(ADirectivesTool,CodeNode.FirstChild,ViewNode,nil,true);
|
CreateDirectiveNodes(ADirectivesTool,CodeNode.FirstChild,ViewNode);
|
||||||
if not CreateSiblings then break;
|
|
||||||
CodeNode:=CodeNode.NextBrother;
|
CodeNode:=CodeNode.NextBrother;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
@ -2024,7 +2019,7 @@ begin
|
|||||||
ANode:=CodeTreeview.Items.GetFirstNode;
|
ANode:=CodeTreeview.Items.GetFirstNode;
|
||||||
while ANode<>nil do begin
|
while ANode<>nil do begin
|
||||||
NextNode:=ANode.GetNextSibling;
|
NextNode:=ANode.GetNextSibling;
|
||||||
FilterNode(ANode,TheFilter,False);
|
FilterNode(ANode,TheFilter,True);
|
||||||
ANode:=NextNode;
|
ANode:=NextNode;
|
||||||
end;
|
end;
|
||||||
CodeTreeview.EndUpdate;
|
CodeTreeview.EndUpdate;
|
||||||
@ -2043,7 +2038,7 @@ begin
|
|||||||
ANode:=DirectivesTreeView.Items.GetFirstNode;
|
ANode:=DirectivesTreeView.Items.GetFirstNode;
|
||||||
while ANode<>nil do begin
|
while ANode<>nil do begin
|
||||||
NextNode:=ANode.GetNextSibling;
|
NextNode:=ANode.GetNextSibling;
|
||||||
FilterNode(ANode,TheFilter,True);
|
FilterNode(ANode,TheFilter,False);
|
||||||
ANode:=NextNode;
|
ANode:=NextNode;
|
||||||
end;
|
end;
|
||||||
DirectivesTreeView.EndUpdate;
|
DirectivesTreeView.EndUpdate;
|
||||||
@ -2269,7 +2264,7 @@ begin
|
|||||||
|
|
||||||
if (ACodeTool<>nil) and (ACodeTool.Tree<>nil) and (ACodeTool.Tree.Root<>nil)
|
if (ACodeTool<>nil) and (ACodeTool.Tree<>nil) and (ACodeTool.Tree.Root<>nil)
|
||||||
then begin
|
then begin
|
||||||
CreateIdentifierNodes(ACodeTool,ACodeTool.Tree.Root,nil,nil,true);
|
CreateIdentifierNodes(ACodeTool,ACodeTool.Tree.Root,nil);
|
||||||
if (Mode = cemCategory) then
|
if (Mode = cemCategory) then
|
||||||
begin
|
begin
|
||||||
if (cecCodeObserver in CodeExplorerOptions.Categories) then
|
if (cecCodeObserver in CodeExplorerOptions.Categories) then
|
||||||
@ -2372,7 +2367,7 @@ begin
|
|||||||
if (ADirectivesTool<>nil) and (ADirectivesTool.Tree<>nil)
|
if (ADirectivesTool<>nil) and (ADirectivesTool.Tree<>nil)
|
||||||
and (ADirectivesTool.Tree.Root<>nil) then
|
and (ADirectivesTool.Tree.Root<>nil) then
|
||||||
begin
|
begin
|
||||||
CreateDirectiveNodes(ADirectivesTool,ADirectivesTool.Tree.Root,nil,nil,true);
|
CreateDirectiveNodes(ADirectivesTool,ADirectivesTool.Tree.Root,nil);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
// restore old expanded state
|
// restore old expanded state
|
||||||
@ -2642,22 +2637,31 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
function TCodeExplorerView.FilterNode(ANode: TTreeNode;
|
function TCodeExplorerView.FilterNode(ANode: TTreeNode;
|
||||||
const TheFilter: string; DoTopLevel: Boolean): boolean;
|
const TheFilter: string; KeepTopLevel: Boolean): boolean;
|
||||||
|
// Return True if ANode passes the filter. Delete nodes which do not pass.
|
||||||
|
// Filter recursively all subnodes.
|
||||||
var
|
var
|
||||||
ChildNode, NextNode: TTreeNode;
|
ChildNode, NextNode: TTreeNode;
|
||||||
|
ChildPass, ChildrenPassed: Boolean;
|
||||||
begin
|
begin
|
||||||
if ANode=nil then exit(false);
|
if ANode=nil then exit(false);
|
||||||
ChildNode:=ANode.GetFirstChild;
|
ChildNode:=ANode.GetFirstChild;
|
||||||
|
ChildrenPassed:=false;
|
||||||
while ChildNode<>nil do begin
|
while ChildNode<>nil do begin
|
||||||
NextNode:=ChildNode.GetNextSibling;
|
NextNode:=ChildNode.GetNextSibling;
|
||||||
FilterNode(ChildNode,TheFilter,DoTopLevel);
|
ChildPass:=FilterNode(ChildNode,TheFilter,KeepTopLevel);
|
||||||
|
ChildrenPassed:=ChildrenPassed or ChildPass;
|
||||||
ChildNode:=NextNode;
|
ChildNode:=NextNode;
|
||||||
end;
|
end;
|
||||||
Result:=(DoTopLevel or Assigned(ANode.Parent))
|
Result:=((ANode.Parent=nil) and KeepTopLevel)
|
||||||
and (ANode.GetFirstChild=nil) and not FilterFits(ANode.Text,TheFilter);
|
or ChildrenPassed or FilterFits(ANode.Text,TheFilter);
|
||||||
//DebugLn(['TCodeExplorerView.FilterNode "',ANode.Text,'" Parent=',ANode.Parent,
|
//DebugLn(['TCodeExplorerView.FilterNode "',ANode.Text,'" Parent=',ANode.Parent,
|
||||||
// ' Child=',ANode.GetFirstChild,' Filter=',FilterFits(ANode.Text,TheFilter),' Result=',Result]);
|
// ' Child=',ANode.GetFirstChild,' Filter=',FilterFits(ANode.Text,TheFilter),' Result=',Result]);
|
||||||
if Result then
|
if Result then begin
|
||||||
|
if ChildrenPassed and (TheFilter<>'') then
|
||||||
|
ANode.Expanded:=True;
|
||||||
|
end
|
||||||
|
else
|
||||||
DeleteTVNode(ANode);
|
DeleteTVNode(ANode);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user