search widget, get rid of the centralized option system

+ checkbox state saved in addition to MRUs
This commit is contained in:
Basile Burg 2015-05-11 03:23:08 +02:00
parent 35c7d0a2ed
commit f475ef18b8
2 changed files with 132 additions and 53 deletions

View File

@ -133,9 +133,9 @@ inherited CESearchWidget: TCESearchWidget
TabOrder = 3 TabOrder = 3
object chkWWord: TCheckBox object chkWWord: TCheckBox
Left = 8 Left = 8
Height = 21 Height = 23
Top = 0 Top = 0
Width = 84 Width = 86
Caption = 'whole word' Caption = 'whole word'
Checked = True Checked = True
State = cbChecked State = cbChecked
@ -143,17 +143,17 @@ inherited CESearchWidget: TCESearchWidget
end end
object chkBack: TCheckBox object chkBack: TCheckBox
Left = 8 Left = 8
Height = 21 Height = 23
Top = 24 Top = 24
Width = 73 Width = 75
Caption = 'backward' Caption = 'backward'
TabOrder = 2 TabOrder = 2
end end
object chkFromCur: TCheckBox object chkFromCur: TCheckBox
Left = 8 Left = 8
Height = 21 Height = 23
Top = 48 Top = 48
Width = 84 Width = 86
Caption = 'from cursor' Caption = 'from cursor'
Checked = True Checked = True
State = cbChecked State = cbChecked
@ -161,25 +161,25 @@ inherited CESearchWidget: TCESearchWidget
end end
object chkCaseSens: TCheckBox object chkCaseSens: TCheckBox
Left = 128 Left = 128
Height = 21 Height = 23
Top = 0 Top = 0
Width = 93 Width = 95
Caption = 'case sensitive' Caption = 'case sensitive'
TabOrder = 4 TabOrder = 4
end end
object chkPrompt: TCheckBox object chkPrompt: TCheckBox
Left = 128 Left = 128
Height = 21 Height = 23
Top = 24 Top = 24
Width = 62 Width = 64
Caption = 'prompt' Caption = 'prompt'
TabOrder = 1 TabOrder = 1
end end
object chkRegex: TCheckBox object chkRegex: TCheckBox
Left = 128 Left = 128
Height = 21 Height = 23
Top = 48 Top = 48
Width = 117 Width = 119
Caption = 'regular expression' Caption = 'regular expression'
Checked = True Checked = True
State = cbChecked State = cbChecked
@ -244,10 +244,10 @@ inherited CESearchWidget: TCESearchWidget
ClientWidth = 386 ClientWidth = 386
TabOrder = 5 TabOrder = 5
object cbReplaceWth: TComboBox object cbReplaceWth: TComboBox
Left = 92 Left = 94
Height = 23 Height = 23
Top = 0 Top = 0
Width = 294 Width = 292
Align = alClient Align = alClient
Anchors = [akTop, akLeft, akBottom] Anchors = [akTop, akLeft, akBottom]
ItemHeight = 15 ItemHeight = 15
@ -258,7 +258,7 @@ inherited CESearchWidget: TCESearchWidget
Left = 0 Left = 0
Height = 23 Height = 23
Top = 0 Top = 0
Width = 92 Width = 94
Align = alLeft Align = alLeft
Caption = 'Replace with ' Caption = 'Replace with '
OnChange = chkEnableRepChange OnChange = chkEnableRepChange

View File

@ -7,12 +7,41 @@ interface
uses uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
Menus, StdCtrls, actnList, Buttons, SynEdit, SynEditSearch, SynEditTypes, 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 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) TCESearchWidget = class(TCEWidget, ICEMultiDocObserver)
btnFind: TBitBtn; btnFind: TBitBtn;
btnReplace: TBitBtn; btnReplace: TBitBtn;
@ -42,10 +71,6 @@ type
fCancelAll: boolean; fCancelAll: boolean;
fHasSearched: boolean; fHasSearched: boolean;
fHasRestarted: 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; function getOptions: TSynSearchOptions;
procedure actReplaceAllExecute(sender: TObject); procedure actReplaceAllExecute(sender: TObject);
procedure replaceEvent(Sender: TObject; const ASearch, AReplace: procedure replaceEvent(Sender: TObject; const ASearch, AReplace:
@ -65,8 +90,6 @@ type
function contextActionCount: integer; override; function contextActionCount: integer; override;
function contextAction(index: integer): TAction; override; function contextAction(index: integer): TAction; override;
// //
procedure sesoptDeclareProperties(aFiler: TFiler); override;
//
procedure actFindNextExecute(sender: TObject); procedure actFindNextExecute(sender: TObject);
procedure actReplaceNextExecute(sender: TObject); procedure actReplaceNextExecute(sender: TObject);
end; end;
@ -74,8 +97,77 @@ type
implementation implementation
{$R *.lfm} {$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------------------------------------------------------} {$REGION Standard Comp/Obj------------------------------------------------------}
constructor TCESearchWidget.Create(aOwner: TComponent); constructor TCESearchWidget.Create(aOwner: TComponent);
var
fname: string;
begin begin
fActFindNext := TAction.Create(self); fActFindNext := TAction.Create(self);
fActFindNext.Caption := 'Find'; fActFindNext.Caption := 'Find';
@ -88,6 +180,15 @@ begin
fActReplaceAll.OnExecute := @actReplaceAllExecute; fActReplaceAll.OnExecute := @actReplaceAllExecute;
inherited; inherited;
// //
fname := getCoeditDocPath + OptsFname;
if FileExists(fname) then with TCESearchOptions.create(nil) do
try
loadFromFile(fname);
AssignTo(self);
finally
free;
end;
//
btnFind.Action := fActFindNext; btnFind.Action := fActFindNext;
btnReplace.Action := fActReplaceNext; btnReplace.Action := fActReplaceNext;
btnReplaceAll.Action := fActReplaceAll; btnReplaceAll.Action := fActReplaceAll;
@ -100,6 +201,14 @@ end;
destructor TCESearchWidget.Destroy; destructor TCESearchWidget.Destroy;
begin begin
with TCESearchOptions.create(nil) do
try
Assign(self);
saveToFile(getCoeditDocPath + OptsFname);
finally
free;
end;
//
EntitiesConnector.removeObserver(self); EntitiesConnector.removeObserver(self);
fSearchMru.Free; fSearchMru.Free;
fReplaceMru.Free; fReplaceMru.Free;
@ -107,36 +216,6 @@ begin
end; end;
{$ENDREGION} {$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---------------------------------------------------} {$REGION ICEContextualActions---------------------------------------------------}
function TCESearchWidget.contextName: string; function TCESearchWidget.contextName: string;
begin begin