mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-09-26 10:09:51 +02:00
make treeview key handling work with multiselection option
git-svn-id: trunk@8362 -
This commit is contained in:
parent
eb9487d50d
commit
75371875fd
@ -3267,92 +3267,118 @@ end;
|
|||||||
procedure TCustomTreeView.KeyDown(var Key: Word; Shift: TShiftState);
|
procedure TCustomTreeView.KeyDown(var Key: Word; Shift: TShiftState);
|
||||||
var
|
var
|
||||||
I: Integer;
|
I: Integer;
|
||||||
Node: TTreeNode;
|
lNode: TTreeNode;
|
||||||
begin
|
begin
|
||||||
inherited KeyDown(Key, Shift);
|
inherited KeyDown(Key, Shift);
|
||||||
|
|
||||||
|
if tvoAllowMultiSelect in FOptions then
|
||||||
|
lNode := FTreeNodes.FFirstMultiSelected
|
||||||
|
else
|
||||||
|
lNode := Selected;
|
||||||
|
|
||||||
case Key of
|
case Key of
|
||||||
|
|
||||||
VK_Down:
|
VK_DOWN:
|
||||||
if (Selected<>nil) and (Selected.GetNextExpanded<>nil) then begin
|
begin
|
||||||
Selected:=Selected.GetNextExpanded;
|
if lNode <> nil then
|
||||||
|
lNode := lNode.GetNextExpanded
|
||||||
|
else
|
||||||
|
if Items.Count > 0 then
|
||||||
|
lNode := FTreeNodes.Items[0];
|
||||||
|
if lNode <> nil then
|
||||||
Key:=VK_UNKNOWN;
|
Key:=VK_UNKNOWN;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
VK_Up:
|
VK_UP:
|
||||||
if (Selected<>nil) and (Selected.GetPrevExpanded<>nil) then begin
|
begin
|
||||||
Selected:=Selected.GetPrevExpanded;
|
if lNode <> nil then
|
||||||
|
lNode := lNode.GetPrevExpanded
|
||||||
|
else
|
||||||
|
if Items.Count > 0 then
|
||||||
|
lNode := Items.GetLastExpandedSubNode;
|
||||||
|
if lNode <> nil then
|
||||||
Key:=VK_UNKNOWN;
|
Key:=VK_UNKNOWN;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
VK_LEFT:
|
VK_LEFT:
|
||||||
if (Selected<>nil) then
|
if lNode <> nil then
|
||||||
begin
|
begin
|
||||||
if Selected.Expanded then
|
if lNode.Expanded then
|
||||||
Selected.Expanded := False
|
lNode.Expanded := False
|
||||||
else
|
else
|
||||||
if (Selected.GetPrevExpanded = Selected.Parent) and
|
if lNode.Parent <> nil then
|
||||||
(Selected.Parent <> nil) then Selected := Selected.Parent;
|
lNode := lNode.Parent
|
||||||
end;
|
end;
|
||||||
|
|
||||||
VK_RIGHT:
|
VK_RIGHT:
|
||||||
if (Selected<>nil) then
|
if lNode <> nil then
|
||||||
begin
|
begin
|
||||||
if Selected.Expanded then
|
if lNode.Expanded then
|
||||||
Selected := Selected.GetNextExpanded
|
lNode := lNode.GetNextExpanded
|
||||||
else
|
else
|
||||||
Selected.Expanded := True;
|
lNode.Expanded := True;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
VK_ADD:
|
VK_ADD:
|
||||||
if (Selected<>nil) then Selected.Expanded := True;
|
if lNode <> nil then
|
||||||
|
lNode.Expanded := True;
|
||||||
|
|
||||||
VK_SUBTRACT:
|
VK_SUBTRACT:
|
||||||
if (Selected<>nil) then Selected.Expanded := False;
|
if lNode <> nil then
|
||||||
|
lNode.Expanded := False;
|
||||||
|
|
||||||
VK_HOME:
|
VK_HOME:
|
||||||
if Items.Count > 0 then
|
if Items.Count > 0 then
|
||||||
Selected := Items[0];
|
lNode := Items[0];
|
||||||
|
|
||||||
VK_END:
|
VK_END:
|
||||||
if Items.Count > 0 then
|
if Items.Count > 0 then
|
||||||
Selected := Items.GetLastExpandedSubNode;
|
lNode := Items.GetLastExpandedSubNode;
|
||||||
|
|
||||||
VK_PRIOR: // Page Up
|
VK_PRIOR: // Page Up
|
||||||
if (Selected <> nil) then
|
if lNode <> nil then
|
||||||
begin
|
begin
|
||||||
I := Pred(ClientHeight div DefaultItemHeight);
|
I := Pred(ClientHeight div DefaultItemHeight);
|
||||||
Node := Selected;
|
|
||||||
|
|
||||||
while (I > 0) do
|
while (I > 0) do
|
||||||
if Node.GetPrevExpanded <> nil then
|
if lNode.GetPrevExpanded <> nil then
|
||||||
begin
|
begin
|
||||||
Node := Node.GetPrevExpanded;
|
lNode := lNode.GetPrevExpanded;
|
||||||
Dec(I);
|
Dec(I);
|
||||||
end
|
end
|
||||||
else Break;
|
else Break;
|
||||||
|
|
||||||
Selected := Node;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
VK_NEXT: // Page Down
|
VK_NEXT: // Page Down
|
||||||
if (Selected <> nil) then
|
if lNode <> nil then
|
||||||
begin
|
begin
|
||||||
I := Pred(ClientHeight div DefaultItemHeight);
|
I := Pred(ClientHeight div DefaultItemHeight);
|
||||||
Node := Selected;
|
|
||||||
|
|
||||||
while (I > 0) do
|
while (I > 0) do
|
||||||
if Node.GetNextExpanded <> nil then
|
if lNode.GetNextExpanded <> nil then
|
||||||
begin
|
begin
|
||||||
Node := Node.GetNextExpanded;
|
lNode := lNode.GetNextExpanded;
|
||||||
Dec(I);
|
Dec(I);
|
||||||
end
|
end
|
||||||
else Break;
|
else Break;
|
||||||
|
|
||||||
Selected := Node;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
if lNode <> nil then
|
||||||
|
if tvoAllowMultiSelect in FOptions then
|
||||||
|
begin
|
||||||
|
if ([ssCtrl,ssShift] * Shift) <> [] then
|
||||||
|
lNode.MultiSelectGroup
|
||||||
|
else begin
|
||||||
|
LockSelectionChangeEvent;
|
||||||
|
FTreeNodes.ClearMultiSelection;
|
||||||
|
lNode.MultiSelected := true;
|
||||||
|
UnlockSelectionChangeEvent;
|
||||||
|
end;
|
||||||
|
end else
|
||||||
|
Selected := lNode;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCustomTreeView.Loaded;
|
procedure TCustomTreeView.Loaded;
|
||||||
|
Loading…
Reference in New Issue
Block a user