diff --git a/src/ce_search.lfm b/src/ce_search.lfm index 905222f3..acae4193 100644 --- a/src/ce_search.lfm +++ b/src/ce_search.lfm @@ -133,9 +133,9 @@ inherited CESearchWidget: TCESearchWidget TabOrder = 3 object chkWWord: TCheckBox Left = 8 - Height = 21 + Height = 23 Top = 0 - Width = 84 + Width = 86 Caption = 'whole word' Checked = True State = cbChecked @@ -143,17 +143,17 @@ inherited CESearchWidget: TCESearchWidget end object chkBack: TCheckBox Left = 8 - Height = 21 + Height = 23 Top = 24 - Width = 73 + Width = 75 Caption = 'backward' TabOrder = 2 end object chkFromCur: TCheckBox Left = 8 - Height = 21 + Height = 23 Top = 48 - Width = 84 + Width = 86 Caption = 'from cursor' Checked = True State = cbChecked @@ -161,25 +161,25 @@ inherited CESearchWidget: TCESearchWidget end object chkCaseSens: TCheckBox Left = 128 - Height = 21 + Height = 23 Top = 0 - Width = 93 + Width = 95 Caption = 'case sensitive' TabOrder = 4 end object chkPrompt: TCheckBox Left = 128 - Height = 21 + Height = 23 Top = 24 - Width = 62 + Width = 64 Caption = 'prompt' TabOrder = 1 end object chkRegex: TCheckBox Left = 128 - Height = 21 + Height = 23 Top = 48 - Width = 117 + Width = 119 Caption = 'regular expression' Checked = True State = cbChecked @@ -244,10 +244,10 @@ inherited CESearchWidget: TCESearchWidget ClientWidth = 386 TabOrder = 5 object cbReplaceWth: TComboBox - Left = 92 + Left = 94 Height = 23 Top = 0 - Width = 294 + Width = 292 Align = alClient Anchors = [akTop, akLeft, akBottom] ItemHeight = 15 @@ -258,7 +258,7 @@ inherited CESearchWidget: TCESearchWidget Left = 0 Height = 23 Top = 0 - Width = 92 + Width = 94 Align = alLeft Caption = 'Replace with ' OnChange = chkEnableRepChange diff --git a/src/ce_search.pas b/src/ce_search.pas index cef81836..265846ff 100644 --- a/src/ce_search.pas +++ b/src/ce_search.pas @@ -7,12 +7,41 @@ interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, Menus, StdCtrls, actnList, Buttons, SynEdit, SynEditSearch, SynEditTypes, - ce_common, ce_mru, ce_widget, ce_synmemo, ce_interfaces, ce_observer; + ce_common, ce_mru, ce_widget, ce_synmemo, ce_interfaces, ce_observer, + ce_writableComponent; type - { TCESearchWidget } + // TCESearchWidget persistents settings + TCESearchOptions = class(TWritableLfmTextComponent) + private + fPrompt: boolean; + fFromCur: boolean; + fRegex: boolean; + fCaseSens:boolean; + fBackWard: boolean; + fWholeWord: boolean; + fMrSearches: TStringList; + fMrReplacements: TStringList; + procedure setMrSearches(aValue: TStringList); + procedure setMrReplacements(aValue: TStringList); + published + property prompt: boolean read fPrompt write fPrompt; + property fromCursor: boolean read fFromCur write fFromCur; + property regex: boolean read fRegex write fRegex; + property caseSensistive: boolean read fCaseSens write fCaseSens; + property backward: boolean read fBackWard write fBackWard; + property wholeWord: boolean read fWholeWord write fWholeWord; + property recentSearches: TStringList read fMrSearches write setMrSearches; + property recentReplacements: TStringList read fMrReplacements write setMrReplacements; + public + constructor create(aOwner: TComponent); override; + destructor destroy; override; + procedure Assign(aValue: TPersistent); override; + procedure AssignTo(aValue: TPersistent); override; + end; + { TCESearchWidget } TCESearchWidget = class(TCEWidget, ICEMultiDocObserver) btnFind: TBitBtn; btnReplace: TBitBtn; @@ -42,10 +71,6 @@ type fCancelAll: boolean; fHasSearched: boolean; fHasRestarted: boolean; - procedure optset_SearchMru(aReader: TReader); - procedure optget_SearchMru(aWriter: TWriter); - procedure optset_ReplaceMru(aReader: TReader); - procedure optget_ReplaceMru(aWriter: TWriter); function getOptions: TSynSearchOptions; procedure actReplaceAllExecute(sender: TObject); procedure replaceEvent(Sender: TObject; const ASearch, AReplace: @@ -65,8 +90,6 @@ type function contextActionCount: integer; override; function contextAction(index: integer): TAction; override; // - procedure sesoptDeclareProperties(aFiler: TFiler); override; - // procedure actFindNextExecute(sender: TObject); procedure actReplaceNextExecute(sender: TObject); end; @@ -74,8 +97,77 @@ type implementation {$R *.lfm} +const + OptsFname = 'search.txt'; + +{$REGION TCESearchOptions ------------------------------------------------------} +constructor TCESearchOptions.create(aOwner: TComponent); +begin + inherited; + fMrReplacements := TStringList.Create; + fMrSearches := TStringList.Create; +end; + +destructor TCESearchOptions.destroy; +begin + fMrSearches.Free; + fMrReplacements.Free; + inherited; +end; + +procedure TCESearchOptions.Assign(aValue: TPersistent); +var + widg: TCESearchWidget; +begin + if aValue is TCESearchWidget then + begin + widg := TCESearchWidget(aValue); + fMrSearches.Assign(widg.cbToFind.Items); + fMrReplacements.Assign(widg.cbReplaceWth.Items); + fPrompt := widg.chkPrompt.Checked; + fBackWard := widg.chkBack.Checked; + fCaseSens := widg.chkCaseSens.Checked; + fRegex := widg.chkRegex.Checked; + fFromCur := widg.chkFromCur.Checked; + fWholeWord := widg.chkWWord.Checked; + end + else inherited; +end; + +procedure TCESearchOptions.AssignTo(aValue: TPersistent); +var + widg: TCESearchWidget; +begin + if aValue is TCESearchWidget then + begin + widg := TCESearchWidget(aValue); + widg.cbToFind.Items.Assign(fMrSearches); + widg.cbReplaceWth.Items.Assign(fMrReplacements); + widg.chkPrompt.Checked := fPrompt; + widg.chkBack.Checked := fBackWard; + widg.chkCaseSens.Checked:= fCaseSens; + widg.chkRegex.Checked := fRegex; + widg.chkFromCur.Checked := fFromCur; + widg.chkWWord.Checked := fWholeWord; + end + else inherited; +end; + +procedure TCESearchOptions.setMrSearches(aValue: TStringList); +begin + fMrSearches.Assign(aValue); +end; + +procedure TCESearchOptions.setMrReplacements(aValue: TStringList); +begin + fMrReplacements.Assign(aValue); +end; +{$ENDREGION} + {$REGION Standard Comp/Obj------------------------------------------------------} constructor TCESearchWidget.Create(aOwner: TComponent); +var + fname: string; begin fActFindNext := TAction.Create(self); fActFindNext.Caption := 'Find'; @@ -88,6 +180,15 @@ begin fActReplaceAll.OnExecute := @actReplaceAllExecute; inherited; // + fname := getCoeditDocPath + OptsFname; + if FileExists(fname) then with TCESearchOptions.create(nil) do + try + loadFromFile(fname); + AssignTo(self); + finally + free; + end; + // btnFind.Action := fActFindNext; btnReplace.Action := fActReplaceNext; btnReplaceAll.Action := fActReplaceAll; @@ -100,6 +201,14 @@ end; destructor TCESearchWidget.Destroy; begin + with TCESearchOptions.create(nil) do + try + Assign(self); + saveToFile(getCoeditDocPath + OptsFname); + finally + free; + end; + // EntitiesConnector.removeObserver(self); fSearchMru.Free; fReplaceMru.Free; @@ -107,36 +216,6 @@ begin end; {$ENDREGION} -{$REGION ICESessionOptionsObserver ---------------------------------------------} -procedure TCESearchWidget.sesoptDeclareProperties(aFiler: TFiler); -begin - inherited; - aFiler.DefineProperty(Name + '_FindMRU', @optset_SearchMru, @optget_SearchMru, true); - aFiler.DefineProperty(Name + '_ReplaceMRU', @optset_ReplaceMru, @optget_ReplaceMru, true); -end; - -procedure TCESearchWidget.optset_SearchMru(aReader: TReader); -begin - fSearchMru.DelimitedText := aReader.ReadString; - cbToFind.Items.DelimitedText := fSearchMru.DelimitedText; -end; - -procedure TCESearchWidget.optget_SearchMru(aWriter: TWriter); -begin - aWriter.WriteString(fSearchMru.DelimitedText); -end; - -procedure TCESearchWidget.optset_ReplaceMru(aReader: TReader); -begin - fReplaceMru.DelimitedText := aReader.ReadString; - cbReplaceWth.Items.DelimitedText := fReplaceMru.DelimitedText ; -end; -procedure TCESearchWidget.optget_ReplaceMru(aWriter: TWriter); -begin - aWriter.WriteString(fReplaceMru.DelimitedText); -end; -{$ENDREGION} - {$REGION ICEContextualActions---------------------------------------------------} function TCESearchWidget.contextName: string; begin