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
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

View File

@ -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