From cee38e2b1bd0dd53e5552cb6865ed988b485f34f Mon Sep 17 00:00:00 2001 From: ondrej Date: Mon, 6 Nov 2017 20:14:07 +0000 Subject: [PATCH] IDE: Find/Replace: save options depending on selection availability. Issue #32619 git-svn-id: trunk@56325 - --- ide/findinfilesdlg.pas | 4 +- ide/inputhistory.pas | 4 +- ide/inputhistorywithsearchopt.pas | 69 +++++++++++++++++++++++++------ ide/sourceeditor.pp | 11 ++--- 4 files changed, 63 insertions(+), 25 deletions(-) diff --git a/ide/findinfilesdlg.pas b/ide/findinfilesdlg.pas index a580bf4ae6..a9f0612a7c 100644 --- a/ide/findinfilesdlg.pas +++ b/ide/findinfilesdlg.pas @@ -375,7 +375,7 @@ begin AssignToComboBox(FileMaskComboBox, InputHistories.FindInFilesMaskHistory); Options := InputHistories.FindInFilesSearchOptions; //share basic options with FindReplaceDlg - SynSearchOptions := InputHistoriesSO.FindOptions * SharedOptions; + SynSearchOptions := InputHistoriesSO.FindOptions[False] * SharedOptions; end; procedure TLazFindInFilesDialog.SaveHistory; @@ -391,7 +391,7 @@ begin InputHistories.AddToFindInFilesMaskHistory(FileMaskComboBox.Text); InputHistories.FindInFilesSearchOptions:=Options; //share basic options with FindReplaceDlg - InputHistoriesSO.FindOptions := InputHistoriesSO.FindOptions - SharedOptions + InputHistoriesSO.FindOptions[False] := InputHistoriesSO.FindOptions[False] - SharedOptions + (SynSearchOptions*SharedOptions); InputHistories.Save; end; diff --git a/ide/inputhistory.pas b/ide/inputhistory.pas index 840b8e9cd0..d1bd01fa74 100644 --- a/ide/inputhistory.pas +++ b/ide/inputhistory.pas @@ -39,7 +39,7 @@ uses // RTL + LCL Classes, SysUtils, Laz_AVL_Tree, // LCL - Dialogs, + Dialogs, SynEditTypes, // LazUtils LazFileCache, LazFileUtils, LazUTF8, AvgLvlTree, Laz2_XMLCfg, // Codetools @@ -275,7 +275,7 @@ type end; const - LazFindSearchOptionsDefault = []; + LazFindSearchOptionsDefault: array[Boolean] of TSynSearchOptions = ([], [ssoEntireScope, ssoSelectedOnly]); LazFindInFileSearchOptionsDefault = [fifSearchOpen, fifIncludeSubDirs]; LazFindInFileSearchOptionNames: array[TLazFindInFileSearchOption] of string =( 'MatchCase', diff --git a/ide/inputhistorywithsearchopt.pas b/ide/inputhistorywithsearchopt.pas index 5239089c3f..725c3fbf30 100644 --- a/ide/inputhistorywithsearchopt.pas +++ b/ide/inputhistorywithsearchopt.pas @@ -41,15 +41,27 @@ type { TInputHistoriesWithSearchOpt } TInputHistoriesWithSearchOpt = class(TInputHistories) + private const + PathToOptions0: array[Boolean] of string = ('Options', 'Options'); // old config file + PathToOptions1: array[Boolean] of string = ('Options', 'SelOptions'); // new config file + XMLConfigVersion = 1; + public const + SaveOptionsGeneral = [ssoMatchCase, ssoWholeWord, ssoRegExpr, ssoRegExprMultiLine, + ssoPrompt, ssoBackwards]; + SaveOptionsSelSpecific = [ssoEntireScope, ssoSelectedOnly]; + SaveOptions = SaveOptionsGeneral + SaveOptionsSelSpecific; private - FFindOptions: TSynSearchOptions; + FFindOptions: array[Boolean] of TSynSearchOptions; // array[SelAvail] - selection available + function GetFindOptions(const ASelAvail: Boolean): TSynSearchOptions; + procedure SetFindOptions(const ASelAvail: Boolean; + const AFindOptions: TSynSearchOptions); protected procedure LoadSearchOptions(XMLConfig: TXMLConfig; const Path: string); override; procedure SaveSearchOptions(XMLConfig: TXMLConfig; const Path: string); override; public constructor Create; destructor Destroy; override; - property FindOptions: TSynSearchOptions read FFindOptions write FFindOptions; + property FindOptions[const ASelAvail: Boolean]: TSynSearchOptions read GetFindOptions write SetFindOptions; end; const @@ -86,31 +98,62 @@ begin inherited Destroy; end; +function TInputHistoriesWithSearchOpt.GetFindOptions( + const ASelAvail: Boolean): TSynSearchOptions; +begin + Result := FFindOptions[ASelAvail]*SaveOptions; +end; + procedure TInputHistoriesWithSearchOpt.LoadSearchOptions(XMLConfig: TXMLConfig; const Path: string); var FindOption: TSynSearchOption; + PathToOptions: array[Boolean] of string; + I: Boolean; begin - FFindOptions:=[]; - for FindOption:=Low(FFindOptions) to High(FFindOptions) do + if XMLConfig.GetValue(Path+'Find/Version/Value',0)<=0 then + PathToOptions := PathToOptions0 + else + PathToOptions := PathToOptions1; + + for I := Low(FFindOptions) to High(FFindOptions) do begin - if XMLConfig.GetValue(Path+'Find/Options/'+LazFindSearchOptionNames[FindOption], - FindOption in LazFindSearchOptionsDefault) - then - Include(FFindOptions,FindOption); + FFindOptions[I]:=[]; + for FindOption:=Low(FFindOptions[I]) to High(FFindOptions[I]) do + begin + if XMLConfig.GetValue(Path+'Find/'+PathToOptions[I]+'/'+LazFindSearchOptionNames[FindOption], + FindOption in LazFindSearchOptionsDefault[I]) + then + Include(FFindOptions[I],FindOption); + end; end; end; procedure TInputHistoriesWithSearchOpt.SaveSearchOptions(XMLConfig: TXMLConfig; const Path: string); var FindOption: TSynSearchOption; + I: Boolean; begin - for FindOption:=Low(FFindOptions) to High(FFindOptions) do begin - XMLConfig.SetDeleteValue( - Path+'Find/Options/'+LazFindSearchOptionNames[FindOption], - FindOption in FindOptions, - FindOption in LazFindSearchOptionsDefault); + for I := Low(FFindOptions) to High(FFindOptions) do + begin + XMLConfig.SetValue(Path+'Find/Version/Value', XMLConfigVersion); + + for FindOption:=Low(FFindOptions[I]) to High(FFindOptions[I]) do + begin + XMLConfig.SetDeleteValue( + Path+'Find/'+PathToOptions1[I]+'/'+LazFindSearchOptionNames[FindOption], + FindOption in FindOptions[I], + FindOption in LazFindSearchOptionsDefault[I]); + end; end; end; +procedure TInputHistoriesWithSearchOpt.SetFindOptions(const ASelAvail: Boolean; + const AFindOptions: TSynSearchOptions); +begin + FFindOptions[ASelAvail] := AFindOptions*SaveOptions; + FFindOptions[not ASelAvail] := AFindOptions*SaveOptionsGeneral // change only general options + + FFindOptions[not ASelAvail]*SaveOptionsSelSpecific; +end; + end. diff --git a/ide/sourceeditor.pp b/ide/sourceeditor.pp index ed26a0676c..d113e04563 100644 --- a/ide/sourceeditor.pp +++ b/ide/sourceeditor.pp @@ -3328,9 +3328,6 @@ end; {------------------------------S T A R T F I N D-----------------------------} procedure TSourceEditor.StartFindAndReplace(Replace:boolean); -const - SaveOptions = [ssoMatchCase, ssoWholeWord, ssoRegExpr, ssoRegExprMultiLine, - ssoPrompt, ssoEntireScope, ssoBackwards]; var NewOptions: TSynSearchOptions; ALeft,ATop:integer; @@ -3346,16 +3343,14 @@ begin NewOptions := NewOptions + [ssoReplace, ssoReplaceAll] else NewOptions := NewOptions - [ssoReplace, ssoReplaceAll]; - NewOptions:=NewOptions-SaveOptions+InputHistoriesSO.FindOptions*SaveOptions - -[ssoSelectedOnly]; + NewOptions:=NewOptions-InputHistoriesSO.SaveOptions + +InputHistoriesSO.FindOptions[EditorComponent.SelAvail]; // Fill in history items LazFindReplaceDialog.TextToFindComboBox.Items.Assign(InputHistoriesSO.FindHistory); LazFindReplaceDialog.ReplaceTextComboBox.Items.Assign(InputHistoriesSO.ReplaceHistory); with EditorComponent do begin - if SelAvail then - NewOptions := NewOptions + [ssoSelectedOnly, ssoEntireScope]; if EditorOpts.FindTextAtCursor then begin if SelAvail and (BlockBegin.Y = BlockEnd.Y) and ( ((ComparePoints(BlockBegin, LogicalCaretXY) <= 0) and @@ -3386,7 +3381,7 @@ begin LazFindReplaceDialog.Options := NewOptions; DlgResult:=LazFindReplaceDialog.ShowModal; - InputHistoriesSO.FindOptions:=LazFindReplaceDialog.Options*SaveOptions; + InputHistoriesSO.FindOptions[EditorComponent.SelAvail]:=LazFindReplaceDialog.Options; InputHistoriesSO.FindAutoComplete:=LazFindReplaceDialog.EnableAutoComplete; if DlgResult = mrCancel then begin