mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-06-01 11:12:34 +02:00

Basic graphic primitives split into GraphType package, so that we can reference it from interface (GTK, Win32) units. New Frame3d canvas method that uses native (themed) drawing (GTK only). New overloaded Canvas.TextRect method. LCLLinux and Graphics was split, so a bunch of files had to be modified. git-svn-id: trunk@653 -
430 lines
11 KiB
ObjectPascal
430 lines
11 KiB
ObjectPascal
{
|
|
Author: Mattias Gaertner
|
|
|
|
Abstract:
|
|
Find and replace dialog form.
|
|
Usage:
|
|
Add to program
|
|
"Application.CreateForm(TLazFindReplaceDialog, FindReplaceDlg);"
|
|
Set the FindReplaceDlg.Options poperty
|
|
then do MResult:=FindReplaceDlg.ShowModal
|
|
ShowModal can have three possible results:
|
|
- mrOk for Find/Replace.
|
|
- mrAll for ReplaceAll
|
|
- mrCancel for Cancel
|
|
|
|
ToDo:
|
|
|
|
}
|
|
unit FindReplaceDialog;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
{$Define DeleteMeWhenComboBoxFocusIsFixed}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, LCLType, Controls, StdCtrls, Forms, Buttons, ExtCtrls,
|
|
LResources, SynEdit, IDEProcs;
|
|
|
|
type
|
|
TLazFindReplaceDialog = class(TFORM)
|
|
private
|
|
fReplaceAllClickedLast:boolean;
|
|
procedure SetOptions(NewOptions:TSynSearchOptions);
|
|
function GetOptions:TSynSearchOptions;
|
|
function GetFindText:AnsiString;
|
|
procedure SetFindText(NewFindText:AnsiString);
|
|
function GetReplaceText:AnsiString;
|
|
procedure SetReplaceText(NewReplaceText:AnsiString);
|
|
procedure SetComboBoxText(AComboBox:TComboBox;const AText:AnsiString);
|
|
published
|
|
TextToFindLabel:TLabel;
|
|
ReplaceWithLabel:TLabel;
|
|
{$IFDEF DeleteMeWhenComboBoxFocusIsFixed}
|
|
TextToFindComboBox:TEdit;
|
|
ReplaceTextComboBox:TEdit;
|
|
{$ELSE}
|
|
TextToFindComboBox:TComboBox;
|
|
ReplaceTextComboBox:TComboBox;
|
|
{$ENDIF}
|
|
OptionsGroupBox:TGroupBox;
|
|
CaseSensitiveCheckBox:TCheckBox;
|
|
WholeWordsOnlyCheckBox:TCheckBox;
|
|
RegularExpressionsCheckBox:TCheckBox;
|
|
PromptOnReplaceCheckBox:TCheckBox;
|
|
DirectionRadioGroup:TRadioGroup;
|
|
ScopeRadioGroup:TRadioGroup;
|
|
OriginRadioGroup:TRadioGroup;
|
|
OkButton:TButton;
|
|
ReplaceAllButton:TButton;
|
|
CancelButton:TButton;
|
|
procedure TextToFindComboboxKeyDown(Sender: TObject; var Key:Word;
|
|
Shift:TShiftState);
|
|
procedure OkButtonClick(Sender:TObject);
|
|
procedure ReplaceAllButtonClick(Sender:TObject);
|
|
procedure CancelButtonClick(Sender:TObject);
|
|
property Options:TSynSearchOptions read GetOptions write SetOptions;
|
|
property FindText:AnsiString read GetFindText write SetFindText;
|
|
property ReplaceText:AnsiString read GetReplaceText write SetReplaceText;
|
|
public
|
|
constructor Create(AOwner:TComponent); override;
|
|
end;
|
|
|
|
var FindReplaceDlg:TLazFindReplaceDialog;
|
|
|
|
|
|
implementation
|
|
|
|
|
|
{ TLazFindReplaceDialog }
|
|
|
|
constructor TLazFindReplaceDialog.Create(AOwner:TComponent);
|
|
begin
|
|
inherited Create(AOwner);
|
|
if LazarusResources.Find(ClassName)=nil then begin
|
|
Caption:='';
|
|
Width:=317;
|
|
Height:=285;
|
|
|
|
{$IFDEF DeleteMeWhenComboBoxFocusIsFixed}
|
|
TextToFindComboBox:=TEdit.Create(Self);
|
|
{$ELSE}
|
|
TextToFindComboBox:=TComboBox.Create(Self);
|
|
{$ENDIF}
|
|
with TextToFindComboBox do begin
|
|
Name:='TextToFindComboBox';
|
|
Parent:=Self;
|
|
Left:=90;
|
|
Top:=4;
|
|
Width:=220;
|
|
Height:=21;
|
|
Text:='';
|
|
OnKeyDown:=@TextToFindComboBoxKeyDown;
|
|
Visible:=true;
|
|
end;
|
|
|
|
TextToFindLabel:=TLabel.Create(Self);
|
|
with TextToFindLabel do begin
|
|
Name:='TextToFindLabel';
|
|
Parent:=Self;
|
|
Left:=8;
|
|
Top:=8;
|
|
Width:=80;
|
|
Height:=15;
|
|
Caption:='Text to Find';
|
|
Visible:=true;
|
|
end;
|
|
|
|
{$IFDEF DeleteMeWhenComboBoxFocusIsFixed}
|
|
ReplaceTextComboBox:=TEdit.Create(Self);
|
|
{$ELSE}
|
|
ReplaceTextComboBox:=TComboBox.Create(Self);
|
|
{$ENDIF}
|
|
with ReplaceTextComboBox do begin
|
|
Name:='ReplaceTextComboBox';
|
|
Parent:=Self;
|
|
Left:=90;
|
|
Top:=28;
|
|
Width:=220;
|
|
Height:=21;
|
|
Text:='';
|
|
OnKeyDown:=@TextToFindComboBoxKeyDown;
|
|
Visible:=true;
|
|
end;
|
|
|
|
ReplaceWithLabel:=TLabel.Create(Self);
|
|
with ReplaceWithLabel do begin
|
|
Name:='ReplaceWithLabel';
|
|
Parent:=Self;
|
|
Left:=8;
|
|
Top:=32;
|
|
Width:=80;
|
|
Height:=15;
|
|
Caption:='Replace With';
|
|
Visible:=true;
|
|
end;
|
|
|
|
OptionsGroupBox:=TGroupBox.Create(Self);
|
|
with OptionsGroupBox do begin
|
|
Name:='OptionsGroupBox';
|
|
Parent:=Self;
|
|
Left:=4;
|
|
Top:=58;
|
|
Width:=150;
|
|
Height:=105;
|
|
Caption:='Options';
|
|
Visible:=true;
|
|
end;
|
|
|
|
CaseSensitiveCheckBox:=TCheckBox.Create(Self);
|
|
with CaseSensitiveCheckBox do begin
|
|
Name:='CaseSensitiveCheckBox';
|
|
Parent:=OptionsGroupBox;
|
|
Left:=8;
|
|
Top:=6;
|
|
Width:=135;
|
|
Height:=17;
|
|
Caption:='Case Sensitive';
|
|
Visible:=true;
|
|
end;
|
|
|
|
WholeWordsOnlyCheckBox:=TCheckBox.Create(Self);
|
|
with WholeWordsOnlyCheckBox do begin
|
|
Name:='WholeWordsOnlyCheckBox';
|
|
Parent:=OptionsGroupBox;
|
|
Left:=8;
|
|
Top:=26;
|
|
Width:=135;
|
|
Height:=17;
|
|
Caption:='Whole Words Only';
|
|
Visible:=true;
|
|
end;
|
|
|
|
RegularExpressionsCheckBox:=TCheckBox.Create(Self);
|
|
with RegularExpressionsCheckBox do begin
|
|
Name:='RegularExpressionsCheckBox';
|
|
Parent:=OptionsGroupBox;
|
|
Left:=8;
|
|
Top:=46;
|
|
Width:=135;
|
|
Height:=17;
|
|
Caption:='Regular Expressions';
|
|
Visible:=true;
|
|
end;
|
|
|
|
PromptOnReplaceCheckBox:=TCheckBox.Create(Self);
|
|
with PromptOnReplaceCheckBox do begin
|
|
Name:='PromptOnReplaceCheckBox';
|
|
Parent:=OptionsGroupBox;
|
|
Left:=8;
|
|
Top:=66;
|
|
Width:=135;
|
|
Height:=17;
|
|
Caption:='Prompt On Replace';
|
|
Checked:=true;
|
|
Visible:=true;
|
|
end;
|
|
|
|
OriginRadioGroup:=TRadioGroup.Create(Self);
|
|
with OriginRadioGroup do begin
|
|
Name:='OriginRadioGroup';
|
|
Parent:=Self;
|
|
Left:=161;
|
|
Top:=58;
|
|
Width:=150;
|
|
Height:=105;
|
|
Caption:='Origin';
|
|
with Items do begin
|
|
BeginUpdate;
|
|
Clear;
|
|
Add('From Cursor');
|
|
Add('Entire Scope');
|
|
EndUpdate;
|
|
end;
|
|
ItemIndex:=0;
|
|
Visible:=true;
|
|
end;
|
|
|
|
ScopeRadioGroup:=TRadioGroup.Create(Self);
|
|
with ScopeRadioGroup do begin
|
|
Name:='ScopeRadioGroup';
|
|
Parent:=Self;
|
|
Left:=4;
|
|
Top:=168;
|
|
Width:=150;
|
|
Height:=65;
|
|
Caption:='Scope';
|
|
with Items do begin
|
|
BeginUpdate;
|
|
Clear;
|
|
Add('Global');
|
|
Add('Selected Text');
|
|
EndUpdate;
|
|
end;
|
|
ItemIndex:=0;
|
|
Visible:=true;
|
|
end;
|
|
|
|
DirectionRadioGroup:=TRadioGroup.Create(Self);
|
|
with DirectionRadioGroup do begin
|
|
Name:='DirectionRadioGroup';
|
|
Parent:=Self;
|
|
Left:=161;
|
|
Top:=168;
|
|
Width:=150;
|
|
Height:=65;
|
|
Caption:='Direction';
|
|
with Items do begin
|
|
BeginUpdate;
|
|
Clear;
|
|
Add('Up');
|
|
Add('Down');
|
|
EndUpdate;
|
|
end;
|
|
ItemIndex:=1;
|
|
Visible:=true;
|
|
end;
|
|
|
|
OkButton:=TButton.Create(Self);
|
|
with OkButton do begin
|
|
Name:='OkButton';
|
|
Parent:=Self;
|
|
Left:=33;
|
|
Top:=245;
|
|
Width:=75;
|
|
Height:=25;
|
|
Caption:='Ok';
|
|
OnClick:=@OkButtonClick;
|
|
Visible:=true;
|
|
end;
|
|
|
|
ReplaceAllButton:=TButton.Create(Self);
|
|
with ReplaceAllButton do begin
|
|
Name:='ReplaceAllButton';
|
|
Parent:=Self;
|
|
Left:=121;
|
|
Top:=245;
|
|
Width:=75;
|
|
Height:=25;
|
|
Caption:='Replace All';
|
|
OnClick:=@ReplaceAllButtonClick;
|
|
Visible:=true;
|
|
end;
|
|
|
|
CancelButton:=TButton.Create(Self);
|
|
with CancelButton do begin
|
|
Name:='CancelButton';
|
|
Parent:=Self;
|
|
Left:=209;
|
|
Top:=245;
|
|
Width:=75;
|
|
Height:=25;
|
|
Caption:='Cancel';
|
|
OnClick:=@CancelButtonClick;
|
|
Visible:=true;
|
|
end;
|
|
end;
|
|
fReplaceAllClickedLast:=false;
|
|
TextToFindComboBox.SetFocus;
|
|
end;
|
|
|
|
procedure TLazFindReplaceDialog.TextToFindComboBoxKeyDown(
|
|
Sender: TObject; var Key:Word; Shift:TShiftState);
|
|
begin
|
|
if (Key=VK_RETURN) then OkButtonClick(Sender);
|
|
if (Key=VK_ESCAPE) then CancelButtonClick(Sender);
|
|
if Key=VK_TAB then begin
|
|
if (Sender=TextToFindComboBox) and (ReplaceTextComboBox.Enabled) then
|
|
ReplaceTextComboBox.SetFocus;
|
|
if Sender=ReplaceTextComboBox then
|
|
TextToFindComboBox.SetFocus;
|
|
end;
|
|
end;
|
|
|
|
procedure TLazFindReplaceDialog.OkButtonClick(Sender:TObject);
|
|
begin
|
|
fReplaceAllClickedLast:=false;
|
|
TextToFindComboBox.SetFocus;
|
|
ModalResult:=mrOk;
|
|
end;
|
|
|
|
procedure TLazFindReplaceDialog.ReplaceAllButtonClick(Sender:TObject);
|
|
begin
|
|
fReplaceAllClickedLast:=true;
|
|
TextToFindComboBox.SetFocus;
|
|
ModalResult:=mrAll;
|
|
end;
|
|
|
|
procedure TLazFindReplaceDialog.CancelButtonClick(Sender:TObject);
|
|
begin
|
|
TextToFindComboBox.SetFocus;
|
|
ModalResult:=mrCancel;
|
|
end;
|
|
|
|
procedure TLazFindReplaceDialog.SetOptions(NewOptions:TSynSearchOptions);
|
|
begin
|
|
CaseSensitiveCheckBox.Checked:=ssoMatchCase in NewOptions;
|
|
WholeWordsOnlyCheckBox.Checked:=ssoWholeWord in NewOptions;
|
|
RegularExpressionsCheckBox.Checked:=ssoRegExpr in NewOptions;
|
|
PromptOnReplaceCheckBox.Checked:=ssoPrompt in NewOptions;
|
|
if ssoEntireScope in NewOptions
|
|
then OriginRadioGroup.ItemIndex:=1
|
|
else OriginRadioGroup.ItemIndex:=0;
|
|
if ssoSelectedOnly in NewOptions
|
|
then ScopeRadioGroup.ItemIndex:=1
|
|
else ScopeRadioGroup.ItemIndex:=0;
|
|
if ssoBackwards in NewOptions
|
|
then DirectionRadioGroup.ItemIndex:=0
|
|
else DirectionRadioGroup.ItemIndex:=1;
|
|
ReplaceAllButton.Enabled:=ssoReplace in NewOptions;
|
|
ReplaceTextComboBox.Enabled:=ReplaceAllButton.Enabled;
|
|
ReplaceWithLabel.Enabled:=ReplaceAllButton.Enabled;
|
|
PromptOnReplaceCheckBox.Enabled:=ReplaceAllButton.Enabled;
|
|
if ssoReplace in NewOptions then begin
|
|
Caption:='Replace';
|
|
OkButton.Caption:='Replace';
|
|
end else begin
|
|
Caption:='Find';
|
|
OkButton.Caption:='Find';
|
|
end;
|
|
end;
|
|
|
|
function TLazFindReplaceDialog.GetOptions:TSynSearchOptions;
|
|
begin
|
|
Result:=[];
|
|
if CaseSensitiveCheckBox.Checked then Include(Result,ssoMatchCase);
|
|
if WholeWordsOnlyCheckBox.Checked then Include(Result,ssoWholeWord);
|
|
if RegularExpressionsCheckBox.Checked then Include(Result,ssoRegExpr);
|
|
if PromptOnReplaceCheckBox.Checked then Include(Result,ssoPrompt);
|
|
if OriginRadioGroup.ItemIndex=1 then Include(Result,ssoEntireScope);
|
|
if ScopeRadioGroup.ItemIndex=1 then include(Result,ssoSelectedOnly);
|
|
if DirectionRadioGroup.ItemIndex=0 then include(Result,ssoBackwards);
|
|
if ReplaceAllButton.Enabled then include(Result,ssoReplace);
|
|
if fReplaceAllClickedLast then include(Result,ssoReplaceAll);
|
|
end;
|
|
|
|
function TLazFindReplaceDialog.GetFindText:AnsiString;
|
|
begin
|
|
Result:=TextToFindComboBox.Text;
|
|
end;
|
|
|
|
procedure TLazFindReplaceDialog.SetFindText(NewFindText:AnsiString);
|
|
begin
|
|
{$IFDEF DeleteMeWhenComboBoxFocusIsFixed}
|
|
TextToFindComboBox.Text:=NewFindText;
|
|
{$ELSE}
|
|
SetComboBoxText(TextToFindComboBox,NewFindText);
|
|
{$ENDIF}
|
|
end;
|
|
|
|
function TLazFindReplaceDialog.GetReplaceText:AnsiString;
|
|
begin
|
|
Result:=ReplaceTextComboBox.Text;
|
|
end;
|
|
|
|
procedure TLazFindReplaceDialog.SetReplaceText(NewReplaceText:AnsiString);
|
|
begin
|
|
{$IFDEF DeleteMeWhenComboBoxFocusIsFixed}
|
|
ReplaceTextComboBox.Text:=NewReplaceText;
|
|
{$ELSE}
|
|
SetComboBoxText(ReplaceTextComboBox,NewReplaceText);
|
|
{$ENDIF}
|
|
end;
|
|
|
|
procedure TLazFindReplaceDialog.SetComboBoxText(AComboBox:TComboBox;
|
|
const AText:AnsiString);
|
|
var a:integer;
|
|
begin
|
|
a:=AComboBox.Items.IndexOf(AText);
|
|
if a>=0 then
|
|
AComboBox.ItemIndex:=a
|
|
else begin
|
|
AComboBox.Items.Add(AText);
|
|
AComboBox.ItemIndex:=AComboBox.Items.IndexOf(AText);
|
|
end;
|
|
end;
|
|
|
|
end.
|