diff --git a/ide/basedebugmanager.pas b/ide/basedebugmanager.pas index bcc9f8dcd4..176367c55c 100644 --- a/ide/basedebugmanager.pas +++ b/ide/basedebugmanager.pas @@ -102,6 +102,7 @@ type function InitDebugger: Boolean; virtual; abstract; function DoPauseProject: TModalResult; virtual; abstract; + function DoShowExecutionPoint: TModalResult; virtual; abstract; function DoStepIntoProject: TModalResult; virtual; abstract; function DoStepOverProject: TModalResult; virtual; abstract; function DoRunToCursor: TModalResult; virtual; abstract; diff --git a/ide/debugmanager.pas b/ide/debugmanager.pas index ff5b6a7e65..055dd0255e 100644 --- a/ide/debugmanager.pas +++ b/ide/debugmanager.pas @@ -160,6 +160,7 @@ type function InitDebugger: Boolean; override; function DoPauseProject: TModalResult; override; + function DoShowExecutionPoint: TModalResult; override; function DoStepIntoProject: TModalResult; override; function DoStepOverProject: TModalResult; override; function DoRunToCursor: TModalResult; override; @@ -1978,6 +1979,7 @@ begin PauseSpeedButton.Enabled := (not DebuggerInvalid) and (dcPause in FDebugger.Commands); itmRunMenuPause.Enabled := PauseSpeedButton.Enabled; + itmRunMenuShowExecutionPoint.Enabled := (not DebuggerInvalid) and (FDebugger.State = dsPause); StepIntoSpeedButton.Enabled := DebuggerInvalid or (dcStepInto in FDebugger.Commands) or (FDebugger.State = dsIdle); itmRunMenuStepInto.Enabled := StepIntoSpeedButton.Enabled; @@ -2302,6 +2304,20 @@ begin Result := mrOk; end; +function TDebugManager.DoShowExecutionPoint: TModalResult; +var + DummyLocation: TDBGLocationRec; +begin + Result := mrCancel; + if (MainIDE.ToolStatus <> itDebugger) + or (FDebugger = nil) or Destroying + then Exit; + + DummyLocation.SrcLine := 0; + DebuggerCurrentLine(FDebugger, DummyLocation); + Result := mrOk; +end; + function TDebugManager.DoStepIntoProject: TModalResult; begin if (MainIDE.DoInitProjectRun <> mrOK) diff --git a/ide/keymapping.pp b/ide/keymapping.pp index bc040e4e95..8a84190d16 100644 --- a/ide/keymapping.pp +++ b/ide/keymapping.pp @@ -535,6 +535,7 @@ begin ecAbortBuild: SetResult(VK_UNKNOWN,[],VK_UNKNOWN,[]); ecRun: SetResult(VK_F9,[],VK_UNKNOWN,[]); ecPause: SetResult(VK_UNKNOWN,[],VK_UNKNOWN,[]); + ecShowExecutionPoint: SetResult(VK_UNKNOWN,[],VK_UNKNOWN,[]); ecStepInto: SetResult(VK_F7,[],VK_UNKNOWN,[]); ecStepOver: SetResult(VK_F8,[],VK_UNKNOWN,[]); ecRunToCursor: SetResult(VK_F4,[],VK_UNKNOWN,[]); @@ -955,6 +956,7 @@ begin ecAbortBuild: SetResult(VK_UNKNOWN,[],VK_UNKNOWN,[],VK_UNKNOWN,[],VK_UNKNOWN,[]); ecRun: SetResult(VK_F9,[],VK_UNKNOWN,[],VK_UNKNOWN,[],VK_UNKNOWN,[]); ecPause: SetResult(VK_UNKNOWN,[],VK_UNKNOWN,[],VK_UNKNOWN,[],VK_UNKNOWN,[]); + ecShowExecutionPoint: SetResult(VK_UNKNOWN,[],VK_UNKNOWN,[],VK_UNKNOWN,[],VK_UNKNOWN,[]); ecStepInto: SetResult(VK_F7,[],VK_UNKNOWN,[],VK_UNKNOWN,[],VK_UNKNOWN,[]); ecStepOver: SetResult(VK_F8,[],VK_UNKNOWN,[],VK_UNKNOWN,[],VK_UNKNOWN,[]); ecRunToCursor: SetResult(VK_F4,[],VK_UNKNOWN,[],VK_UNKNOWN,[],VK_UNKNOWN,[]); @@ -1557,6 +1559,7 @@ begin ecAbortBuild: SetResult(VK_UNKNOWN,[],VK_UNKNOWN,[]); ecRun: SetResult(VK_R,[ssMeta],VK_UNKNOWN,[]); ecPause: SetResult(VK_UNKNOWN,[],VK_UNKNOWN,[]); + ecShowExecutionPoint: SetResult(VK_UNKNOWN,[],VK_UNKNOWN,[]); ecStepInto: SetResult(VK_R,[ssMeta,ssAlt],VK_UNKNOWN,[]); ecStepOver: SetResult(VK_R,[ssMeta,ssShift],VK_UNKNOWN,[]); ecRunToCursor: SetResult(VK_UNKNOWN,[],VK_UNKNOWN,[]); @@ -1719,6 +1722,7 @@ begin ecAbortBuild: SetResult(VK_UNKNOWN,[],VK_UNKNOWN,[]); ecRun: SetResult(VK_F9,[],VK_F9,[ssMeta]); ecPause: SetResult(VK_UNKNOWN,[],VK_UNKNOWN,[]); + ecShowExecutionPoint: SetResult(VK_UNKNOWN,[],VK_UNKNOWN,[]); ecStepInto: SetResult(VK_F7,[],VK_F7,[ssMeta]); ecStepOver: SetResult(VK_F8,[],VK_F8,[ssMeta]); ecRunToCursor: SetResult(VK_F4,[],VK_F4,[ssMeta]); @@ -2071,6 +2075,7 @@ begin ecAbortBuild : Result:= srkmecAbortBuild; ecRun : Result:= srkmecRun; ecPause : Result:= srkmecPause; + ecShowExecutionPoint : Result:= srkmecShowExecutionPoint; ecStepInto : Result:= lisMenuStepInto; ecStepOver : Result:= lisMenuStepOver; ecRunToCursor : Result:= lisMenuRunToCursor; @@ -2761,6 +2766,7 @@ begin AddDefault(C, 'Abort building', lisKMAbortBuilding, ecAbortBuild); AddDefault(C, 'Run program', lisKMRunProgram, ecRun); AddDefault(C, 'Pause program', lisKMPauseProgram, ecPause); + AddDefault(C, 'Show execution point', lisMenuShowExecutionPoint, ecShowExecutionPoint); AddDefault(C, 'Step into', lisMenuStepInto, ecStepInto); AddDefault(C, 'Step over', lisMenuStepOver, ecStepOver); AddDefault(C, 'Run to cursor', lisMenuRunToCursor, ecRunToCursor); diff --git a/ide/lazarusidestrconsts.pas b/ide/lazarusidestrconsts.pas index de58625fbf..c582fde9cb 100644 --- a/ide/lazarusidestrconsts.pas +++ b/ide/lazarusidestrconsts.pas @@ -331,6 +331,7 @@ resourcestring +'empty for file path)'; lisBFRunCommand = 'Run Command'; lisMenuPause = 'Pause'; + lisMenuShowExecutionPoint = 'Show execution point'; lisMenuStepInto = 'Step into'; lisMenuStepOver = 'Step over'; lisMenuRunToCursor = 'Run to cursor'; @@ -2370,6 +2371,7 @@ resourcestring srkmecAbortBuild = 'abort build'; srkmecRun = 'run program'; srkmecPause = 'pause program'; + srkmecShowExecutionPoint = 'show execution point'; srkmecStopProgram = 'stop program'; srkmecResetDebugger = 'reset debugger'; srkmecToggleBreakPoint = 'toggle break point'; diff --git a/ide/main.pp b/ide/main.pp index 4844c34269..570dfcbe4c 100644 --- a/ide/main.pp +++ b/ide/main.pp @@ -293,6 +293,7 @@ type procedure mnuAbortBuildProjectClicked(Sender: TObject); procedure mnuRunProjectClicked(Sender: TObject); procedure mnuPauseProjectClicked(Sender: TObject); + procedure mnuShowExecutionPointClicked(Sender: TObject); procedure mnuStepIntoProjectClicked(Sender: TObject); procedure mnuStepOverProjectClicked(Sender: TObject); procedure mnuRunToCursorProjectClicked(Sender: TObject); @@ -2413,6 +2414,8 @@ begin itmRunMenuRun.OnClick := @mnuRunProjectClicked; itmRunMenuPause.Enabled := False; itmRunMenuPause.OnClick := @mnuPauseProjectClicked; + itmRunMenuShowExecutionPoint.Enabled := False; + itmRunMenuShowExecutionPoint.OnClick := @mnuShowExecutionPointClicked; itmRunMenuStepInto.OnClick := @mnuStepIntoProjectClicked; itmRunMenuStepOver.OnClick := @mnuStepOverProjectClicked; itmRunMenuRunToCursor.OnClick := @mnuRunToCursorProjectClicked; @@ -3844,6 +3847,11 @@ begin DebugBoss.DoPauseProject; end; +Procedure TMainIDE.mnuShowExecutionPointClicked(Sender: TObject); +begin + DebugBoss.DoShowExecutionPoint; +end; + Procedure TMainIDE.mnuStepIntoProjectClicked(Sender: TObject); begin DebugBoss.DoStepIntoProject; diff --git a/ide/mainbar.pas b/ide/mainbar.pas index c9d259b5c5..dc1e8ce86d 100644 --- a/ide/mainbar.pas +++ b/ide/mainbar.pas @@ -252,6 +252,7 @@ type //itmRunnning: TIDEMenuSection; itmRunMenuRun: TIDEMenuCommand; itmRunMenuPause: TIDEMenuCommand; + itmRunMenuShowExecutionPoint: TIDEMenuCommand; itmRunMenuStepInto: TIDEMenuCommand; itmRunMenuStepOver: TIDEMenuCommand; itmRunMenuRunToCursor: TIDEMenuCommand; diff --git a/ide/mainbase.pas b/ide/mainbase.pas index 35ff046ee1..2d1868e453 100644 --- a/ide/mainbase.pas +++ b/ide/mainbase.pas @@ -652,6 +652,7 @@ begin CreateMenuItem(ParentMI,itmRunMenuRun,'itmRunMenuRun',lisMenuProjectRun,'menu_run'); CreateMenuItem(ParentMI,itmRunMenuPause,'itmRunMenuPause',lisMenuPause,'menu_pause'); + CreateMenuItem(ParentMI,itmRunMenuShowExecutionPoint,'itmRunMenuShowExecutionPoint',lisMenuShowExecutionPoint,'debugger_show_execution_point'); CreateMenuItem(ParentMI,itmRunMenuStepInto,'itmRunMenuStepInto',lisMenuStepInto,'menu_stepinto'); CreateMenuItem(ParentMI,itmRunMenuStepOver,'itmRunMenuStepOver',lisMenuStepOver,'menu_stepover'); CreateMenuItem(ParentMI,itmRunMenuRunToCursor,'itmRunMenuRunToCursor',lisMenuRunToCursor,'menu_run_cursor'); diff --git a/ideintf/idecommands.pas b/ideintf/idecommands.pas index cbf1219755..e02a0fc61c 100644 --- a/ideintf/idecommands.pas +++ b/ideintf/idecommands.pas @@ -231,6 +231,7 @@ const ecInspect = ecFirstLazarus + 415; ecEvaluate = ecFirstLazarus + 416; ecAddWatch = ecFirstLazarus + 417; + ecShowExecutionPoint = ecFirstLazarus + 418; // project menu ecNewProject = ecFirstLazarus + 500;