From f066b3d0d7c68cf5baf638d6995214b828f586fb Mon Sep 17 00:00:00 2001 From: Martijn Laan <1092369+martijnlaan@users.noreply.github.com> Date: Fri, 14 Jun 2024 07:34:35 +0200 Subject: [PATCH] Ignore previous: we do know whether it's the 'first' SelectNext or not. --- Projects/Src/CompForm.pas | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/Projects/Src/CompForm.pas b/Projects/Src/CompForm.pas index 0c6bccdd1..ed71b7a67 100644 --- a/Projects/Src/CompForm.pas +++ b/Projects/Src/CompForm.pas @@ -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); @@ -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); @@ -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) @@ -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);