2
0
Эх сурвалжийг харах

Add a right-click popup menu to the editor's gutter column for breakpoints.

Martijn Laan 1 жил өмнө
parent
commit
e83f699736

+ 7 - 0
Components/ScintEdit.pas

@@ -96,6 +96,7 @@ type
     FOnDropFiles: TScintEditDropFilesEvent;
     FOnHintShow: TScintEditHintShowEvent;
     FOnMarginClick: TScintEditMarginClickEvent;
+    FOnMarginRightClick: TScintEditMarginClickEvent;
     FOnModifiedChange: TNotifyEvent;
     FOnUpdateUI: TScintEditUpdateUIEvent;
     FOnZoom: TNotifyEvent;
@@ -346,6 +347,7 @@ type
     property OnKeyPress;
     property OnKeyUp;
     property OnMarginClick: TScintEditMarginClickEvent read FOnMarginClick write FOnMarginClick;
+    property OnMarginRightClick: TScintEditMarginClickEvent read FOnMarginRightClick write FOnMarginRightClick;
     property OnModifiedChange: TNotifyEvent read FOnModifiedChange write FOnModifiedChange;
     property OnMouseDown;
     property OnMouseMove;
@@ -1130,6 +1132,11 @@ begin
         if Assigned(FOnMarginClick) then
           FOnMarginClick(Self, N.margin, GetLineFromPosition(N.position));
       end;
+    SCN_MARGINRIGHTCLICK:
+      begin
+        if Assigned(FOnMarginRightClick) then
+          FOnMarginRightClick(Self, N.margin, GetLineFromPosition(N.position));
+      end;
     SCN_MODIFIED:
       begin
         if N.modificationType and SC_MOD_INSERTTEXT <> 0 then

+ 13 - 0
Projects/Src/CompForm.dfm

@@ -698,6 +698,19 @@ object CompileForm: TCompileForm
         Caption = '&Delete All Breakpoints'
         OnClick = RDeleteBreakPointsClick
       end
+      object BreakPointsPopupMenu: TMenuItem
+        Caption = 'BreakPointsPopupMenu'
+        Visible = False
+        OnClick = BreakPointsPopupMenuClick
+        object RToggleBreakPoint2: TMenuItem
+          Caption = 'Toggle &Breakpoint'
+          OnClick = RToggleBreakPointClick
+        end
+        object RDeleteBreakPoints2: TMenuItem
+          Caption = '&Delete All Breakpoints'
+          OnClick = RDeleteBreakPointsClick
+        end
+      end
       object RPause: TMenuItem
         Caption = 'P&ause'
         Enabled = False

+ 48 - 11
Projects/Src/CompForm.pas

@@ -230,6 +230,9 @@ type
     ThemedMarkersVirtualImageList: TVirtualImageList;
     ESelectNextOccurrence: TMenuItem;
     ESelectAllOccurrences: TMenuItem;
+    BreakPointsPopupMenu: TMenuItem;
+    RToggleBreakPoint2: TMenuItem;
+    RDeleteBreakPoints2: TMenuItem;
     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
     procedure FExitClick(Sender: TObject);
     procedure FOpenMainFileClick(Sender: TObject);
@@ -345,6 +348,7 @@ type
     procedure NavPopupMenuClick(Sender: TObject);
     procedure ESelectNextOccurrenceClick(Sender: TObject);
     procedure ESelectAllOccurrencesClick(Sender: TObject);
+    procedure BreakPointsPopupMenuClick(Sender: TObject);
   private
     { Private declarations }
     FMemos: TList<TCompScintEdit>;                      { FMemos[0] is the main memo and FMemos[1] the preprocessor output memo - also see MemosTabSet comment above }
@@ -443,6 +447,7 @@ type
     FBackNavButtonShortCut, FForwardNavButtonShortCut: TShortCut;
     FIgnoreTabSetClick: Boolean;
     FSelectNextOccurrenceShortCut, FSelectAllOccurrencesShortCut: TShortCut;
+    function AnyMemoHasBreakPoint: Boolean;
     class procedure AppOnException(Sender: TObject; E: Exception);
     procedure AppOnActivate(Sender: TObject);
     procedure AppOnIdle(Sender: TObject; var Done: Boolean);
@@ -491,6 +496,8 @@ type
     procedure MemoLinesInserted(Memo: TCompScintFileEdit; FirstLine, Count: integer);
     procedure MemoMarginClick(Sender: TObject; MarginNumber: Integer;
       Line: Integer);
+    procedure MemoMarginRightClick(Sender: TObject; MarginNumber: Integer;
+      Line: Integer);
     procedure MemoModifiedChange(Sender: TObject);
     function MemoToTabIndex(const AMemo: TCompScintEdit): Integer;
     procedure MemoUpdateUI(Sender: TObject; Updated: TScintEditUpdates);
@@ -676,6 +683,7 @@ begin
   Memo.OnKeyDown := MemoKeyDown;
   Memo.OnKeyPress := MemoKeyPress;
   Memo.OnMarginClick := MemoMarginClick;
+  Memo.OnMarginRightClick := MemoMarginRightClick;
   Memo.OnModifiedChange := MemoModifiedChange;
   Memo.OnUpdateUI := MemoUpdateUI;
   Memo.OnZoom := MemoZoom;
