Skip to content

Commit

Permalink
Ignore previous: we do know whether it's the 'first' SelectNext or not.
Browse files Browse the repository at this point in the history
  • Loading branch information
martijnlaan committed Jun 14, 2024
1 parent 477c6c1 commit f066b3d
Showing 1 changed file with 21 additions and 8 deletions.
29 changes: 21 additions & 8 deletions Projects/Src/CompForm.pas
Original file line number Diff line number Diff line change
Expand Up @@ -447,6 +447,7 @@ TCompileForm = class(TUIStateForm)
FBackNavButtonShortCut, FForwardNavButtonShortCut: TShortCut;
FIgnoreTabSetClick: Boolean;
FSelectNextOccurrenceShortCut, FSelectAllOccurrencesShortCut: TShortCut;
FSelectNextOccurrenceOptions: TScintFindOptions;
function AnyMemoHasBreakPoint: Boolean;
class procedure AppOnException(Sender: TObject; E: Exception);
procedure AppOnActivate(Sender: TObject);
Expand Down Expand Up @@ -523,6 +524,7 @@ TCompileForm = class(TUIStateForm)
procedure ResetAllMemosLineState;
procedure StartProcess;
function SaveFile(const AMemo: TCompScintFileEdit; const SaveAs: Boolean): Boolean;
function SelectAllOrNextOccurrencesStart: TScintFindOptions;
procedure SetErrorLine(const AMemo: TCompScintFileEdit; const ALine: Integer);
procedure SetStatusPanelVisible(const AVisible: Boolean);
procedure SetStepLine(const AMemo: TCompScintFileEdit; ALine: Integer);
Expand Down Expand Up @@ -938,6 +940,10 @@ constructor TCompileForm.Create(AOwner: TComponent);
FMenuBitmapsSize.cx := 0;
FMenuBitmapsSize.cy := 0;

{ Only used if a multi selection is started manually with a non-empty main
selection before FSelectNextOccurrenceShortCut is used }
FSelectNextOccurrenceOptions := GetSelTextOccurrenceFindOptions;

if CommandLineCompile then begin
ReadSignTools(FSignTools);
PostMessage(Handle, WM_StartCommandLineCompile, 0, 0)
Expand Down Expand Up @@ -2514,26 +2520,33 @@ procedure TCompileForm.ESelectAllClick(Sender: TObject);
FActiveMemo.SelectAll;
end;

procedure TCompileForm.ESelectAllOccurrencesClick(Sender: TObject);
function TCompileForm.SelectAllOrNextOccurrencesStart: TScintFindOptions;
begin
var Options := GetSelTextOccurrenceFindOptions;
Result := GetSelTextOccurrenceFindOptions;
if FActiveMemo.SelEmpty then begin
var Range := FActiveMemo.WordAtCursorRange;
if Range.StartPos <> Range.EndPos then begin
FActiveMemo.SetSingleSelection(Range.EndPos, Range.StartPos);
Options := GetWordOccurrenceFindOptions;
Result := GetWordOccurrenceFindOptions;
end;
end;
end;

procedure TCompileForm.ESelectAllOccurrencesClick(Sender: TObject);
begin
var Options := SelectAllOrNextOccurrencesStart;
FActiveMemo.SelectAllOccurrences(Options);
end;

procedure TCompileForm.ESelectNextOccurrenceClick(Sender: TObject);
begin
{ Currently this always uses GetWordOccurrenceFindOptions but ideally it would
know whether this is the 'first' SelectNext or not. Then, if first it would
do what SelectAll does to choose a FindOptions. And if next it would reuse
that. This is what VSCode does. }
FActiveMemo.SelectNextOccurrence(GetWordOccurrenceFindOptions);
{ This is the 'first' SelectNext if there are no additional selections yet or
if the main selection is empty. The first SelectNext determines the find
options to be used for the next SelectNext. This is like VSCode as also
consistent with SelectAll and occurrence highlighting. }
if (FActiveMemo.SelectionCount = 1) or FActiveMemo.SelEmpty then
FSelectNextOccurrenceOptions := SelectAllOrNextOccurrencesStart;
FActiveMemo.SelectNextOccurrence(FSelectNextOccurrenceOptions);
end;

procedure TCompileForm.ECompleteWordClick(Sender: TObject);
Expand Down

0 comments on commit f066b3d

Please sign in to comment.