mirror of
https://github.com/doublecmd/doublecmd.git
synced 2026-06-21 09:58:13 +00:00
388 lines
14 KiB
ObjectPascal
388 lines
14 KiB
ObjectPascal
{
|
|
Search & Replace dialog
|
|
for lazarus converted from SynEdit by
|
|
Radek Cervinka, radek.cervinka@centrum.cz
|
|
|
|
This program is free software; you can redistribute it and/or modify it
|
|
under the terms of the GNU General Public License as published by the Free
|
|
Software Foundation; either version 2 of the License, or (at your option)
|
|
any later version.
|
|
|
|
This program is distributed in the hope that it will be useful, but WITHOUT
|
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
|
|
for more details.
|
|
|
|
You should have received a copy of the GNU General Public License along with
|
|
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
|
Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
|
|
|
|
based on SynEdit demo, original license:
|
|
|
|
-------------------------------------------------------------------------------
|
|
|
|
Software distributed under the License is distributed on an "AS IS" basis,
|
|
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
|
|
the specific language governing rights and limitations under the License.
|
|
|
|
The Original Code is: dlgSearchText.pas, released 2000-06-23.
|
|
|
|
The Original Code is part of the SearchReplaceDemo project, written by
|
|
Michael Hieke for the SynEdit component suite.
|
|
All Rights Reserved.
|
|
|
|
Contributors to the SynEdit project are listed in the Contributors.txt file.
|
|
|
|
Alternatively, the contents of this file may be used under the terms of the
|
|
GNU General Public License Version 2 or later (the "GPL"), in which case
|
|
the provisions of the GPL are applicable instead of those above.
|
|
If you wish to allow use of your version of this file only under the terms
|
|
of the GPL and not to allow others to use your version of this file
|
|
under the MPL, indicate your decision by deleting the provisions above and
|
|
replace them with the notice and other provisions required by the GPL.
|
|
If you do not delete the provisions above, a recipient may use your version
|
|
of this file under either the MPL or the GPL.
|
|
|
|
$Id: dlgSearchText.pas,v 1.3 2002/08/01 05:44:05 etrusco Exp $
|
|
|
|
You may retrieve the latest version of this file at the SynEdit home page,
|
|
located at http://SynEdit.SourceForge.net
|
|
|
|
Known Issues:
|
|
-------------------------------------------------------------------------------}
|
|
|
|
unit fEditSearch;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, Forms, Controls, StdCtrls, ExtCtrls, Buttons, ButtonPanel,
|
|
uOSForms, DCClassesUtf8;
|
|
|
|
type
|
|
{ TEditSearchDialogOption }
|
|
//Not only it helps to show what we want to offer to user, it will help to determine the default
|
|
//When used as parameters of function, place on required.
|
|
//When used as a returned value, we'll include the status of all.
|
|
TEditSearchDialogOption = set of (eswoCaseSensitiveChecked, eswoCaseSensitiveUnchecked,
|
|
eswoWholeWordChecked, eswoWholeWordUnchecked,
|
|
eswoSelectedTextChecked, eswoSelectedTextUnchecked,
|
|
eswoSearchFromCursorChecked, eswoSearchFromCursorUnchecked,
|
|
eswoRegularExpressChecked, eswoRegularExpressUnchecked,
|
|
eswoDirectionDisabled, eswoDirectionEnabledForward, eswoDirectionEnabledBackward);
|
|
|
|
{ TfrmEditSearchReplace }
|
|
TfrmEditSearchReplace = class(TModalForm)
|
|
ButtonPanel: TButtonPanel;
|
|
cbSearchText: TComboBox;
|
|
cbSearchCaseSensitive: TCheckBox;
|
|
cbSearchWholeWords: TCheckBox;
|
|
cbSearchSelectedOnly: TCheckBox;
|
|
cbSearchFromCursor: TCheckBox;
|
|
cbSearchRegExp: TCheckBox;
|
|
cbReplaceText: TComboBox;
|
|
gbSearchOptions: TGroupBox;
|
|
lblReplaceWith: TLabel;
|
|
lblSearchFor: TLabel;
|
|
rgSearchDirection: TRadioGroup;
|
|
procedure btnOKClick(Sender: TObject);
|
|
procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
|
|
procedure FormCreate(Sender: TObject);
|
|
procedure FormShow(Sender: TObject);
|
|
procedure RequestAlign(Data: PtrInt);
|
|
private
|
|
function GetSearchBackwards: boolean;
|
|
function GetSearchCaseSensitive: boolean;
|
|
function GetSearchFromCursor: boolean;
|
|
function GetSearchInSelection: boolean;
|
|
function GetSearchText: string;
|
|
function GetSearchTextHistory: string;
|
|
function GetSearchWholeWords: boolean;
|
|
function GetSearchRegExp: boolean;
|
|
function GetReplaceText: string;
|
|
function GetReplaceTextHistory: string;
|
|
procedure SetSearchBackwards(Value: boolean);
|
|
procedure SetSearchCaseSensitive(Value: boolean);
|
|
procedure SetSearchFromCursor(Value: boolean);
|
|
procedure SetSearchInSelection(Value: boolean);
|
|
procedure SetSearchText(Value: string);
|
|
procedure SetSearchTextHistory(Value: string);
|
|
procedure SetSearchWholeWords(Value: boolean);
|
|
procedure SetSearchRegExp(Value: boolean);
|
|
procedure SetReplaceText(Value: string);
|
|
procedure SetReplaceTextHistory(Value: string);
|
|
public
|
|
constructor Create(AOwner: TComponent; AReplace: Boolean); reintroduce;
|
|
property SearchBackwards: boolean read GetSearchBackwards
|
|
write SetSearchBackwards;
|
|
property SearchCaseSensitive: boolean read GetSearchCaseSensitive
|
|
write SetSearchCaseSensitive;
|
|
property SearchFromCursor: boolean read GetSearchFromCursor
|
|
write SetSearchFromCursor;
|
|
property SearchInSelectionOnly: boolean read GetSearchInSelection
|
|
write SetSearchInSelection;
|
|
property SearchText: string read GetSearchText write SetSearchText;
|
|
property SearchTextHistory: string read GetSearchTextHistory
|
|
write SetSearchTextHistory;
|
|
property SearchWholeWords: boolean read GetSearchWholeWords
|
|
write SetSearchWholeWords;
|
|
property SearchRegExp: boolean read GetSearchRegExp
|
|
write SetSearchRegExp;
|
|
property ReplaceText: string read GetReplaceText write SetReplaceText;
|
|
property ReplaceTextHistory: string read GetReplaceTextHistory
|
|
write SetReplaceTextHistory;
|
|
end;
|
|
|
|
function GetSimpleSearchAndReplaceString(AOwner:TComponent; OptionAllowed:TEditSearchDialogOption; var sSearchText:string; var sReplaceText:string; var OptionsToReturn:TEditSearchDialogOption; PastSearchList:TStringListEx; PastReplaceList:TStringListEx):boolean;
|
|
|
|
implementation
|
|
|
|
{$R *.lfm}
|
|
|
|
uses
|
|
Math, Graphics, uGlobs, uLng, uDCUtils;
|
|
|
|
function GetSimpleSearchAndReplaceString(AOwner:TComponent; OptionAllowed:TEditSearchDialogOption; var sSearchText:string; var sReplaceText:string; var OptionsToReturn:TEditSearchDialogOption; PastSearchList:TStringListEx; PastReplaceList:TStringListEx):boolean;
|
|
var
|
|
dlg: TfrmEditSearchReplace;
|
|
begin
|
|
result:=FALSE;
|
|
OptionsToReturn:=[];
|
|
|
|
dlg := TfrmEditSearchReplace.Create(AOwner, TRUE);
|
|
try
|
|
with dlg do
|
|
begin
|
|
//1. Let's enable to options host wanted to offer to user
|
|
cbSearchCaseSensitive.Enabled := ((eswoCaseSensitiveChecked in OptionAllowed) OR (eswoCaseSensitiveUnchecked in OptionAllowed));
|
|
cbSearchWholeWords.Enabled := ((eswoWholeWordChecked in OptionAllowed) OR (eswoWholeWordUnchecked in OptionAllowed));
|
|
cbSearchSelectedOnly.Enabled := ((eswoSelectedTextChecked in OptionAllowed) OR (eswoSelectedTextUnchecked in OptionAllowed));
|
|
cbSearchFromCursor.Enabled := ((eswoSearchFromCursorChecked in OptionAllowed) OR (eswoSearchFromCursorUnchecked in OptionAllowed));
|
|
cbSearchRegExp.Enabled := ((eswoRegularExpressChecked in OptionAllowed) OR (eswoRegularExpressUnchecked in OptionAllowed));
|
|
rgSearchDirection.Enabled := ((eswoDirectionEnabledForward in OptionAllowed) OR (eswoDirectionEnabledBackward in OptionAllowed));
|
|
|
|
//2. Let's set the option to their default according to what host wants to offer
|
|
cbSearchCaseSensitive.Checked := (eswoCaseSensitiveChecked in OptionAllowed);
|
|
cbSearchWholeWords.Checked := (eswoWholeWordChecked in OptionAllowed);
|
|
cbSearchSelectedOnly.Checked := (eswoSelectedTextChecked in OptionAllowed);
|
|
cbSearchFromCursor.Checked := (eswoSearchFromCursorChecked in OptionAllowed);
|
|
cbSearchRegExp.Checked := (eswoRegularExpressChecked in OptionAllowed);
|
|
rgSearchDirection.ItemIndex:=ifthen((eswoDirectionEnabledBackward in OptionAllowed),1,0);
|
|
|
|
//3. Setup the SEARCH info
|
|
if sSearchText='' then sSearchText:=rsEditSearchCaption;
|
|
SearchTextHistory:=PastSearchList.Text;
|
|
cbSearchText.Text:=sSearchText;
|
|
|
|
//4. Setup the REPLACE info
|
|
if sReplaceText='' then sReplaceText:=rsEditSearchReplace;
|
|
ReplaceTextHistory:=PastReplaceList.Text;
|
|
cbReplaceText.Text:=sReplaceText;
|
|
|
|
//5. Get feedback from user
|
|
if ShowModal=mrOk then
|
|
begin
|
|
//6. Let's set the options wanted by the user
|
|
if cbSearchCaseSensitive.Enabled then
|
|
if cbSearchCaseSensitive.Checked then OptionsToReturn:=OptionsToReturn+[eswoCaseSensitiveChecked] else OptionsToReturn:=OptionsToReturn+[eswoCaseSensitiveUnchecked];
|
|
if cbSearchWholeWords.Enabled then
|
|
if cbSearchWholeWords.Checked then OptionsToReturn:=OptionsToReturn+[eswoWholeWordChecked] else OptionsToReturn:=OptionsToReturn+[eswoWholeWordUnchecked];
|
|
if cbSearchSelectedOnly.Enabled then
|
|
if cbSearchSelectedOnly.Checked then OptionsToReturn:=OptionsToReturn+[eswoSelectedTextChecked] else OptionsToReturn:=OptionsToReturn+[eswoSelectedTextUnchecked];
|
|
if cbSearchFromCursor.Enabled then
|
|
if cbSearchFromCursor.Checked then OptionsToReturn:=OptionsToReturn+[eswoSearchFromCursorChecked] else OptionsToReturn:=OptionsToReturn+[eswoSearchFromCursorUnchecked];
|
|
if cbSearchRegExp.Enabled then
|
|
if cbSearchRegExp.Checked then OptionsToReturn:=OptionsToReturn+[eswoRegularExpressChecked] else OptionsToReturn:=OptionsToReturn+[eswoRegularExpressUnchecked];
|
|
if rgSearchDirection.Enabled then
|
|
if rgSearchDirection.ItemIndex=1 then OptionsToReturn:=OptionsToReturn+[eswoDirectionEnabledBackward] else OptionsToReturn:=OptionsToReturn+[eswoDirectionEnabledForward];
|
|
|
|
//7. Let's set our history
|
|
PastSearchList.Text:=SearchTextHistory;
|
|
PastReplaceList.Text:=ReplaceTextHistory;
|
|
|
|
//8. And FINALLY, our valuable text to search we wanted to replace!
|
|
sSearchText:=cbSearchText.Text;
|
|
sReplaceText:=cbReplaceText.Text;
|
|
result:=((sSearchText<>sReplaceText) AND (sSearchText<>''));
|
|
end;
|
|
end;
|
|
|
|
finally
|
|
FreeAndNil(Dlg);
|
|
end;
|
|
end;
|
|
|
|
{ TfrmEditSearchReplace }
|
|
|
|
procedure TfrmEditSearchReplace.btnOKClick(Sender: TObject);
|
|
begin
|
|
InsertFirstItem(cbSearchText.Text, cbSearchText);
|
|
ModalResult := mrOK
|
|
end;
|
|
|
|
procedure TfrmEditSearchReplace.FormCloseQuery(Sender: TObject;
|
|
var CanClose: boolean);
|
|
begin
|
|
if ModalResult = mrOK then
|
|
InsertFirstItem(cbReplaceText.Text, cbReplaceText);
|
|
end;
|
|
|
|
procedure TfrmEditSearchReplace.FormCreate(Sender: TObject);
|
|
begin
|
|
InitPropStorage(Self);
|
|
end;
|
|
|
|
procedure TfrmEditSearchReplace.FormShow(Sender: TObject);
|
|
begin
|
|
if cbSearchText.Text = EmptyStr then
|
|
begin
|
|
if cbSearchText.Items.Count > 0 then
|
|
cbSearchText.Text:= cbSearchText.Items[0];
|
|
end;
|
|
cbSearchText.SelectAll;
|
|
|
|
// Fixes AutoSize under Qt
|
|
Application.QueueAsyncCall(@RequestAlign, 0);
|
|
end;
|
|
|
|
procedure TfrmEditSearchReplace.RequestAlign(Data: PtrInt);
|
|
begin
|
|
Width := Width + 1;
|
|
Width := Width - 1;
|
|
end;
|
|
|
|
function TfrmEditSearchReplace.GetSearchBackwards: boolean;
|
|
begin
|
|
Result := rgSearchDirection.ItemIndex = 1;
|
|
end;
|
|
|
|
function TfrmEditSearchReplace.GetSearchCaseSensitive: boolean;
|
|
begin
|
|
Result := cbSearchCaseSensitive.Checked;
|
|
end;
|
|
|
|
function TfrmEditSearchReplace.GetSearchFromCursor: boolean;
|
|
begin
|
|
Result := cbSearchFromCursor.Checked;
|
|
end;
|
|
|
|
function TfrmEditSearchReplace.GetSearchInSelection: boolean;
|
|
begin
|
|
Result := cbSearchSelectedOnly.Checked;
|
|
end;
|
|
|
|
function TfrmEditSearchReplace.GetSearchText: string;
|
|
begin
|
|
Result := cbSearchText.Text;
|
|
end;
|
|
|
|
function TfrmEditSearchReplace.GetSearchTextHistory: string;
|
|
var
|
|
i: integer;
|
|
begin
|
|
for i:= cbSearchText.Items.Count - 1 downto 25 do
|
|
cbSearchText.Items.Delete(i);
|
|
Result:=cbSearchText.Items.Text;
|
|
end;
|
|
|
|
function TfrmEditSearchReplace.GetSearchWholeWords: boolean;
|
|
begin
|
|
Result := cbSearchWholeWords.Checked;
|
|
end;
|
|
|
|
function TfrmEditSearchReplace.GetSearchRegExp: boolean;
|
|
begin
|
|
Result:= cbSearchRegExp.Checked;
|
|
end;
|
|
|
|
function TfrmEditSearchReplace.GetReplaceText: string;
|
|
begin
|
|
Result := cbReplaceText.Text;
|
|
end;
|
|
|
|
function TfrmEditSearchReplace.GetReplaceTextHistory: string;
|
|
var
|
|
i: integer;
|
|
begin
|
|
for i:= cbSearchText.Items.Count - 1 downto 25 do
|
|
cbReplaceText.Items.Delete(i);
|
|
Result:=cbReplaceText.Items.Text;
|
|
end;
|
|
|
|
procedure TfrmEditSearchReplace.SetSearchBackwards(Value: boolean);
|
|
begin
|
|
rgSearchDirection.ItemIndex := Ord(Value);
|
|
end;
|
|
|
|
procedure TfrmEditSearchReplace.SetSearchCaseSensitive(Value: boolean);
|
|
begin
|
|
cbSearchCaseSensitive.Checked := Value;
|
|
end;
|
|
|
|
procedure TfrmEditSearchReplace.SetSearchFromCursor(Value: boolean);
|
|
begin
|
|
cbSearchFromCursor.Checked := Value;
|
|
end;
|
|
|
|
procedure TfrmEditSearchReplace.SetSearchInSelection(Value: boolean);
|
|
begin
|
|
cbSearchSelectedOnly.Checked := Value;
|
|
end;
|
|
|
|
procedure TfrmEditSearchReplace.SetSearchText(Value: string);
|
|
begin
|
|
cbSearchText.Text := Value;
|
|
end;
|
|
|
|
procedure TfrmEditSearchReplace.SetSearchTextHistory(Value: string);
|
|
begin
|
|
cbSearchText.Items.Text := Value;
|
|
end;
|
|
|
|
procedure TfrmEditSearchReplace.SetSearchWholeWords(Value: boolean);
|
|
begin
|
|
cbSearchWholeWords.Checked := Value;
|
|
end;
|
|
|
|
procedure TfrmEditSearchReplace.SetSearchRegExp(Value: boolean);
|
|
begin
|
|
cbSearchRegExp.Checked:= Value;
|
|
end;
|
|
|
|
procedure TfrmEditSearchReplace.SetReplaceText(Value: string);
|
|
begin
|
|
cbReplaceText.Items.Text := Value;
|
|
end;
|
|
|
|
procedure TfrmEditSearchReplace.SetReplaceTextHistory(Value: string);
|
|
begin
|
|
cbReplaceText.Items.Text := Value;
|
|
end;
|
|
|
|
constructor TfrmEditSearchReplace.Create(AOwner: TComponent; AReplace: Boolean);
|
|
begin
|
|
inherited Create(AOwner);
|
|
Color:= clForm;
|
|
if AReplace then
|
|
begin
|
|
Caption:= rsEditSearchReplace;
|
|
lblReplaceWith.Visible:= True;
|
|
cbReplaceText.Visible:= True;
|
|
end
|
|
else
|
|
begin
|
|
Caption:= rsEditSearchCaption;
|
|
lblReplaceWith.Visible:= False;
|
|
cbReplaceText.Visible:= False;
|
|
Height:= Height - cbReplaceText.Height;
|
|
end;
|
|
rgSearchDirection.Items.Strings[0]:= rsEditSearchFrw;
|
|
rgSearchDirection.Items.Strings[1]:= rsEditSearchBack;
|
|
end;
|
|
|
|
end.
|
|
|