mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-16 23:49:28 +02:00
LazControls, LCL: Add shortcuts to TreeFilterEdit to work with TreeView. Issue #40321, patch by n7800.
This commit is contained in:
parent
29293b283c
commit
87fe030800
@ -94,6 +94,7 @@ type
|
|||||||
procedure MoveHome(ASelect: Boolean = False); override;
|
procedure MoveHome(ASelect: Boolean = False); override;
|
||||||
procedure MoveEnd(ASelect: Boolean = False); override;
|
procedure MoveEnd(ASelect: Boolean = False); override;
|
||||||
function ReturnKeyHandled: Boolean; override;
|
function ReturnKeyHandled: Boolean; override;
|
||||||
|
procedure EditKeyDown(var Key: Word; Shift: TShiftState); override;
|
||||||
procedure SortAndFilter; override;
|
procedure SortAndFilter; override;
|
||||||
procedure ApplyFilterCore; override;
|
procedure ApplyFilterCore; override;
|
||||||
function GetDefaultGlyphName: string; override;
|
function GetDefaultGlyphName: string; override;
|
||||||
@ -685,5 +686,44 @@ begin
|
|||||||
fFilteredTreeview.OnKeyPress(fFilteredTreeview, Key);
|
fFilteredTreeview.OnKeyPress(fFilteredTreeview, Key);
|
||||||
end;
|
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.
|
end.
|
||||||
|
|
||||||
|
@ -3734,6 +3734,10 @@ type
|
|||||||
procedure MoveToPrevNode(ASelect: Boolean = False);
|
procedure MoveToPrevNode(ASelect: Boolean = False);
|
||||||
procedure MovePageDown(ASelect: Boolean = False);
|
procedure MovePageDown(ASelect: Boolean = False);
|
||||||
procedure MovePageUp(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 MoveHome(ASelect: Boolean = False);
|
||||||
procedure MoveEnd(ASelect: Boolean = False);
|
procedure MoveEnd(ASelect: Boolean = False);
|
||||||
public
|
public
|
||||||
|
@ -4435,96 +4435,72 @@ procedure TCustomTreeView.KeyDown(var Key: Word; Shift: TShiftState);
|
|||||||
const
|
const
|
||||||
EditKey = VK_F2;
|
EditKey = VK_F2;
|
||||||
EditKeyShift = [];
|
EditKeyShift = [];
|
||||||
var
|
|
||||||
lNode: TTreeNode;
|
|
||||||
begin
|
begin
|
||||||
inherited KeyDown(Key, Shift);
|
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
|
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:
|
VK_HOME:
|
||||||
begin
|
begin
|
||||||
MoveToNextNode(AllowMultiSelectWithShift(Shift));
|
MoveHome(AllowMultiSelectWithShift(Shift));
|
||||||
Key:=VK_UNKNOWN;
|
Key:=VK_UNKNOWN;
|
||||||
end;
|
end;
|
||||||
|
VK_END:
|
||||||
|
begin
|
||||||
|
MoveEnd(AllowMultiSelectWithShift(Shift));
|
||||||
|
Key:=VK_UNKNOWN;
|
||||||
|
end;
|
||||||
|
|
||||||
VK_UP:
|
VK_PRIOR: // Page Up
|
||||||
begin
|
begin
|
||||||
MoveToPrevNode(AllowMultiSelectWithShift(Shift));
|
MovePageUp(AllowMultiSelectWithShift(Shift));
|
||||||
Key:=VK_UNKNOWN;
|
Key:=VK_UNKNOWN;
|
||||||
end;
|
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:
|
VK_LEFT:
|
||||||
if lNode <> nil then
|
begin
|
||||||
begin
|
MoveLeft(AllowMultiSelectWithShift(Shift));
|
||||||
if lNode.Expanded then
|
Key:=VK_UNKNOWN;
|
||||||
lNode.Expanded := False
|
end;
|
||||||
else
|
|
||||||
if lNode.Parent <> nil then
|
|
||||||
lNode := lNode.Parent;
|
|
||||||
Key:=VK_UNKNOWN;
|
|
||||||
end;
|
|
||||||
|
|
||||||
VK_RIGHT:
|
VK_RIGHT:
|
||||||
if lNode <> nil then
|
begin
|
||||||
begin
|
MoveRight(AllowMultiSelectWithShift(Shift));
|
||||||
if lNode.Expanded then
|
Key:=VK_UNKNOWN;
|
||||||
lNode := lNode.GetNextExpanded
|
end;
|
||||||
else
|
|
||||||
lNode.Expanded := True;
|
|
||||||
Key:=VK_UNKNOWN;
|
|
||||||
end;
|
|
||||||
|
|
||||||
VK_ADD:
|
VK_ADD: // NumPlus
|
||||||
if lNode <> nil then
|
begin
|
||||||
lNode.Expanded := True;
|
MoveExpand(AllowMultiSelectWithShift(Shift));
|
||||||
|
Key:=VK_UNKNOWN;
|
||||||
VK_SUBTRACT:
|
end;
|
||||||
if lNode <> nil then
|
VK_SUBTRACT: // NumMinus
|
||||||
lNode.Expanded := False;
|
begin
|
||||||
|
MoveCollapse(AllowMultiSelectWithShift(Shift));
|
||||||
else
|
Key:=VK_UNKNOWN;
|
||||||
if (Key=EditKey) and (Shift=EditKeyShift) and (not ReadOnly) then
|
end;
|
||||||
BeginEditing(Selected);
|
|
||||||
lNode := nil; { No change in selection }
|
|
||||||
end;
|
|
||||||
|
|
||||||
if lNode <> nil then
|
|
||||||
MoveSelection(lNode, AllowMultiSelectWithShift(Shift));
|
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -6174,6 +6150,81 @@ begin
|
|||||||
MoveSelection(lNode, ASelect);
|
MoveSelection(lNode, ASelect);
|
||||||
end;
|
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);
|
procedure TCustomTreeView.MoveSelection(ANewNode: TTreeNode; ASelect: Boolean);
|
||||||
begin
|
begin
|
||||||
if tvoAllowMultiSelect in FOptions then
|
if tvoAllowMultiSelect in FOptions then
|
||||||
|
Loading…
Reference in New Issue
Block a user