LazControls, LCL: Add shortcuts to TreeFilterEdit to work with TreeView. Issue #40321, patch by n7800.

This commit is contained in:
Juha 2023-06-16 02:01:21 +03:00
parent 29293b283c
commit 87fe030800
3 changed files with 175 additions and 80 deletions

View File

@ -94,6 +94,7 @@ type
procedure MoveHome(ASelect: Boolean = False); override;
procedure MoveEnd(ASelect: Boolean = False); override;
function ReturnKeyHandled: Boolean; override;
procedure EditKeyDown(var Key: Word; Shift: TShiftState); override;
procedure SortAndFilter; override;
procedure ApplyFilterCore; override;
function GetDefaultGlyphName: string; override;
@ -685,5 +686,44 @@ begin
fFilteredTreeview.OnKeyPress(fFilteredTreeview, Key);
end;
procedure TTreeFilterEdit.EditKeyDown(var Key: Word; Shift: TShiftState);
//
function AllowMultiSelectWithShift: Boolean;
begin
Result := (ssShift in Shift) and (msShiftSelect in fFilteredTreeview.MultiSelectStyle);
end;
//
begin
if fFilteredTreeview <> nil then
begin
// current node
if (Key = VK_LEFT) and (Shift = [ssAlt]) then
begin
fFilteredTreeview.MoveLeft(AllowMultiSelectWithShift);
Key := 0;
end
else if (Key = VK_RIGHT) and (Shift = [ssAlt]) then
begin
fFilteredTreeview.MoveRight(AllowMultiSelectWithShift);
Key := 0;
end
// full tree
else if (Key = VK_LEFT) and (Shift = [ssShift, ssAlt]) then
begin
fFilteredTreeview.FullCollapse;
Key := 0;
end
else if (Key = VK_RIGHT) and (Shift = [ssShift, ssAlt]) then
begin
fFilteredTreeview.FullExpand;
Key := 0;
end
end;
if Key <> 0 then
inherited EditKeyDown(Key, Shift);
end;
end.

View File

@ -3734,6 +3734,10 @@ type
procedure MoveToPrevNode(ASelect: Boolean = False);
procedure MovePageDown(ASelect: Boolean = False);
procedure MovePageUp(ASelect: Boolean = False);
procedure MoveLeft(ASelect: Boolean = False);
procedure MoveRight(ASelect: Boolean = False);
procedure MoveExpand(ASelect: Boolean = False);
procedure MoveCollapse(ASelect: Boolean = False);
procedure MoveHome(ASelect: Boolean = False);
procedure MoveEnd(ASelect: Boolean = False);
public

View File

