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:
juha 2015-09-10 13:57:24 +00:00
parent 9572033709
commit 24978f559e
10 changed files with 106 additions and 16 deletions

View File

@ -80,6 +80,8 @@ const
ecJumpToImplementation = ecFirstLazarus + 27;
ecJumpToImplementationUses= ecFirstLazarus + 28;
ecJumpToInitialization = ecFirstLazarus + 29;
ecJumpToProcedureHeader = ecFirstLazarus + 30;
ecJumpToProcedureBegin = ecFirstLazarus + 31;
// edit selection
ecSelectionUpperCase = ecFirstLazarus + 50;

View File

@ -1920,12 +1920,9 @@ begin
end;
procedure TIDEMenuCommand.SetVisible(const AValue: Boolean);
var
xBtn: TIDEToolButton;
begin
inherited SetVisible(AValue);
for xBtn in ToolButtons do
xBtn.Visible := AValue;
//do not set visible for tool buttons, you usually only want to hide menu item and keep tool buttons visible
end;
procedure TIDEMenuCommand.ToolButtonAdded(const aBtn: TIDEToolButton);

View File

@ -555,6 +555,8 @@ begin
ecJumpToImplementation : Result:= lisMenuJumpToImplementation;
ecJumpToImplementationUses: Result:= lisMenuJumpToImplementationUses;
ecJumpToInitialization : Result:= lisMenuJumpToInitialization;
ecJumpToProcedureHeader : Result:= lisMenuJumpToProcedureHeader;
ecJumpToProcedureBegin : Result:= lisMenuJumpToProcedureBegin;
ecOpenFileAtCursor : Result:= srkmecOpenFileAtCursor;
ecProcedureList : Result:= lisPListProcedureList;
@ -2769,6 +2771,8 @@ begin
AddDefault(C, 'Jump to Implementation', lisMenuJumpToImplementation, ecJumpToImplementation);
AddDefault(C, 'Jump to Implementation uses', lisMenuJumpToImplementationUses, ecJumpToImplementationUses);
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, 'Remove empty methods', srkmecRemoveEmptyMethods, ecRemoveEmptyMethods);
AddDefault(C, 'Remove unused units', srkmecRemoveUnusedUnits, ecRemoveUnusedUnits);

View File

@ -389,6 +389,8 @@ resourcestring
lisMenuJumpToImplementation = 'Jump to Implementation';
lisMenuJumpToImplementationUses = 'Jump to Implementation uses';
lisMenuJumpToInitialization = 'Jump to Initialization';
lisMenuJumpToProcedureHeader = 'Jump to Procedure header';
lisMenuJumpToProcedureBegin = 'Jump to Procedure begin';
lisMenuViewUnits = 'Units ...';
lisMenuViewForms = 'Forms ...';
lisMenuViewUnitDependencies = 'Unit Dependencies';

View File

@ -2101,6 +2101,8 @@ begin
MainIDEBar.itmJumpToImplementation.OnClick := @SourceEditorManager.JumpToImplementationClicked;
MainIDEBar.itmJumpToImplementationUses.OnClick := @SourceEditorManager.JumpToImplementationUsesClicked;
MainIDEBar.itmJumpToInitialization.OnClick := @SourceEditorManager.JumpToInitializationClicked;
MainIDEBar.itmJumpToProcedureHeader.OnClick := @SourceEditorManager.JumpToProcedureHeaderClicked;
MainIDEBar.itmJumpToProcedureBegin.OnClick := @SourceEditorManager.JumpToProcedureBeginClicked;
MainIDEBar.itmFindBlockStart.OnClick:=@mnuSearchFindBlockStart;
MainIDEBar.itmFindBlockOtherEnd.OnClick:=@mnuSearchFindBlockOtherEnd;
MainIDEBar.itmFindDeclaration.OnClick:=@mnuSearchFindDeclaration;

View File

