mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-16 01:00:29 +02:00
IDE: Enhanced JumpTo* commands for procedure header and begin. Issue #28612, patch from Ondrej Pokorny.
git-svn-id: trunk@49811 -
This commit is contained in:
parent
9572033709
commit
24978f559e
@ -80,6 +80,8 @@ const
|
|||||||
ecJumpToImplementation = ecFirstLazarus + 27;
|
ecJumpToImplementation = ecFirstLazarus + 27;
|
||||||
ecJumpToImplementationUses= ecFirstLazarus + 28;
|
ecJumpToImplementationUses= ecFirstLazarus + 28;
|
||||||
ecJumpToInitialization = ecFirstLazarus + 29;
|
ecJumpToInitialization = ecFirstLazarus + 29;
|
||||||
|
ecJumpToProcedureHeader = ecFirstLazarus + 30;
|
||||||
|
ecJumpToProcedureBegin = ecFirstLazarus + 31;
|
||||||
|
|
||||||
// edit selection
|
// edit selection
|
||||||
ecSelectionUpperCase = ecFirstLazarus + 50;
|
ecSelectionUpperCase = ecFirstLazarus + 50;
|
||||||
|
@ -1920,12 +1920,9 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TIDEMenuCommand.SetVisible(const AValue: Boolean);
|
procedure TIDEMenuCommand.SetVisible(const AValue: Boolean);
|
||||||
var
|
|
||||||
xBtn: TIDEToolButton;
|
|
||||||
begin
|
begin
|
||||||
inherited SetVisible(AValue);
|
inherited SetVisible(AValue);
|
||||||
for xBtn in ToolButtons do
|
//do not set visible for tool buttons, you usually only want to hide menu item and keep tool buttons visible
|
||||||
xBtn.Visible := AValue;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TIDEMenuCommand.ToolButtonAdded(const aBtn: TIDEToolButton);
|
procedure TIDEMenuCommand.ToolButtonAdded(const aBtn: TIDEToolButton);
|
||||||
|
@ -555,6 +555,8 @@ begin
|
|||||||
ecJumpToImplementation : Result:= lisMenuJumpToImplementation;
|
ecJumpToImplementation : Result:= lisMenuJumpToImplementation;
|
||||||
ecJumpToImplementationUses: Result:= lisMenuJumpToImplementationUses;
|
ecJumpToImplementationUses: Result:= lisMenuJumpToImplementationUses;
|
||||||
ecJumpToInitialization : Result:= lisMenuJumpToInitialization;
|
ecJumpToInitialization : Result:= lisMenuJumpToInitialization;
|
||||||
|
ecJumpToProcedureHeader : Result:= lisMenuJumpToProcedureHeader;
|
||||||
|
ecJumpToProcedureBegin : Result:= lisMenuJumpToProcedureBegin;
|
||||||
ecOpenFileAtCursor : Result:= srkmecOpenFileAtCursor;
|
ecOpenFileAtCursor : Result:= srkmecOpenFileAtCursor;
|
||||||
ecProcedureList : Result:= lisPListProcedureList;
|
ecProcedureList : Result:= lisPListProcedureList;
|
||||||
|
|
||||||
@ -2769,6 +2771,8 @@ begin
|
|||||||
AddDefault(C, 'Jump to Implementation', lisMenuJumpToImplementation, ecJumpToImplementation);
|
AddDefault(C, 'Jump to Implementation', lisMenuJumpToImplementation, ecJumpToImplementation);
|
||||||
AddDefault(C, 'Jump to Implementation uses', lisMenuJumpToImplementationUses, ecJumpToImplementationUses);
|
AddDefault(C, 'Jump to Implementation uses', lisMenuJumpToImplementationUses, ecJumpToImplementationUses);
|
||||||
AddDefault(C, 'Jump to Initialization', lisMenuJumpToInitialization, ecJumpToInitialization);
|
AddDefault(C, 'Jump to Initialization', lisMenuJumpToInitialization, ecJumpToInitialization);
|
||||||
|
AddDefault(C, 'Jump to Procedure header', lisMenuJumpToProcedureHeader, ecJumpToProcedureHeader);
|
||||||
|
AddDefault(C, 'Jump to Procedure begin', lisMenuJumpToProcedureBegin, ecJumpToProcedureBegin);
|
||||||
AddDefault(C, 'Show abstract methods', srkmecShowAbstractMethods, ecShowAbstractMethods);
|
AddDefault(C, 'Show abstract methods', srkmecShowAbstractMethods, ecShowAbstractMethods);
|
||||||
AddDefault(C, 'Remove empty methods', srkmecRemoveEmptyMethods, ecRemoveEmptyMethods);
|
AddDefault(C, 'Remove empty methods', srkmecRemoveEmptyMethods, ecRemoveEmptyMethods);
|
||||||
AddDefault(C, 'Remove unused units', srkmecRemoveUnusedUnits, ecRemoveUnusedUnits);
|
AddDefault(C, 'Remove unused units', srkmecRemoveUnusedUnits, ecRemoveUnusedUnits);
|
||||||
|
@ -389,6 +389,8 @@ resourcestring
|
|||||||
lisMenuJumpToImplementation = 'Jump to Implementation';
|
lisMenuJumpToImplementation = 'Jump to Implementation';
|
||||||
lisMenuJumpToImplementationUses = 'Jump to Implementation uses';
|
lisMenuJumpToImplementationUses = 'Jump to Implementation uses';
|
||||||
lisMenuJumpToInitialization = 'Jump to Initialization';
|
lisMenuJumpToInitialization = 'Jump to Initialization';
|
||||||
|
lisMenuJumpToProcedureHeader = 'Jump to Procedure header';
|
||||||
|
lisMenuJumpToProcedureBegin = 'Jump to Procedure begin';
|
||||||
lisMenuViewUnits = 'Units ...';
|
lisMenuViewUnits = 'Units ...';
|
||||||
lisMenuViewForms = 'Forms ...';
|
lisMenuViewForms = 'Forms ...';
|
||||||
lisMenuViewUnitDependencies = 'Unit Dependencies';
|
lisMenuViewUnitDependencies = 'Unit Dependencies';
|
||||||
|
@ -2101,6 +2101,8 @@ begin
|
|||||||
MainIDEBar.itmJumpToImplementation.OnClick := @SourceEditorManager.JumpToImplementationClicked;
|
MainIDEBar.itmJumpToImplementation.OnClick := @SourceEditorManager.JumpToImplementationClicked;
|
||||||
MainIDEBar.itmJumpToImplementationUses.OnClick := @SourceEditorManager.JumpToImplementationUsesClicked;
|
MainIDEBar.itmJumpToImplementationUses.OnClick := @SourceEditorManager.JumpToImplementationUsesClicked;
|
||||||
MainIDEBar.itmJumpToInitialization.OnClick := @SourceEditorManager.JumpToInitializationClicked;
|
MainIDEBar.itmJumpToInitialization.OnClick := @SourceEditorManager.JumpToInitializationClicked;
|
||||||
|
MainIDEBar.itmJumpToProcedureHeader.OnClick := @SourceEditorManager.JumpToProcedureHeaderClicked;
|
||||||
|
MainIDEBar.itmJumpToProcedureBegin.OnClick := @SourceEditorManager.JumpToProcedureBeginClicked;
|
||||||
MainIDEBar.itmFindBlockStart.OnClick:=@mnuSearchFindBlockStart;
|
MainIDEBar.itmFindBlockStart.OnClick:=@mnuSearchFindBlockStart;
|
||||||
MainIDEBar.itmFindBlockOtherEnd.OnClick:=@mnuSearchFindBlockOtherEnd;
|
MainIDEBar.itmFindBlockOtherEnd.OnClick:=@mnuSearchFindBlockOtherEnd;
|
||||||
MainIDEBar.itmFindDeclaration.OnClick:=@mnuSearchFindDeclaration;
|
MainIDEBar.itmFindDeclaration.OnClick:=@mnuSearchFindDeclaration;
|
||||||
|
@ -146,6 +146,8 @@ type
|
|||||||
itmJumpToImplementation: TIDEMenuCommand;
|
itmJumpToImplementation: TIDEMenuCommand;
|
||||||
itmJumpToImplementationUses: TIDEMenuCommand;
|
itmJumpToImplementationUses: TIDEMenuCommand;
|
||||||
itmJumpToInitialization: TIDEMenuCommand;
|
itmJumpToInitialization: TIDEMenuCommand;
|
||||||
|
itmJumpToProcedureHeader: TIDEMenuCommand;
|
||||||
|
itmJumpToProcedureBegin: TIDEMenuCommand;
|
||||||
//itmBookmarks: TIDEMenuSection;
|
//itmBookmarks: TIDEMenuSection;
|
||||||
itmSetFreeBookmark: TIDEMenuCommand;
|
itmSetFreeBookmark: TIDEMenuCommand;
|
||||||
itmJumpToNextBookmark: TIDEMenuCommand;
|
itmJumpToNextBookmark: TIDEMenuCommand;
|
||||||
|
@ -1084,6 +1084,12 @@ begin
|
|||||||
CreateMenuItem(ParentMI,itmJumpToImplementationUses,'itmJumpToImplementationUses',lisMenuJumpToImplementationUses, 'menu_jumpto_implementationuses');
|
CreateMenuItem(ParentMI,itmJumpToImplementationUses,'itmJumpToImplementationUses',lisMenuJumpToImplementationUses, 'menu_jumpto_implementationuses');
|
||||||
CreateMenuItem(ParentMI,itmJumpToInitialization,'itmJumpToInitialization',lisMenuJumpToInitialization, 'menu_jumpto_initialization');
|
CreateMenuItem(ParentMI,itmJumpToInitialization,'itmJumpToInitialization',lisMenuJumpToInitialization, 'menu_jumpto_initialization');
|
||||||
|
|
||||||
|
ParentMI:=itmJumpings;
|
||||||
|
CreateMenuItem(ParentMI,itmJumpToProcedureHeader,'itmJumpToProcedureHeader',lisMenuJumpToProcedureHeader, 'menu_jumpto_procedureheader');
|
||||||
|
CreateMenuItem(ParentMI,itmJumpToProcedureBegin,'itmJumpToProcedureBegin',lisMenuJumpToProcedureBegin, 'menu_jumpto_procedurebegin');
|
||||||
|
itmJumpToProcedureHeader.Visible := False;
|
||||||
|
itmJumpToProcedureBegin.Visible := False;
|
||||||
|
|
||||||
CreateMenuSeparatorSection(mnuSearch,itmBookmarks,'itmBookmarks');
|
CreateMenuSeparatorSection(mnuSearch,itmBookmarks,'itmBookmarks');
|
||||||
ParentMI:=itmBookmarks;
|
ParentMI:=itmBookmarks;
|
||||||
|
|
||||||
@ -1542,6 +1548,8 @@ begin
|
|||||||
itmJumpToImplementationUses.ToolButtonClass:=TJumpToSectionToolButton;
|
itmJumpToImplementationUses.ToolButtonClass:=TJumpToSectionToolButton;
|
||||||
itmJumpToInitialization.Command:=GetCommand(ecJumpToInitialization);
|
itmJumpToInitialization.Command:=GetCommand(ecJumpToInitialization);
|
||||||
itmJumpToInitialization.ToolButtonClass:=TJumpToSectionToolButton;
|
itmJumpToInitialization.ToolButtonClass:=TJumpToSectionToolButton;
|
||||||
|
itmJumpToProcedureHeader.Command:=GetCommand(ecJumpToProcedureHeader);
|
||||||
|
itmJumpToProcedureBegin.Command:=GetCommand(ecJumpToProcedureBegin);
|
||||||
itmFindBlockOtherEnd.Command:=GetCommand(ecFindBlockOtherEnd);
|
itmFindBlockOtherEnd.Command:=GetCommand(ecFindBlockOtherEnd);
|
||||||
itmFindBlockStart.Command:=GetCommand(ecFindBlockStart);
|
itmFindBlockStart.Command:=GetCommand(ecFindBlockStart);
|
||||||
itmFindDeclaration.Command:=GetCommand(ecFindDeclaration);
|
itmFindDeclaration.Command:=GetCommand(ecFindDeclaration);
|
||||||
|
@ -948,6 +948,7 @@ type
|
|||||||
jmpInterface, jmpInterfaceUses,
|
jmpInterface, jmpInterfaceUses,
|
||||||
jmpImplementation, jmpImplementationUses,
|
jmpImplementation, jmpImplementationUses,
|
||||||
jmpInitialization);
|
jmpInitialization);
|
||||||
|
TJumpToProcedureType = (jmpHeader, jmpBegin);
|
||||||
|
|
||||||
{ TSourceEditorManager }
|
{ TSourceEditorManager }
|
||||||
(* Reintroduce all Methods with the final types *)
|
(* Reintroduce all Methods with the final types *)
|
||||||
@ -1025,12 +1026,16 @@ type
|
|||||||
public
|
public
|
||||||
procedure BookMarkNextClicked(Sender: TObject);
|
procedure BookMarkNextClicked(Sender: TObject);
|
||||||
procedure BookMarkPrevClicked(Sender: TObject);
|
procedure BookMarkPrevClicked(Sender: TObject);
|
||||||
|
procedure JumpToPos(FileName: string; Pos: TCodeXYPosition; TopLine: Integer);
|
||||||
procedure JumpToSection(JumpType: TJumpToSectionType);
|
procedure JumpToSection(JumpType: TJumpToSectionType);
|
||||||
procedure JumpToInterfaceClicked(Sender: TObject);
|
procedure JumpToInterfaceClicked(Sender: TObject);
|
||||||
procedure JumpToInterfaceUsesClicked(Sender: TObject);
|
procedure JumpToInterfaceUsesClicked(Sender: TObject);
|
||||||
procedure JumpToImplementationClicked(Sender: TObject);
|
procedure JumpToImplementationClicked(Sender: TObject);
|
||||||
procedure JumpToImplementationUsesClicked(Sender: TObject);
|
procedure JumpToImplementationUsesClicked(Sender: TObject);
|
||||||
procedure JumpToInitializationClicked(Sender: TObject);
|
procedure JumpToInitializationClicked(Sender: TObject);
|
||||||
|
procedure JumpToProcedure(const JumpType: TJumpToProcedureType);
|
||||||
|
procedure JumpToProcedureHeaderClicked(Sender: TObject);
|
||||||
|
procedure JumpToProcedureBeginClicked(Sender: TObject);
|
||||||
protected
|
protected
|
||||||
// macros
|
// macros
|
||||||
function MacroFuncCol(const {%H-}s:string; const {%H-}Data: PtrInt;
|
function MacroFuncCol(const {%H-}s:string; const {%H-}Data: PtrInt;
|
||||||
@ -9637,6 +9642,77 @@ begin
|
|||||||
JumpToSection(jmpInterfaceUses);
|
JumpToSection(jmpInterfaceUses);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TSourceEditorManager.JumpToPos(FileName: string;
|
||||||
|
Pos: TCodeXYPosition; TopLine: Integer);
|
||||||
|
begin
|
||||||
|
if (LazarusIDE.DoOpenFileAndJumpToPos(Filename
|
||||||
|
,Point(Pos.X,Pos.Y), TopLine, -1,-1
|
||||||
|
,[ofRegularFile,ofUseCache]) = mrOk)
|
||||||
|
then
|
||||||
|
ActiveEditor.EditorControl.SetFocus;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TSourceEditorManager.JumpToProcedure(
|
||||||
|
const JumpType: TJumpToProcedureType);
|
||||||
|
const
|
||||||
|
cJumpNames: array[TJumpToProcedureType] of string = (
|
||||||
|
'procedure header', 'procedure begin');
|
||||||
|
var
|
||||||
|
SrcEditor: TSourceEditorInterface;
|
||||||
|
ProcNode: TCodeTreeNode;
|
||||||
|
Tool: TCodeTool;
|
||||||
|
CleanPos: integer;
|
||||||
|
NewPos: TCodeXYPosition;
|
||||||
|
NewTopLine: integer;
|
||||||
|
JumpFound: Boolean;
|
||||||
|
begin
|
||||||
|
if not LazarusIDE.BeginCodeTools then Exit; //==>
|
||||||
|
|
||||||
|
SrcEditor := SourceEditorManagerIntf.ActiveEditor;
|
||||||
|
if not Assigned(SrcEditor) then Exit; //==>
|
||||||
|
|
||||||
|
if CodeToolBoss.Explore(SrcEditor.CodeToolsBuffer as TCodeBuffer, Tool, false, false) then
|
||||||
|
begin
|
||||||
|
if Tool.CaretToCleanPos(
|
||||||
|
CodeXYPosition(SrcEditor.CursorTextXY.X, SrcEditor.CursorTextXY.Y, SrcEditor.CodeToolsBuffer as TCodeBuffer),
|
||||||
|
CleanPos) <> 0
|
||||||
|
then
|
||||||
|
Exit;
|
||||||
|
ProcNode := Tool.FindDeepestNodeAtPos(CleanPos{%H-},true);
|
||||||
|
while (ProcNode <> nil) and (ProcNode.Desc <> ctnProcedure) do
|
||||||
|
ProcNode := ProcNode.Parent;
|
||||||
|
|
||||||
|
if (ProcNode <> nil) and (ProcNode.Desc = ctnProcedure) then
|
||||||
|
begin
|
||||||
|
if JumpType = jmpBegin then
|
||||||
|
JumpFound := Tool.FindJumpPointInProcNode(ProcNode, NewPos, NewTopLine)
|
||||||
|
else
|
||||||
|
JumpFound := Tool.JumpToCleanPos(ProcNode.StartPos, ProcNode.StartPos, ProcNode.EndPos, NewPos, NewTopLine, True);
|
||||||
|
end else
|
||||||
|
JumpFound := False;
|
||||||
|
|
||||||
|
if JumpFound then
|
||||||
|
JumpToPos(NewPos.Code.Filename, NewPos, NewTopLine)
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
CodeToolBoss.SetError(nil, 0, 0, Format(lisCannotFind, [cJumpNames[JumpType]]));
|
||||||
|
LazarusIDE.DoJumpToCodeToolBossError;
|
||||||
|
end;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
LazarusIDE.DoJumpToCodeToolBossError;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TSourceEditorManager.JumpToProcedureBeginClicked(Sender: TObject);
|
||||||
|
begin
|
||||||
|
JumpToProcedure(jmpBegin);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TSourceEditorManager.JumpToProcedureHeaderClicked(Sender: TObject);
|
||||||
|
begin
|
||||||
|
JumpToProcedure(jmpHeader);
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TSourceEditorManager.JumpToSection(JumpType: TJumpToSectionType);
|
procedure TSourceEditorManager.JumpToSection(JumpType: TJumpToSectionType);
|
||||||
const
|
const
|
||||||
cJumpNames: array[TJumpToSectionType] of string = (
|
cJumpNames: array[TJumpToSectionType] of string = (
|
||||||
@ -9677,19 +9753,14 @@ begin
|
|||||||
Node := Tool.FindRootNode(ctnEndPoint);
|
Node := Tool.FindRootNode(ctnEndPoint);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
if (Node <> nil) then
|
|
||||||
begin
|
if (Node <> nil) and Tool.CleanPosToCaretAndTopLine(Node.StartPos, NewCodePos, NewTopLine) then
|
||||||
NewTopLine := 0;
|
JumpToPos(NewCodePos.Code.Filename, NewCodePos, NewTopLine)
|
||||||
NewCodePos := CleanCodeXYPosition;
|
|
||||||
if Tool.CleanPosToCaretAndTopLine(Node.StartPos, NewCodePos, NewTopLine)
|
|
||||||
and (LazarusIDE.DoOpenFileAndJumpToPos(NewCodePos.Code.Filename
|
|
||||||
,Point(NewCodePos.X,NewCodePos.Y), NewTopLine, -1,-1
|
|
||||||
,[ofRegularFile,ofUseCache]) = mrOk)
|
|
||||||
then
|
|
||||||
ActiveEditor.EditorControl.SetFocus;
|
|
||||||
end
|
|
||||||
else
|
else
|
||||||
ShowMessage(Format(lisCannotFind, [cJumpNames[JumpType]]));
|
begin
|
||||||
|
CodeToolBoss.SetError(nil, 0, 0, Format(lisCannotFind, [cJumpNames[JumpType]]));
|
||||||
|
LazarusIDE.DoJumpToCodeToolBossError;
|
||||||
|
end;
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
LazarusIDE.DoJumpToCodeToolBossError;
|
LazarusIDE.DoJumpToCodeToolBossError;
|
||||||
|
Binary file not shown.
@ -94,6 +94,8 @@ menu/menu_jumpto_interfaceuses.png
|
|||||||
menu/menu_jumpto_implementation.png
|
menu/menu_jumpto_implementation.png
|
||||||
menu/menu_jumpto_implementationuses.png
|
menu/menu_jumpto_implementationuses.png
|
||||||
menu/menu_jumpto_initialization.png
|
menu/menu_jumpto_initialization.png
|
||||||
|
menu/menu_jumpto_procedureheader.png
|
||||||
|
menu/menu_jumpto_procedurebegin.png
|
||||||
menu/menu_search_next_bookmark.png
|
menu/menu_search_next_bookmark.png
|
||||||
menu/menu_search_openfile_atcursor.png
|
menu/menu_search_openfile_atcursor.png
|
||||||
menu/menu_search_previous_bookmark.png
|
menu/menu_search_previous_bookmark.png
|
||||||
|
Loading…
Reference in New Issue
Block a user