@@ -5184,17 +5192,16 @@ begin
     Result := False;
 end;
 
-procedure TCompileForm.RMenuClick(Sender: TObject);
-
-  function AnyMemoHasBreakPoint: Boolean;
-  begin
-    { Also see RDeleteBreakPointsClick }
-    for var Memo in FFileMemos do
-      if Memo.Used and (Memo.BreakPoints.Count > 0) then
-        Exit(True);
-    Result := False;
-  end;
+function TCompileForm.AnyMemoHasBreakPoint: Boolean;
+begin
+  { Also see RDeleteBreakPointsClick }
+  for var Memo in FFileMemos do
+    if Memo.Used and (Memo.BreakPoints.Count > 0) then
+      Exit(True);
+  Result := False;
+end;
 
+procedure TCompileForm.RMenuClick(Sender: TObject);
 begin
   RDeleteBreakPoints.Enabled := AnyMemoHasBreakPoint;
   { See UpdateRunMenu for other menu items }
@@ -5202,6 +5209,15 @@ begin
   ApplyMenuBitmaps(RMenu);
 end;
 
+procedure TCompileForm.BreakPointsPopupMenuClick(Sender: TObject);
+begin
+  RToggleBreakPoint2.Enabled := FActiveMemo is TCompScintFileEdit;
+  RDeleteBreakPoints2.Enabled := AnyMemoHasBreakPoint;
+  { Also see UpdateRunMenu }
+
+  ApplyMenuBitmaps(Sender as TMenuItem);
+end;
+
 procedure TCompileForm.UpdateRunMenu;
 begin
   CheckIfTerminated;
@@ -5221,7 +5237,7 @@ begin
   RTerminate.Enabled := FDebugging and (FDebugClientWnd <> 0);
   TerminateButton.Enabled := RTerminate.Enabled;
   REvaluate.Enabled := FDebugging and (FDebugClientWnd <> 0);
-  { See RMenuClick for other menu items }
+  { See RMenuClick for other menu items and also see BreakPointsPopupMenuClick }
 end;
 
 procedure TCompileForm.UpdateSaveMenuItemAndButton;
@@ -5284,6 +5300,11 @@ begin
     end;
   end;
 
+  { Set fake shortcuts on any duplicates of the above in popup menus }
+
+  SetFakeShortCut(RToggleBreakPoint2, RToggleBreakPoint.ShortCut);
+  SetFakeShortCut(RDeleteBreakPoints2, RDeleteBreakPoints.ShortCut);
+
   { The Nav buttons have no corresponding menu item and also no ShortCut property
     so they need special handling }
 
@@ -5507,7 +5528,9 @@ begin
           NM(RStepOver, 'debug-step-over'),
           NM(RStepOut, 'debug-step-out'),
           NM(RToggleBreakPoint, 'debug-breakpoint-filled'),
+          NM(RToggleBreakPoint2, 'debug-breakpoint-filled'),
           NM(RDeleteBreakPoints, 'debug-breakpoints-filled-eraser'),
+          NM(RDeleteBreakPoints2, 'debug-breakpoints-filled-eraser'),
           NM(REvaluate, 'variables'),
           NM(TAddRemovePrograms, 'application'),
           NM(TGenerateGUID, 'tag-script-filled'),
@@ -6459,6 +6482,20 @@ begin
     ToggleBreakPoint(Line);
 end;
 
+procedure TCompileForm.MemoMarginRightClick(Sender: TObject; MarginNumber: Integer;
+  Line: Integer);
+begin
+  if MarginNumber = 1 then begin
+    var Point := SmallPointToPoint(TSmallPoint(GetMessagePos()));
+    var PopupMenu := TCompileFormPopupMenu.Create(Self, BreakPointsPopupMenu);
+    try
+      PopupMenu.Popup(Point.X, Point.Y);
+    finally
+      PopupMenu.Free;
+    end;
+  end;
+end;
+
 procedure TCompileForm.RToggleBreakPointClick(Sender: TObject);
 begin
   ToggleBreakPoint(FActiveMemo.CaretLine);

+ 0 - 2
Projects/Src/CompScintEdit.pas

@@ -148,8 +148,6 @@ begin
     -3.6.6: Investigate SCFIND_CXX11REGEX: C++ 11 <regex> support built by default.
             Can be disabled by defining NO_CXX11_REGEX. Good (?) overview at:
             https://cplusplus.com/reference/regex/ECMAScript/
-    -3.7.1: Test if SCN_MARGINRIGHTCLICK works and if so: use it to display a
-            set/clear breakpoint popup?
     -4.0.0: Investigate: "The default encoding in Scintilla is UTF-8."
     -5.0.1: Review using SCI_INDICSETSTROKEWIDTH for high DPI support on INDIC_SQUIGGLE }
 

+ 1 - 0
whatsnew.htm

@@ -46,6 +46,7 @@ For conditions of distribution and use, see <a href="files/is/license.txt">LICEN
 <p>Other changes:</p>
 <ul>
   <li>Added shortcuts to move selected lines up or down (Alt+Up and Alt+Down).</li>
+  <li>Added a right-click popup menu to the editor's gutter column for breakpoints.</li>
   <li>Minor tweaks and documentation improvements.</li>
 </ul>