diff --git a/lcl/comctrls.pp b/lcl/comctrls.pp index 9ea917aa78..5fdf1690ba 100644 --- a/lcl/comctrls.pp +++ b/lcl/comctrls.pp @@ -2171,6 +2171,7 @@ type function GetLastChild: TTreeNode; function GetLastSubChild: TTreeNode; function GetNext: TTreeNode; + function GetNextSkipChildren: TTreeNode; function GetNextChild(AValue: TTreeNode): TTreeNode; function GetNextExpanded: TTreeNode; function GetNextMultiSelected: TTreeNode; @@ -2838,8 +2839,8 @@ type destructor Destroy; override; procedure Clear; procedure CreateChildNodes(FirstTreeNode: TTreeNode); - procedure Apply(FirstTreeNode: TTreeNode); - procedure Apply(TreeView: TCustomTreeView); + procedure Apply(FirstTreeNode: TTreeNode; CollapseToo: boolean = true); + procedure Apply(TreeView: TCustomTreeView; CollapseToo: boolean = true); end; diff --git a/lcl/include/treeview.inc b/lcl/include/treeview.inc index 2832487a29..ddcf5b8ba6 100644 --- a/lcl/include/treeview.inc +++ b/lcl/include/treeview.inc @@ -222,7 +222,8 @@ begin end; end; -procedure TTreeNodeExpandedState.Apply(FirstTreeNode: TTreeNode); +procedure TTreeNodeExpandedState.Apply(FirstTreeNode: TTreeNode; + CollapseToo: boolean); var ChildNode: TTreeNode; ANode: TAvgLvlTreeNode; @@ -233,16 +234,20 @@ begin while ChildNode<>nil do begin ChildNodeText:=ChildNode.Text; ANode:=Children.FindKey(PChar(ChildNodeText),@CompareTextWithExpandedNode); - ChildNode.Expanded:=ANode<>nil; + if ANode<>nil then + ChildNode.Expanded:=true + else if CollapseToo then + ChildNode.Expanded:=false; if ANode<>nil then TTreeNodeExpandedState(ANode.Data).Apply(ChildNode.GetFirstChild); ChildNode:=ChildNode.GetNextSibling; end; end; -procedure TTreeNodeExpandedState.Apply(TreeView: TCustomTreeView); +procedure TTreeNodeExpandedState.Apply(TreeView: TCustomTreeView; + CollapseToo: boolean); begin - Apply(TreeView.Items.GetFirstNode); + Apply(TreeView.Items.GetFirstNode,CollapseToo); end; { TTreeNode } @@ -921,13 +926,15 @@ end; function TTreeNode.GetNext: TTreeNode; begin Result:=GetFirstChild; - if Result=nil then begin - // no children, search next - Result:=Self; - while (Result<>nil) and (Result.FNextBrother=nil) do - Result:=Result.Parent; - if Result<>nil then Result:=Result.FNextBrother; - end; + if Result=nil then Result:=GetNextSkipChildren; +end; + +function TTreeNode.GetNextSkipChildren: TTreeNode; +begin + Result:=Self; + while (Result<>nil) and (Result.FNextBrother=nil) do + Result:=Result.Parent; + if Result<>nil then Result:=Result.FNextBrother; end; function TTreeNode.GetPrev: TTreeNode;