IDE: Jump to code declarations from Code Explorer with shortcut keys. Reuse event handlers. Issue #20048.

git-svn-id: trunk@62821 -
This commit is contained in:
juha 2020-03-30 18:26:36 +00:00
parent 0bdef3f301
commit d84fe6746d
2 changed files with 109 additions and 119 deletions

View File

@ -7,6 +7,7 @@ object CodeExplorerView: TCodeExplorerView
ClientHeight = 517
ClientWidth = 220
KeyPreview = True
OnActivate = FormActivate
OnCreate = CodeExplorerViewCREATE
OnDestroy = CodeExplorerViewDestroy
LCLVersion = '2.1.0.0'
@ -22,13 +23,13 @@ object CodeExplorerView: TCodeExplorerView
OnChange = MainNotebookPageChanged
object CodePage: TTabSheet
Caption = 'CodePage'
ClientHeight = 489
ClientWidth = 212
ClientHeight = 490
ClientWidth = 218
object CodeTreeview: TTreeView
Left = 0
Height = 465
Top = 24
Width = 212
Top = 25
Width = 218
Align = alClient
BorderSpacing.Top = 1
HideSelection = False
@ -37,34 +38,34 @@ object CodeExplorerView: TCodeExplorerView
ReadOnly = True
RightClickSelect = True
TabOrder = 1
OnDblClick = CodeTreeviewDblClick
OnDeletion = CodeTreeviewDeletion
OnKeyUp = CodeTreeviewKeyUp
OnDblClick = TreeviewDblClick
OnDeletion = TreeviewDeletion
OnKeyDown = TreeviewKeyDown
OnMouseDown = CodeTreeviewMouseDown
Options = [tvoAutoItemHeight, tvoKeepCollapsedNodes, tvoReadOnly, tvoRightClickSelect, tvoShowButtons, tvoShowLines, tvoShowRoot, tvoToolTips, tvoNoDoubleClickExpand, tvoThemedDraw]
end
object CodeTreeviewButtonPanel: TPanel
Left = 0
Height = 23
Height = 24
Top = 0
Width = 212
Width = 218
Align = alTop
AutoSize = True
BevelOuter = bvNone
ClientHeight = 23
ClientWidth = 212
ClientHeight = 24
ClientWidth = 218
TabOrder = 0
object CodeFilterEdit: TEdit
AnchorSideLeft.Control = CodeTreeviewButtonPanel
AnchorSideTop.Control = CodeTreeviewButtonPanel
AnchorSideRight.Control = CodeRefreshSpeedButton
Left = 0
Height = 23
Height = 24
Top = 0
Width = 143
Width = 149
Anchors = [akTop, akLeft, akRight]
OnChange = CodeFilterEditChange
OnEnter = CodeFilterEditEnter
OnEnter = FilterEditEnter
TabOrder = 0
Text = 'CodeFilterEdit'
end
@ -72,8 +73,8 @@ object CodeExplorerView: TCodeExplorerView
AnchorSideRight.Control = CodeModeSpeedButton
AnchorSideBottom.Control = CodeFilterEdit
AnchorSideBottom.Side = asrBottom
Left = 143
Height = 22
Left = 149
Height = 23
Hint = 'Refresh CodeExplorer'
Top = 1
Width = 23
@ -87,8 +88,8 @@ object CodeExplorerView: TCodeExplorerView
AnchorSideRight.Control = CodeOptionsSpeedButton
AnchorSideBottom.Control = CodeRefreshSpeedButton
AnchorSideBottom.Side = asrBottom
Left = 166
Height = 22
Left = 172
Height = 23
Top = 1
Width = 23
Anchors = [akTop, akRight, akBottom]
@ -102,14 +103,14 @@ object CodeExplorerView: TCodeExplorerView
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = CodeRefreshSpeedButton
AnchorSideBottom.Side = asrBottom
Left = 189
Height = 22
Left = 195
Height = 23
Hint = 'Options for CodeExplorer'
Top = 1
Width = 23
Anchors = [akTop, akRight, akBottom]
Flat = True
OnClick = CodeOptionsSpeedButtonClick
OnClick = OptionsSpeedButtonClick
ShowHint = True
ParentShowHint = False
end
@ -117,28 +118,28 @@ object CodeExplorerView: TCodeExplorerView
end
object DirectivesPage: TTabSheet
Caption = 'DirectivesPage'
ClientHeight = 489
ClientWidth = 212
ClientHeight = 490
ClientWidth = 218
object DirTreeviewButtonPanel: TPanel
Left = 0
Height = 23
Height = 24
Top = 0
Width = 212
Width = 218
Align = alTop
AutoSize = True
BevelOuter = bvNone
ClientHeight = 23
ClientWidth = 212
ClientHeight = 24
ClientWidth = 218
TabOrder = 0
object DirectivesFilterEdit: TEdit
AnchorSideRight.Control = DirRefreshSpeedButton
Left = 0
Height = 23
Height = 24
Top = 0
Width = 166
Width = 172
Anchors = [akTop, akLeft, akRight]
OnChange = DirectivesFilterEditChange
OnEnter = DirectivesFilterEditEnter
OnEnter = FilterEditEnter
TabOrder = 0
Text = 'DirectivesFilterEdit'
end
@ -146,8 +147,8 @@ object CodeExplorerView: TCodeExplorerView
AnchorSideRight.Control = DirOptionsSpeedButton
AnchorSideBottom.Control = DirectivesFilterEdit
AnchorSideBottom.Side = asrBottom
Left = 166
Height = 22
Left = 172
Height = 23
Hint = 'Refresh CodeExplorer'
Top = 1
Width = 23
@ -162,14 +163,14 @@ object CodeExplorerView: TCodeExplorerView
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = DirRefreshSpeedButton
AnchorSideBottom.Side = asrBottom
Left = 189
Height = 22
Left = 195
Height = 23
Hint = 'Options for CodeExplorer'
Top = 1
Width = 23
Anchors = [akTop, akRight, akBottom]
Flat = True
OnClick = CodeOptionsSpeedButtonClick
OnClick = OptionsSpeedButtonClick
ShowHint = True
ParentShowHint = False
end
@ -179,17 +180,17 @@ object CodeExplorerView: TCodeExplorerView
AnchorSideTop.Side = asrBottom
Left = 0
Height = 465
Top = 24
Width = 212
Top = 25
Width = 218
Align = alBottom
Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Top = 1
PopupMenu = TreePopupmenu
ReadOnly = True
TabOrder = 1
OnDblClick = DirectivesTreeViewDblClick
OnDeletion = DirectivesTreeViewDeletion
OnKeyUp = DirectivesTreeViewKeyUp
OnDblClick = TreeviewDblClick
OnDeletion = TreeviewDeletion
OnKeyUp = TreeviewKeyDown
Options = [tvoAutoItemHeight, tvoHideSelection, tvoKeepCollapsedNodes, tvoReadOnly, tvoShowButtons, tvoShowLines, tvoShowRoot, tvoToolTips, tvoThemedDraw]
end
end
@ -197,13 +198,13 @@ object CodeExplorerView: TCodeExplorerView
object Imagelist1: TImageList
Height = 18
Width = 18
Left = 64
Top = 64
left = 64
top = 64
end
object TreePopupmenu: TPopupMenu
OnPopup = TreePopupmenuPopup
Left = 64
Top = 128
left = 64
top = 128
object MenuItem1: TMenuItem
Caption = 'New Item1'
Visible = False
@ -213,7 +214,7 @@ object CodeExplorerView: TCodeExplorerView
AutoEnabled = True
Interval = 500
OnTimer = IdleTimer1Timer
Left = 64
Top = 192
left = 64
top = 192
end
end