@ -4435,96 +4435,72 @@ procedure TCustomTreeView.KeyDown(var Key: Word; Shift: TShiftState);
const
EditKey = VK_F2;
EditKeyShift = [];
var
lNode: TTreeNode;
begin
inherited KeyDown(Key, Shift);
if (Key = EditKey) and (Shift = EditKeyShift) and (not ReadOnly) then
begin
BeginEditing(Selected);
Key:=VK_UNKNOWN;
end;
if (Shift <> []) and (Shift <> [ssShift]) then exit;
case Key of
VK_DOWN:
begin
MoveToNextNode(AllowMultiSelectWithShift(Shift));
Key:=VK_UNKNOWN;
end;
VK_UP:
begin
MoveToPrevNode(AllowMultiSelectWithShift(Shift));
Key:=VK_UNKNOWN;
end;
VK_DOWN:
begin
MoveToNextNode(AllowMultiSelectWithShift(Shift));
Key:=VK_UNKNOWN;
end;
VK_HOME:
begin
MoveHome(AllowMultiSelectWithShift(Shift));
Key:=VK_UNKNOWN;
end;
VK_END:
begin
MoveEnd(AllowMultiSelectWithShift(Shift));
Key:=VK_UNKNOWN;
end;
VK_UP:
begin
MoveToPrevNode(AllowMultiSelectWithShift(Shift));
Key:=VK_UNKNOWN;
end;
VK_PRIOR: // Page Up
begin
MovePageUp(AllowMultiSelectWithShift(Shift));
Key:=VK_UNKNOWN;
end;
VK_NEXT: // Page Down
begin
MovePageDown(AllowMultiSelectWithShift(Shift));
Key:=VK_UNKNOWN;
end;
VK_HOME:
begin
MoveHome(AllowMultiSelectWithShift(Shift));
Key:=VK_UNKNOWN;
end;
VK_END:
begin
MoveEnd(AllowMultiSelectWithShift(Shift));
Key:=VK_UNKNOWN;
end;
VK_PRIOR: // Page Up
begin
MovePageUp(AllowMultiSelectWithShift(Shift));
Key:=VK_UNKNOWN;
end;
VK_NEXT: // Page Down
begin
MovePageDown(AllowMultiSelectWithShift(Shift));
Key:=VK_UNKNOWN;
end;
else
if not (Key in [VK_LEFT,VK_RIGHT,VK_ADD,VK_SUBTRACT]) then
Exit;
if (tvoAllowMultiSelect in FOptions) and AllowMultiSelectWithShift(Shift) then
lNode := FTreeNodes.FLastMultiSelected
else
lNode := Selected;
case Key of
VK_LEFT:
if lNode <> nil then
begin
if lNode.Expanded then
lNode.Expanded := False
else
if lNode.Parent <> nil then
lNode := lNode.Parent;
Key:=VK_UNKNOWN;
end;
begin
MoveLeft(AllowMultiSelectWithShift(Shift));
Key:=VK_UNKNOWN;
end;
VK_RIGHT:
if lNode <> nil then
begin
if lNode.Expanded then
lNode := lNode.GetNextExpanded
else
lNode.Expanded := True;
Key:=VK_UNKNOWN;
end;
begin
MoveRight(AllowMultiSelectWithShift(Shift));
Key:=VK_UNKNOWN;
end;
VK_ADD:
if lNode <> nil then
lNode.Expanded := True;
VK_SUBTRACT:
if lNode <> nil then
lNode.Expanded := False;
else
if (Key=EditKey) and (Shift=EditKeyShift) and (not ReadOnly) then
BeginEditing(Selected);
lNode := nil; { No change in selection }
end;
if lNode <> nil then
MoveSelection(lNode, AllowMultiSelectWithShift(Shift));
VK_ADD: // NumPlus
begin
MoveExpand(AllowMultiSelectWithShift(Shift));
Key:=VK_UNKNOWN;
end;
VK_SUBTRACT: // NumMinus
begin
MoveCollapse(AllowMultiSelectWithShift(Shift));
Key:=VK_UNKNOWN;
end;
end;
end;
@ -6174,6 +6150,81 @@ begin
MoveSelection(lNode, ASelect);
end;
procedure TCustomTreeView.MoveLeft(ASelect: Boolean);
var
lNode: TTreeNode;
begin
if (tvoAllowMultiSelect in FOptions) and ASelect then
lNode := FTreeNodes.FLastMultiSelected
else
lNode := Selected;
if lNode <> nil then
begin
if lNode.Expanded then
lNode.Expanded := False
else
if lNode.Parent <> nil then
lNode := lNode.Parent;
end;
if lNode <> nil then
MoveSelection(lNode, ASelect);
end;
procedure TCustomTreeView.MoveRight(ASelect: Boolean);
var
lNode: TTreeNode;
begin
if (tvoAllowMultiSelect in FOptions) and ASelect then
lNode := FTreeNodes.FLastMultiSelected
else
lNode := Selected;
if lNode <> nil then
begin
if lNode.Expanded then
lNode := lNode.GetNextExpanded
else
lNode.Expanded := True;
end;
if lNode <> nil then
MoveSelection(lNode, ASelect);
end;
procedure TCustomTreeView.MoveExpand(ASelect: Boolean);
var
lNode: TTreeNode;
begin
if (tvoAllowMultiSelect in FOptions) and ASelect then
lNode := FTreeNodes.FLastMultiSelected
else
lNode := Selected;
if lNode <> nil then
begin
lNode.Expanded := True;
MoveSelection(lNode, ASelect);
end;
end;
procedure TCustomTreeView.MoveCollapse(ASelect: Boolean);
var
lNode: TTreeNode;
begin
if (tvoAllowMultiSelect in FOptions) and ASelect then
lNode := FTreeNodes.FLastMultiSelected
else
lNode := Selected;
if lNode <> nil then
begin
lNode.Expanded := False;
MoveSelection(lNode, ASelect);
end;
end;
procedure TCustomTreeView.MoveSelection(ANewNode: TTreeNode; ASelect: Boolean);
begin
if tvoAllowMultiSelect in FOptions then