mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-16 04:39:22 +02:00
git-svn-id: trunk@12661 -
This commit is contained in:
parent
13fb38d261
commit
273b5da323
@ -1949,6 +1949,7 @@ type
|
|||||||
private
|
private
|
||||||
FCount: integer;
|
FCount: integer;
|
||||||
FFirstMultiSelected: TTreeNode;
|
FFirstMultiSelected: TTreeNode;
|
||||||
|
FLastMultiSelected: TTreeNode;
|
||||||
FKeepCollapsedNodes: boolean;
|
FKeepCollapsedNodes: boolean;
|
||||||
FNodeCache: TNodeCache;
|
FNodeCache: TNodeCache;
|
||||||
FOwner: TCustomTreeView;
|
FOwner: TCustomTreeView;
|
||||||
|
@ -468,14 +468,73 @@ end;
|
|||||||
procedure TTreeNode.BindToMultiSelected;
|
procedure TTreeNode.BindToMultiSelected;
|
||||||
var
|
var
|
||||||
TheTreeNodes: TTreeNodes;
|
TheTreeNodes: TTreeNodes;
|
||||||
|
CurNode: TTreeNode;
|
||||||
begin
|
begin
|
||||||
TheTreeNodes:=TreeNodes;
|
TheTreeNodes:=TreeNodes;
|
||||||
if TheTreeNodes=nil then exit;
|
if TheTreeNodes=nil then exit;
|
||||||
FNextMultiSelected:=TheTreeNodes.FFirstMultiSelected;
|
|
||||||
FPrevMultiSelected:=nil;
|
// Get the first selected node of the tree
|
||||||
if FNextMultiSelected<>nil then
|
CurNode := TheTreeNodes.FFirstMultiSelected;
|
||||||
FNextMultiSelected.FPrevMultiSelected:=Self;
|
|
||||||
TheTreeNodes.FFirstMultiSelected:=Self;
|
// Initialize self unbinded
|
||||||
|
Self.FPrevMultiSelected := nil;
|
||||||
|
Self.FNextMultiSelected := nil;
|
||||||
|
|
||||||
|
// If there isn't any selected node, set self as first
|
||||||
|
if CurNode = nil then
|
||||||
|
TheTreeNodes.FFirstMultiSelected := Self
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
|
||||||
|
// if last selected node was the previous one
|
||||||
|
if (TheTreeNodes.FLastMultiSelected.AbsoluteIndex+1=Self.AbsoluteIndex) and (TheTreeNodes.FLastMultiSelected.FNextMultiSelected=nil) then
|
||||||
|
begin
|
||||||
|
TheTreeNodes.FLastMultiSelected.FNextMultiSelected := Self;
|
||||||
|
Self.FPrevMultiSelected := TheTreeNodes.FLastMultiSelected;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
// if last selected node was the next one
|
||||||
|
if (TheTreeNodes.FLastMultiSelected.AbsoluteIndex=Self.AbsoluteIndex+1) and (TheTreeNodes.FLastMultiSelected.FPrevMultiSelected=nil) then
|
||||||
|
begin
|
||||||
|
TheTreeNodes.FLastMultiSelected.FPrevMultiSelected := Self;
|
||||||
|
Self.FNextMultiSelected := TheTreeNodes.FLastMultiSelected;
|
||||||
|
TheTreeNodes.FFirstMultiSelected := Self
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
|
||||||
|
// Scan linked list of selected nodes until one has a lower absolute index or we reach the end
|
||||||
|
While (CurNode.GetNextMultiSelected<>Nil) and (CurNode.AbsoluteIndex<Self.AbsoluteIndex) do
|
||||||
|
CurNode := CurNode.GetNextMultiSelected;
|
||||||
|
|
||||||
|
// last of the list
|
||||||
|
if CurNode.AbsoluteIndex < Self.AbsoluteIndex then
|
||||||
|
begin
|
||||||
|
CurNode.FNextMultiSelected := Self;
|
||||||
|
Self.FPrevMultiSelected := CurNode;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
// insert between two nodes
|
||||||
|
begin
|
||||||
|
Self.FPrevMultiSelected := CurNode.FPrevMultiSelected;
|
||||||
|
Self.FNextMultiSelected := CurNode;
|
||||||
|
if CurNode.FPrevMultiSelected <> nil then
|
||||||
|
CurNode.FPrevMultiSelected.FNextMultiSelected := Self;
|
||||||
|
CurNode.FPrevMultiSelected := Self;
|
||||||
|
end;
|
||||||
|
// Set self as head of the list if needed
|
||||||
|
if Self.FPrevMultiSelected = nil then
|
||||||
|
TheTreeNodes.FFirstMultiSelected := Self;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
// Set self as last selected node
|
||||||
|
TheTreeNodes.FLastMultiSelected := Self;
|
||||||
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TTreeNode.CompareCount(CompareMe: Integer): Boolean;
|
function TTreeNode.CompareCount(CompareMe: Integer): Boolean;
|
||||||
@ -1114,6 +1173,17 @@ begin
|
|||||||
if TheTreeNodes=nil then exit;
|
if TheTreeNodes=nil then exit;
|
||||||
if TheTreeNodes.FFirstMultiSelected=Self then
|
if TheTreeNodes.FFirstMultiSelected=Self then
|
||||||
TheTreeNodes.FFirstMultiSelected:=FNextMultiSelected;
|
TheTreeNodes.FFirstMultiSelected:=FNextMultiSelected;
|
||||||
|
// Reset last multiselected node
|
||||||
|
if TheTreeNodes.FLastMultiSelected=Self then
|
||||||
|
begin
|
||||||
|
if Self.FNextMultiSelected <> nil then
|
||||||
|
TheTreeNodes.FLastMultiSelected := Self.FNextMultiSelected
|
||||||
|
else
|
||||||
|
if Self.FPrevMultiSelected <> nil then
|
||||||
|
TheTreeNodes.FLastMultiSelected := Self.FPrevMultiSelected
|
||||||
|
else
|
||||||
|
TheTreeNodes.FLastMultiSelected := nil;
|
||||||
|
end;
|
||||||
if FNextMultiSelected<>nil then
|
if FNextMultiSelected<>nil then
|
||||||
FNextMultiSelected.FPrevMultiSelected:=FPrevMultiSelected;
|
FNextMultiSelected.FPrevMultiSelected:=FPrevMultiSelected;
|
||||||
if FPrevMultiSelected<>nil then
|
if FPrevMultiSelected<>nil then
|
||||||
@ -3386,7 +3456,7 @@ begin
|
|||||||
inherited KeyDown(Key, Shift);
|
inherited KeyDown(Key, Shift);
|
||||||
|
|
||||||
if (tvoAllowMultiSelect in FOptions) and (ssShift in Shift) then
|
if (tvoAllowMultiSelect in FOptions) and (ssShift in Shift) then
|
||||||
lNode := FTreeNodes.FFirstMultiSelected
|
lNode := FTreeNodes.FLastMultiSelected
|
||||||
else
|
else
|
||||||
lNode := Selected;
|
lNode := Selected;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user