View File

@ -132,37 +132,33 @@ type
TreePopupmenu: TPopupMenu;
procedure CodeExplorerViewCreate(Sender: TObject);
procedure CodeExplorerViewDestroy(Sender: TObject);
procedure CodeFilterEditEnter(Sender: TObject);
procedure CodeTreeviewDblClick(Sender: TObject);
procedure CodeTreeviewDeletion(Sender: TObject; Node: TTreeNode);
procedure CodeTreeviewKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure CodeFilterEditChange(Sender: TObject);
procedure CodeTreeviewMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure DirectivesFilterEditChange(Sender: TObject);
procedure DirectivesFilterEditEnter(Sender: TObject);
procedure DirectivesTreeViewDblClick(Sender: TObject);
procedure DirectivesTreeViewDeletion(Sender: TObject; Node: TTreeNode);
procedure DirectivesTreeViewKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure DirRefreshSpeedButtonClick(Sender: TObject);
procedure FilterEditEnter(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure IdleTimer1Timer(Sender: TObject);
procedure JumpToMenuItemClick(Sender: TObject);
procedure JumpToImplementationMenuItemClick(Sender: TObject);
procedure OnCloseIDE(Sender: TObject);
procedure CloseIDEHandler(Sender: TObject);
procedure ShowSrcEditPosMenuItemClick(Sender: TObject);
procedure MainNotebookPageChanged(Sender: TObject);
procedure CodeModeSpeedButtonClick(Sender: TObject);
procedure CodeOptionsSpeedButtonClick(Sender: TObject);
procedure RefreshMenuItemClick(Sender: TObject);
procedure CodeRefreshSpeedButtonClick(Sender: TObject);
procedure OptionsSpeedButtonClick(Sender: TObject);
procedure RefreshMenuItemClick(Sender: TObject);
procedure RenameMenuItemClick(Sender: TObject);
procedure TreePopupmenuPopup(Sender: TObject);
procedure OnUserInput(Sender: TObject; {%H-}Msg: Cardinal);
procedure TreeviewDblClick(Sender: TObject);
procedure TreeviewDeletion(Sender: TObject; Node: TTreeNode);
procedure TreeviewKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure UserInputHandler(Sender: TObject; {%H-}Msg: Cardinal);
private
fCategoryNodes: array[TCodeExplorerCategory] of TTreeNode;
FCodeFilename: string;
FCodeCmd1, FCodeCmd2, FCodeCmd3: TIDECommand;
FDirectivesFilename: string;
FFlags: TCodeExplorerViewFlags;
FLastCodeChangeStep: integer;
@ -505,8 +501,8 @@ begin
fNodesWithPath:=TAvlTree.Create(@CompareViewNodePathsAndParams);
Application.AddOnUserInputHandler(@OnUserInput);
LazarusIDE.AddHandlerOnIDEClose(@OnCloseIDE);
Application.AddOnUserInputHandler(@UserInputHandler);
LazarusIDE.AddHandlerOnIDEClose(@CloseIDEHandler);
end;
procedure TCodeExplorerView.CodeExplorerViewDestroy(Sender: TObject);
@ -519,29 +515,6 @@ begin
CodeExplorerView:=nil;
end;
procedure TCodeExplorerView.CodeFilterEditEnter(Sender: TObject);
begin
CodeFilterEdit.SelectAll;
end;
procedure TCodeExplorerView.CodeTreeviewDblClick(Sender: TObject);
begin
JumpToSelection;
end;
procedure TCodeExplorerView.CodeTreeviewDeletion(Sender: TObject; Node: TTreeNode);
begin
if Node.Data<>nil then
TViewNodeData(Node.Data).Free;
end;
procedure TCodeExplorerView.CodeTreeviewKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (Key=VK_RETURN) and (Shift=[]) then
JumpToSelection;
end;
procedure TCodeExplorerView.CodeFilterEditChange(Sender: TObject);
begin
CodeFilterChanged;
@ -564,36 +537,25 @@ begin
DirectivesFilterChanged;
end;
procedure TCodeExplorerView.DirectivesFilterEditEnter(Sender: TObject);
begin
DirectivesFilterEdit.SelectAll;
end;
procedure TCodeExplorerView.DirectivesTreeViewDblClick(Sender: TObject);
begin
JumpToSelection;
end;
procedure TCodeExplorerView.DirectivesTreeViewDeletion(Sender: TObject;
Node: TTreeNode);
begin
if Node.Data<>nil then
TObject(Node.Data).Free;
end;
procedure TCodeExplorerView.DirectivesTreeViewKeyUp(Sender: TObject;
var Key: Word; Shift: TShiftState);
begin
if (Key=VK_RETURN) and (Shift=[]) then
JumpToSelection;
end;
procedure TCodeExplorerView.DirRefreshSpeedButtonClick(Sender: TObject);
begin
FLastDirectivesChangeStep:=CTInvalidChangeStamp;
RefreshDirectives(true);
end;
procedure TCodeExplorerView.FilterEditEnter(Sender: TObject);
begin
(Sender as TEdit).SelectAll;
end;
procedure TCodeExplorerView.FormActivate(Sender: TObject);
begin
DebugLn(['TCodeExplorerView.FormActivate!']);
FCodeCmd1:=IDECommandList.FindIDECommand(ecFindDeclaration);
FCodeCmd2:=IDECommandList.FindIDECommand(ecFindProcedureDefinition);
FCodeCmd3:=IDECommandList.FindIDECommand(ecFindProcedureMethod);
end;
procedure TCodeExplorerView.IdleTimer1Timer(Sender: TObject);
begin
if not (cevCheckOnIdle in FFlags) then exit;
@ -632,7 +594,7 @@ begin
JumpToSelection(true);
end;
procedure TCodeExplorerView.OnCloseIDE(Sender: TObject);
procedure TCodeExplorerView.CloseIDEHandler(Sender: TObject);
begin
CodeExplorerOptions.Save;
end;
@ -660,7 +622,13 @@ begin
SetMode(cemCategory);
end;
procedure TCodeExplorerView.CodeOptionsSpeedButtonClick(Sender: TObject);
procedure TCodeExplorerView.CodeRefreshSpeedButtonClick(Sender: TObject);
begin
FLastCodeChangeStep:=CTInvalidChangeStamp;
RefreshCode(true);
end;
procedure TCodeExplorerView.OptionsSpeedButtonClick(Sender: TObject);
begin
if Assigned(FOnShowOptions) then
begin
@ -676,12 +644,6 @@ begin
Refresh(true);
end;
procedure TCodeExplorerView.CodeRefreshSpeedButtonClick(Sender: TObject);
begin
FLastCodeChangeStep:=CTInvalidChangeStamp;
RefreshCode(true);
end;
procedure TCodeExplorerView.RenameMenuItemClick(Sender: TObject);
begin
if not JumpToSelection then begin
@ -730,7 +692,34 @@ begin
//DebugLn(['TCodeExplorerView.TreePopupmenuPopup ',CERenameIDEMenuCommand.Visible]);
end;
procedure TCodeExplorerView.OnUserInput(Sender: TObject; Msg: Cardinal);
procedure TCodeExplorerView.TreeviewDblClick(Sender: TObject);
begin
JumpToSelection;
end;
procedure TCodeExplorerView.TreeviewDeletion(Sender: TObject; Node: TTreeNode);
begin
if Node.Data<>nil then
TObject(Node.Data).Free;
end;
procedure TCodeExplorerView.TreeviewKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (Key=VK_RETURN) and (Shift=[])
or ((Key=FCodeCmd1.ShortcutA.Key1) and (Shift=FCodeCmd1.ShortcutA.Shift1))
or ((Key=FCodeCmd1.ShortcutB.Key1) and (Shift=FCodeCmd1.ShortcutB.Shift1))
or ((Key=FCodeCmd2.ShortcutA.Key1) and (Shift=FCodeCmd2.ShortcutA.Shift1))
or ((Key=FCodeCmd2.ShortcutB.Key1) and (Shift=FCodeCmd2.ShortcutB.Shift1))
or ((Key=FCodeCmd3.ShortcutA.Key1) and (Shift=FCodeCmd3.ShortcutA.Shift1))
or ((Key=FCodeCmd3.ShortcutB.Key1) and (Shift=FCodeCmd3.ShortcutB.Shift1))
then begin
JumpToSelection;
Key:=0;
end;
end;
procedure TCodeExplorerView.UserInputHandler(Sender: TObject; Msg: Cardinal);
begin
if CodeExplorerOptions.Refresh=cerOnIdle then
CheckOnIdle;
@ -2047,7 +2036,7 @@ begin
//DebugLn(['TCodeExplorerView.ApplyDirectivesFilter ====================="',TheFilter,'"']);
FLastDirectivesFilter:=TheFilter;
DirectivesTreeView.BeginUpdate;
DirectivesTreeView.Options:=DirectivesTreeView.Options+[tvoAllowMultiselect];
//DirectivesTreeView.Options:=DirectivesTreeView.Options+[tvoAllowMultiselect];
ANode:=DirectivesTreeView.Items.GetFirstNode;
while ANode<>nil do begin
NextNode:=ANode.GetNextSibling;