make treeview key handling work with multiselection option

git-svn-id: trunk@8362 -
This commit is contained in:
micha 2005-12-24 14:06:38 +00:00
parent eb9487d50d
commit 75371875fd

View File

@ -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;