@ -146,6 +146,8 @@ type
itmJumpToImplementation: TIDEMenuCommand;
itmJumpToImplementationUses: TIDEMenuCommand;
itmJumpToInitialization: TIDEMenuCommand;
itmJumpToProcedureHeader: TIDEMenuCommand;
itmJumpToProcedureBegin: TIDEMenuCommand;
//itmBookmarks: TIDEMenuSection;
itmSetFreeBookmark: TIDEMenuCommand;
itmJumpToNextBookmark: TIDEMenuCommand;

View File

@ -1084,6 +1084,12 @@ begin
CreateMenuItem(ParentMI,itmJumpToImplementationUses,'itmJumpToImplementationUses',lisMenuJumpToImplementationUses, 'menu_jumpto_implementationuses');
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');
ParentMI:=itmBookmarks;
@ -1542,6 +1548,8 @@ begin
itmJumpToImplementationUses.ToolButtonClass:=TJumpToSectionToolButton;
itmJumpToInitialization.Command:=GetCommand(ecJumpToInitialization);
itmJumpToInitialization.ToolButtonClass:=TJumpToSectionToolButton;
itmJumpToProcedureHeader.Command:=GetCommand(ecJumpToProcedureHeader);
itmJumpToProcedureBegin.Command:=GetCommand(ecJumpToProcedureBegin);
itmFindBlockOtherEnd.Command:=GetCommand(ecFindBlockOtherEnd);
itmFindBlockStart.Command:=GetCommand(ecFindBlockStart);
itmFindDeclaration.Command:=GetCommand(ecFindDeclaration);

View File

@ -948,6 +948,7 @@ type
jmpInterface, jmpInterfaceUses,
jmpImplementation, jmpImplementationUses,
jmpInitialization);
TJumpToProcedureType = (jmpHeader, jmpBegin);
{ TSourceEditorManager }
(* Reintroduce all Methods with the final types *)
@ -1025,12 +1026,16 @@ type
public
procedure BookMarkNextClicked(Sender: TObject);
procedure BookMarkPrevClicked(Sender: TObject);
procedure JumpToPos(FileName: string; Pos: TCodeXYPosition; TopLine: Integer);
procedure JumpToSection(JumpType: TJumpToSectionType);
procedure JumpToInterfaceClicked(Sender: TObject);
procedure JumpToInterfaceUsesClicked(Sender: TObject);
procedure JumpToImplementationClicked(Sender: TObject);
procedure JumpToImplementationUsesClicked(Sender: TObject);
procedure JumpToInitializationClicked(Sender: TObject);
procedure JumpToProcedure(const JumpType: TJumpToProcedureType);
procedure JumpToProcedureHeaderClicked(Sender: TObject);
procedure JumpToProcedureBeginClicked(Sender: TObject);
protected
// macros
function MacroFuncCol(const {%H-}s:string; const {%H-}Data: PtrInt;
@ -9637,6 +9642,77 @@ begin
JumpToSection(jmpInterfaceUses);
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);
const
cJumpNames: array[TJumpToSectionType] of string = (
@ -9677,19 +9753,14 @@ begin
Node := Tool.FindRootNode(ctnEndPoint);
end;
end;
if (Node <> nil) then
begin
NewTopLine := 0;
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
if (Node <> nil) and Tool.CleanPosToCaretAndTopLine(Node.StartPos, NewCodePos, NewTopLine) then
JumpToPos(NewCodePos.Code.Filename, NewCodePos, NewTopLine)
else
ShowMessage(Format(lisCannotFind, [cJumpNames[JumpType]]));
begin
CodeToolBoss.SetError(nil, 0, 0, Format(lisCannotFind, [cJumpNames[JumpType]]));
LazarusIDE.DoJumpToCodeToolBossError;
end;
end
else
LazarusIDE.DoJumpToCodeToolBossError;

Binary file not shown.

View File

@ -94,6 +94,8 @@ menu/menu_jumpto_interfaceuses.png
menu/menu_jumpto_implementation.png
menu/menu_jumpto_implementationuses.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_openfile_atcursor.png
menu/menu_search_previous_bookmark.png