LCL, TreeView: Improve scrollbar update when some nodes have Visible=False

git-svn-id: trunk@35283 -
This commit is contained in:
juha 2012-02-10 12:05:55 +00:00
parent 75be46b024
commit 8cbd938dd7
2 changed files with 18 additions and 17 deletions

View File

@ -2361,7 +2361,7 @@ type
FText: string; FText: string;
FTop: integer; // top coordinate FTop: integer; // top coordinate
FVisible: Boolean; FVisible: Boolean;
function AreParentsExpanded: Boolean; function AreParentsExpandedAndVisible: Boolean;
procedure BindToMultiSelected; procedure BindToMultiSelected;
function CompareCount(CompareMe: Integer): Boolean; function CompareCount(CompareMe: Integer): Boolean;
function DoCanExpand(ExpandIt: Boolean): Boolean; function DoCanExpand(ExpandIt: Boolean): Boolean;

View File

@ -516,7 +516,8 @@ begin
FVisible := AValue; FVisible := AValue;
Selected := False; Selected := False;
if TreeView<>nil then if TreeView<>nil then
TreeView.FStates:=TreeView.FStates+[tvsScrollbarChanged,tvsTopsNeedsUpdate,tvsBottomItemNeedsUpdate, tvsTopItemNeedsUpdate]; TreeView.FStates:=TreeView.FStates+[tvsScrollbarChanged,tvsTopsNeedsUpdate,
tvsTopItemNeedsUpdate,tvsBottomItemNeedsUpdate,tvsMaxLvlNeedsUpdate,tvsMaxRightNeedsUpdate];
Update; Update;
end; end;
@ -534,13 +535,14 @@ begin
Update; Update;
end; end;
function TTreeNode.AreParentsExpanded: Boolean; function TTreeNode.AreParentsExpandedAndVisible: Boolean;
var ANode: TTreeNode; var
ANode: TTreeNode;
begin begin
Result:=false; Result:=false;
ANode:=Parent; ANode:=Parent;
while ANode<>nil do begin while ANode<>nil do begin
if not ANode.Expanded then exit; if not (ANode.Expanded and ANode.Visible) then exit;
ANode:=ANode.Parent; ANode:=ANode.Parent;
end; end;
Result:=true; Result:=true;
@ -906,8 +908,11 @@ begin
if ANode=nil then break; if ANode=nil then break;
Result:=ANode; Result:=ANode;
end; end;
end else end
else begin
Assert(Parent.Visible, 'TTreeNode.GetPrevVisible: Parent is not Visible');
Result := Parent; Result := Parent;
end;
if (Result<>nil) and (TreeView<>nil) and (not TreeView.IsNodeVisible(Result)) if (Result<>nil) and (TreeView<>nil) and (not TreeView.IsNodeVisible(Result))
then then
Result:=nil; Result:=nil;
@ -1574,7 +1579,7 @@ begin
if Assigned(TreeView) then if Assigned(TreeView) then
Result := TreeView.IsNodeVisible(Self) Result := TreeView.IsNodeVisible(Self)
else else
Result := AreParentsExpanded; Result := AreParentsExpandedAndVisible;
end; end;
function TTreeNode.IsNodeHeightFullVisible: Boolean; function TTreeNode.IsNodeHeightFullVisible: Boolean;
@ -1582,7 +1587,7 @@ begin
if Assigned(TreeView) then if Assigned(TreeView) then
Result := TreeView.IsNodeHeightFullVisible(Self) Result := TreeView.IsNodeHeightFullVisible(Self)
else else
Result := AreParentsExpanded; Result := AreParentsExpandedAndVisible;
end; end;
procedure TTreeNode.Update; procedure TTreeNode.Update;
@ -2331,10 +2336,10 @@ function TTreeNodes.GetLastExpandedSubNode: TTreeNode;
var var
Node: TTreeNode; Node: TTreeNode;
begin begin
Result := GetLastNode; Result := GetLastVisibleNode;
while Assigned(Result) and (Result.Expanded) do while Assigned(Result) and (Result.Expanded) do
begin begin
Node := Result.GetLastChild; Node := Result.GetLastVisibleChild;
if Assigned(Node) then if Assigned(Node) then
Result := Node Result := Node
else else
@ -3419,7 +3424,7 @@ begin
Cnt := 0; Cnt := 0;
while Node <> nil do while Node <> nil do
begin begin
if not Node.AreParentsExpanded then if not Node.AreParentsExpandedAndVisible then
begin begin
Node := Node.GetNext; Node := Node.GetNext;
Continue; Continue;
@ -3828,9 +3833,7 @@ end;
function TCustomTreeView.IsNodeVisible(ANode: TTreeNode): Boolean; function TCustomTreeView.IsNodeVisible(ANode: TTreeNode): Boolean;
begin begin
Result:=(ANode<>nil) and (ANode.Visible) and (ANode.AreParentsExpanded); Result:=(ANode<>nil) and (ANode.Visible) and (ANode.AreParentsExpandedAndVisible);
//DebugLn('[TCustomTreeView.IsNodeVisible] A Node=',DbgS(ANode),
//' ANode.AreParentsExpanded=',ANode.AreParentsExpanded);
if Result then begin if Result then begin
//DebugLn('[TCustomTreeView.IsNodeVisible] B Node=',DbgS(ANode), //DebugLn('[TCustomTreeView.IsNodeVisible] B Node=',DbgS(ANode),
// ' ',dbgs(FScrolledTop)+'>=',dbgs(ANode.Top+ANode.Height)+' or =',dbgs(FScrolledTop),'+'+dbgs(ClientHeight)+'<',dbgs(ANode.Top)); // ' ',dbgs(FScrolledTop)+'>=',dbgs(ANode.Top+ANode.Height)+' or =',dbgs(FScrolledTop),'+'+dbgs(ClientHeight)+'<',dbgs(ANode.Top));
@ -3845,9 +3848,7 @@ end;
function TCustomTreeView.IsNodeHeightFullVisible(ANode: TTreeNode): Boolean; function TCustomTreeView.IsNodeHeightFullVisible(ANode: TTreeNode): Boolean;
begin begin
Result:=(ANode<>nil) and (ANode.AreParentsExpanded); Result:=(ANode<>nil) and (ANode.AreParentsExpandedAndVisible);
//DebugLn('[TCustomTreeView.IsNodeVisible] A Node=',DbgS(ANode),
//' ANode.AreParentsExpanded=',ANode.AreParentsExpanded);
if Result then begin if Result then begin
//DebugLn('[TCustomTreeView.IsNodeVisible] B Node=',DbgS(ANode), //DebugLn('[TCustomTreeView.IsNodeVisible] B Node=',DbgS(ANode),
//' ',FScrolledTop,'>=',ANode.Top,'+',ANode.Height,' or ',FScrolledTop,'+',ClientHeight,'<',ANode.Top); //' ',FScrolledTop,'>=',ANode.Top,'+',ANode.Height,' or ',FScrolledTop,'+',ClientHeight,'<',ANode.Top);