Add support for \t and \n for replacement in search+replace dialog. Accepting a multi line bug in SynEdit, which forces the user to search backwards when using \n in replacement. See http://www.heidisql.com/forum.php?t=8977

This commit is contained in:
Ansgar Becker
2011-08-18 06:41:49 +00:00
parent d19fc1cf0e
commit fe2d5149a5
3 changed files with 29 additions and 10 deletions

View File

@ -3188,21 +3188,30 @@ procedure TMainForm.DoSearchReplace;
var var
Occurences: Integer; Occurences: Integer;
OldCaretXY: TBufferCoord; OldCaretXY: TBufferCoord;
Replacement: String;
begin begin
if FSearchReplaceDialog.chkRegularExpression.Checked then if FSearchReplaceDialog.chkRegularExpression.Checked then
FSearchReplaceDialog.Editor.SearchEngine := SynEditRegexSearch1 FSearchReplaceDialog.Editor.SearchEngine := SynEditRegexSearch1
else else
FSearchReplaceDialog.Editor.SearchEngine := SynEditSearch1; FSearchReplaceDialog.Editor.SearchEngine := SynEditSearch1;
OldCaretXY := FSearchReplaceDialog.Editor.CaretXY; OldCaretXY := FSearchReplaceDialog.Editor.CaretXY;
Replacement := FSearchReplaceDialog.comboReplace.Text;
Replacement := StringReplace(Replacement, '\n', CRLF, [rfReplaceAll]);
Replacement := StringReplace(Replacement, '\t', #9, [rfReplaceAll]);
FSearchReplaceDialog.Editor.BeginUpdate; FSearchReplaceDialog.Editor.BeginUpdate;
ShowStatusMsg('Searching ...'); ShowStatusMsg('Searching ...');
Occurences := FSearchReplaceDialog.Editor.SearchReplace( Occurences := FSearchReplaceDialog.Editor.SearchReplace(
FSearchReplaceDialog.comboSearch.Text, FSearchReplaceDialog.comboSearch.Text,
FSearchReplaceDialog.comboReplace.Text, Replacement,
FSearchReplaceDialog.Options FSearchReplaceDialog.Options
); );
FSearchReplaceDialog.Editor.EndUpdate; FSearchReplaceDialog.Editor.EndUpdate;
ShowStatusMsg; ShowStatusMsg;
if ssoReplaceAll in FSearchReplaceDialog.Options then if ssoReplaceAll in FSearchReplaceDialog.Options then
ShowStatusMsg('Text "'+FSearchReplaceDialog.comboSearch.Text+'" '+FormatNumber(Occurences)+' times replaced.', 0) ShowStatusMsg('Text "'+FSearchReplaceDialog.comboSearch.Text+'" '+FormatNumber(Occurences)+' times replaced.', 0)
else begin else begin

View File

@ -3,7 +3,7 @@ object frmSearchReplace: TfrmSearchReplace
Top = 0 Top = 0
BorderStyle = bsDialog BorderStyle = bsDialog
Caption = 'Search and replace text' Caption = 'Search and replace text'
ClientHeight = 236 ClientHeight = 256
ClientWidth = 388 ClientWidth = 388
Color = clBtnFace Color = clBtnFace
Font.Charset = DEFAULT_CHARSET Font.Charset = DEFAULT_CHARSET
@ -19,7 +19,7 @@ object frmSearchReplace: TfrmSearchReplace
OnShow = FormShow OnShow = FormShow
DesignSize = ( DesignSize = (
388 388
236) 256)
PixelsPerInch = 96 PixelsPerInch = 96
TextHeight = 13 TextHeight = 13
object lblSearch: TLabel object lblSearch: TLabel
@ -30,9 +30,17 @@ object frmSearchReplace: TfrmSearchReplace
Caption = '&Text to find:' Caption = '&Text to find:'
FocusControl = comboSearch FocusControl = comboSearch
end end
object lblReplaceHint: TLabel
Left = 90
Top = 58
Width = 259
Height = 13
Caption = 'Replacement can have \n for new lines and \t for tabs'
Enabled = False
end
object btnCancel: TButton object btnCancel: TButton
Left = 305 Left = 305
Top = 203 Top = 223
Width = 75 Width = 75
Height = 25 Height = 25
Anchors = [akRight, akBottom] Anchors = [akRight, akBottom]
@ -43,7 +51,7 @@ object frmSearchReplace: TfrmSearchReplace
end end
object btnReplaceAll: TButton object btnReplaceAll: TButton
Left = 224 Left = 224
Top = 203 Top = 223
Width = 75 Width = 75
Height = 25 Height = 25
Anchors = [akRight, akBottom] Anchors = [akRight, akBottom]
@ -85,7 +93,7 @@ object frmSearchReplace: TfrmSearchReplace
end end
object grpOptions: TGroupBox object grpOptions: TGroupBox
Left = 8 Left = 8
Top = 60 Top = 80
Width = 372 Width = 372
Height = 69 Height = 69
Anchors = [akLeft, akTop, akRight] Anchors = [akLeft, akTop, akRight]
@ -129,7 +137,7 @@ object frmSearchReplace: TfrmSearchReplace
end end
object grpDirection: TRadioGroup object grpDirection: TRadioGroup
Left = 8 Left = 8
Top = 135 Top = 155
Width = 120 Width = 120
Height = 62 Height = 62
Anchors = [akLeft, akTop, akBottom] Anchors = [akLeft, akTop, akBottom]
@ -142,7 +150,7 @@ object frmSearchReplace: TfrmSearchReplace
end end
object grpOrigin: TRadioGroup object grpOrigin: TRadioGroup
Left = 134 Left = 134
Top = 135 Top = 155
Width = 120 Width = 120
Height = 62 Height = 62
Anchors = [akLeft, akTop, akBottom] Anchors = [akLeft, akTop, akBottom]
@ -155,7 +163,7 @@ object frmSearchReplace: TfrmSearchReplace
end end
object grpScope: TRadioGroup object grpScope: TRadioGroup
Left = 260 Left = 260
Top = 135 Top = 155
Width = 120 Width = 120
Height = 62 Height = 62
Anchors = [akLeft, akTop, akRight, akBottom] Anchors = [akLeft, akTop, akRight, akBottom]
@ -168,7 +176,7 @@ object frmSearchReplace: TfrmSearchReplace
end end
object btnOK: TButton object btnOK: TButton
Left = 143 Left = 143
Top = 203 Top = 223
Width = 75 Width = 75
Height = 25 Height = 25
Anchors = [akRight, akBottom] Anchors = [akRight, akBottom]

View File

@ -23,6 +23,7 @@ type
grpOrigin: TRadioGroup; grpOrigin: TRadioGroup;
grpScope: TRadioGroup; grpScope: TRadioGroup;
btnOK: TButton; btnOK: TButton;
lblReplaceHint: TLabel;
procedure ValidateControls(Sender: TObject); procedure ValidateControls(Sender: TObject);
procedure chkReplaceClick(Sender: TObject); procedure chkReplaceClick(Sender: TObject);
procedure FormShow(Sender: TObject); procedure FormShow(Sender: TObject);
@ -122,6 +123,7 @@ begin
comboReplace.Enabled := chkReplace.Checked; comboReplace.Enabled := chkReplace.Checked;
chkPromptOnReplace.Enabled := chkReplace.Checked; chkPromptOnReplace.Enabled := chkReplace.Checked;
btnReplaceAll.Enabled := chkReplace.Checked; btnReplaceAll.Enabled := chkReplace.Checked;
lblReplaceHint.Enabled := chkReplace.Checked;
if chkReplace.Checked then if chkReplace.Checked then
btnOK.Caption := 'Replace' btnOK.Caption := 'Replace'
else else