lazarus/lcl/include/finddialog.inc
2018-09-19 15:33:54 +00:00

648 lines
17 KiB
PHP

{%MainUnit ../dialogs.pp}
{******************************************************************************
TFindDialog
******************************************************************************
*****************************************************************************
This file is part of the Lazarus Component Library (LCL)
See the file COPYING.modifiedLGPL.txt, included in this distribution,
for details about the license.
*****************************************************************************
}
type
{ TFindDialogForm }
TFindDialogForm = class(TForm)
// Same order as in TFindDialog
BtnPanel: TPanel;
CancelButton: TButton;
CaseSensitiveCheckBox: TCheckBox;
DirectionRadioGroup: TRadioGroup;
EditFind: TEdit;
EntireScopeCheckBox: TCheckBox;
FindButton: TButton;
FindLabel: TLabel;
FlagsPanel: TPanel;
HelpButton: TButton;
WholeWordsOnlyCheckBox: TCheckBox;
procedure EditFindChange(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
FButtonsBottom: Boolean;
public
constructor CreateNew(aOwner: TComponent; Options: TFindOptions); reintroduce;
procedure SetLayout (Options: TFindOptions);
end;
procedure TFindDialogForm.EditFindChange(Sender: TObject);
begin
FindButton.Enabled:=EditFind.Text<>'';
end;
procedure TFindDialogForm.FormCreate(Sender: TObject);
begin
EditFindChange(nil);
end;
constructor TFindDialogForm.CreateNew(aOwner: TComponent; Options: TFindOptions
);
var
Layout: boolean; // true = Buttons at bottom
begin
inherited CreateNew(aOwner);
Layout := frButtonsAtBottom in Options;
Left := 417;
Top := 333;
if Layout then begin
Height := 166;
Width := 415;
ClientHeight := 166;
ClientWidth := 415;
Constraints.MinHeight := 166;
Constraints.MaxHeight := 166; // fixed height
Constraints.MinWidth := 415;
end
else begin
Height := 136;
Width := 480;
ClientHeight := 140;
ClientWidth := 480;
Constraints.MinHeight := 136;
Constraints.MinWidth := 480;
end;
AutoSize := True;
BorderIcons := [biSystemMenu, biHelp];
Caption := 'Find';
//OnCreate := @FormCreate;
//Position := poMainFormCenter;
LCLVersion := '1.3';
FindLabel := TLabel.Create(Self);
with FindLabel do begin
Left := 6;
Height := 17;
Top := 15;
Width := 77;
BorderSpacing.Right := 8;
Caption := 'Text to find';
FocusControl := EditFind;
ParentColor := False;
Parent := Self;
end;
EditFind := TEdit.Create(Self);
with EditFind do begin
Left := 85;
Height := 27;
Top := 10;
BorderSpacing.Top := 8;
Width := 303;
TabOrder := 0;
Text := 'EditFind';
Parent := Self;
end;
FlagsPanel := TPanel.Create(Self);
With FlagsPanel do begin
Left := 6;
Height := 82;
Top := 43;
Width := 143;
AutoSize := True;
BorderSpacing.Around := 6;
BorderSpacing.Top := 4;
BevelOuter := bvNone;
ChildSizing.LeftRightSpacing := 8;
ChildSizing.VerticalSpacing := 6;
ChildSizing.Layout := cclLeftToRightThenTopToBottom;
ChildSizing.ControlsPerLine := 1;
ClientHeight := 82;
ClientWidth := 143;
TabOrder := 1;
Parent := Self;
end;
// Flags Panel Objects
WholeWordsOnlyCheckBox := TCheckBox.Create(Self);
with WholeWordsOnlyCheckBox do begin
Left := 0;
Height := 23;
Top := 0;
Width := 142;
Caption := 'Whole words only';
TabOrder := 0;
Parent := FlagsPanel;
end;
CaseSensitiveCheckBox := TCheckBox.Create(Self);
with CaseSensitiveCheckBox do begin
Left := 0;
Height := 23;
Top := 29;
Width := 142;
Caption := 'Case sensitive';
TabOrder := 1;
Parent := FlagsPanel;
end;
EntireScopeCheckBox := TCheckBox.Create(Self);
with EntireScopeCheckBox do begin
Left := 0;
Height := 23;
Top := 58;
Width := 142;
Caption := 'Search entire file';
TabOrder := 2;
Parent := FlagsPanel;
end;
//End of Flags Panel objects
DirectionRadioGroup := TRadioGroup.Create(Self);
with DirectionRadioGroup do begin
Left := 155;
Height := 45;
Top := 49;
Width := 227;
AutoFill := True;
AutoSize := True;
BorderSpacing.Left := 12;
//BorderSpacing.Around := 0;
Caption := 'Direction';
ChildSizing.LeftRightSpacing := 6;
ChildSizing.TopBottomSpacing := 6;
ChildSizing.EnlargeHorizontal := crsHomogenousChildResize;
ChildSizing.EnlargeVertical := crsHomogenousChildResize;
ChildSizing.ShrinkHorizontal := crsScaleChilds;
ChildSizing.ShrinkVertical := crsScaleChilds;
ChildSizing.Layout := cclLeftToRightThenTopToBottom;
ChildSizing.ControlsPerLine := 2;
ClientHeight := 48;
ClientWidth := 217;
Columns := 2;
Constraints.MaxHeight := 60;
Items.Add('Forward');
Items.Add('Backward');
TabOrder := 2;
Parent := Self;
end;
BtnPanel := TPanel.Create(Self);
with BtnPanel do begin
Left := 388;
Height := 132;
Top := 0;
Width := 92;
Align := alRight;
AutoSize := True;
BevelOuter := bvNone;
ChildSizing.LeftRightSpacing := 6;
ChildSizing.TopBottomSpacing := 6;
ChildSizing.VerticalSpacing := 6;
ClientHeight := 132;
ClientWidth := 92;
TabOrder := 3;
Parent := Self;
end;
// BtnPanel Objects
FindButton := TButton.Create(Self);
with FindButton do begin
Left := 6;
Height := 26;
Top := 6;
Width := 80;
AutoSize := True;
Caption := 'Find more';
Constraints.MinWidth := 80;
Default := True;
TabOrder := 0;
Parent := BtnPanel;
end;
CancelButton := TButton.Create(Self);
with CancelButton do begin
Left := 6;
Height := 26;
Top := 64;
Width := 80;
AutoSize := True;
BorderSpacing.Bottom := 10;
Cancel := True;
Caption := 'Cancel';
Constraints.MinWidth := 80;
ModalResult := 2;
TabOrder := 1;
Parent := BtnPanel;
end;
HelpButton := TButton.Create(Self);
with HelpButton do begin
Left := 6;
Height := 26;
Top := 100;
Width := 80;
AutoSize := True;
Caption := 'Help';
Constraints.MinWidth := 80;
TabOrder := 2;
Parent := BtnPanel;
end;
EditFind.OnChange := @EditFindChange;
SetLayout(Options);
end;
procedure TFindDialogForm.SetLayout(Options: TFindOptions);
begin
FButtonsBottom := frButtonsAtBottom in Options;
if FButtonsBottom then begin
Height := 180;
Width := 447;
ClientHeight := 180;
ClientWidth := 447;
AutoSize := False;
with BtnPanel do begin
Left := 0;
Height := 38;
Top := 131;
Width := 447;
ClientHeight := 38;
ClientWidth := 447;
Align := alBottom;
AutoSize := True;
end;
// Anchors
FindLabel.Anchors := [akTop, akLeft];
FindLabel.AnchorSideTop.Control := EditFind;
FindLabel.AnchorSideTop.Side := asrCenter;
EditFind.Width := 362;
EditFind.Anchors := [akTop, akLeft, akRight];
EditFind.AnchorSideLeft.Control := FindLabel;
EditFind.AnchorSideLeft.Side := asrBottom;
EditFind.AnchorSideRight.Control := TControl(Owner);
EditFind.AnchorSideRight.Side := asrBottom;
DirectionRadioGroup.Anchors := [akTop, akLeft];
DirectionRadioGroup.AnchorSideLeft.Control := FlagsPanel;
DirectionRadioGroup.AnchorSideLeft.Side := asrBottom;
DirectionRadioGroup.AnchorSideTop.Control := FlagsPanel;
FlagsPanel.Anchors := [akTop, akLeft];
FlagsPanel.AnchorSideLeft.Control := TControl(Owner);
FlagsPanel.AnchorSideTop.Control := EditFind;
FlagsPanel.AnchorSideTop.Side := asrBottom;
FindButton.Anchors := [akRight, akBottom];
FindButton.AnchorSideRight.Control := BtnPanel;
FindButton.AnchorSideRight.Side := asrBottom;
FindButton.AnchorSideBottom.Control := BtnPanel;
FindButton.AnchorSideBottom.Side := asrBottom;
CancelButton.Left := 265;
CancelButton.Top := 6;
CancelButton.BorderSpacing.Bottom := 0;
CancelButton.Anchors := [akRight, akBottom];
CancelButton.AnchorSideRight.Control := FindButton;
//CancelButton.AnchorSideRight.Side := asrBottom;
CancelButton.AnchorSideBottom.Control := BtnPanel;
CancelButton.AnchorSideBottom.Side := asrBottom;
CancelButton.BorderSpacing.Right := 32;
HelpButton.Anchors := [akLeft, akBottom];
HelpButton.AnchorSideLeft.Control := BtnPanel;
HelpButton.AnchorSideBottom.Control := BtnPanel;
HelpButton.AnchorSideBottom.Side := asrBottom;
end
else begin
with BtnPanel do begin
Height := 132;
Top := 0;
Width := 92;
Align := alRight;
end;
// Anchors
FindLabel.AnchorSideTop.Control := EditFind;
FindLabel.AnchorSideTop.Side := asrCenter;
EditFind.Anchors := [akTop, akLeft, akRight];
EditFind.AnchorSideLeft.Control := FindLabel;
EditFind.AnchorSideLeft.Side := asrBottom;
EditFind.AnchorSideRight.Control := BtnPanel;
DirectionRadioGroup.Anchors := [akTop, akLeft, akRight, akBottom];
DirectionRadioGroup.AnchorSideLeft.Control := FlagsPanel;
DirectionRadioGroup.AnchorSideLeft.Side := asrBottom;
DirectionRadioGroup.AnchorSideTop.Control := FlagsPanel;
DirectionRadioGroup.AnchorSideRight.Control := BtnPanel;
DirectionRadioGroup.AnchorSideBottom.Control := FlagsPanel;
DirectionRadioGroup.AnchorSideBottom.Side := asrBottom;
FlagsPanel.AnchorSideLeft.Control := TControl(Owner);
FlagsPanel.AnchorSideTop.Control := EditFind;
FlagsPanel.AnchorSideTop.Side := asrBottom;
FindButton.Anchors := [akTop, akRight];
FindButton.AnchorSideTop.Control := BtnPanel;
FindButton.AnchorSideRight.Control := BtnPanel;
FindButton.AnchorSideRight.Side := asrBottom;
FindButton.AnchorSideBottom.Control := CancelButton;
CancelButton.Anchors := [akRight, akBottom];
CancelButton.AnchorSideTop.Side := asrBottom;
CancelButton.AnchorSideRight.Control := BtnPanel;
CancelButton.AnchorSideRight.Side := asrBottom;
CancelButton.AnchorSideBottom.Control := HelpButton;
HelpButton.Anchors := [akLeft, akRight, akBottom];
HelpButton.AnchorSideLeft.Control := BtnPanel;
HelpButton.AnchorSideRight.Control := BtnPanel;
HelpButton.AnchorSideBottom.Control := BtnPanel;
HelpButton.AnchorSideBottom.Side := asrBottom;
end;
end;
{ TFindDialog }
function TFindDialog.GetReplaceText: string;
begin
Result:=FReplaceText;
end;
procedure TFindDialog.SetReplaceText(const AValue: string);
begin
if FReplaceText = AValue then exit;
FReplaceText:=AValue;
end;
procedure TFindDialog.FindClick(Sender: TObject);
begin
GetFormValues;
FOptions := FOptions - [frReplace, frReplaceAll] + [frFindNext];
Find;
end;
procedure TFindDialog.HelpClick(Sender: TObject);
begin
Help;
end;
procedure TFindDialog.CancelClick(Sender: TObject);
begin
CloseDialog;
end;
function TFindDialog.GetHeight: Integer;
begin
if Assigned(FFindForm) then
Result := FFindForm.Height
else
Result := inherited GetHeight;
end;
function TFindDialog.GetWidth: Integer;
begin
if Assigned(FFindForm) then
Result := FFindForm.Width
else
Result := inherited GetWidth;
end;
procedure TFindDialog.DoCloseForm(Sender: TObject; var CloseAction: TCloseAction);
begin
if csDesigning in ComponentState then exit;
FFormTop := FFindForm.Top;
FFormLeft := FFindForm.Left;
if Assigned(OnClose) then OnClose(Self);
end;
procedure TFindDialog.DoShowForm(Sender: TObject);
begin
if csDesigning in ComponentState then exit;
if Assigned(OnShow) then OnShow(Self);
end;
function TFindDialog.GetFindText: string;
begin
Result:=FFindText;
end;
function TFindDialog.GetLeft: Integer;
begin
if Assigned(FFindForm) then
FFormLeft := FFindForm.Left;
Result:=FFormLeft;
end;
function TFindDialog.GetPosition: TPoint;
begin
Result:=Point(GetLeft, GetTop);
end;
function TFindDialog.GetTop: Integer;
begin
if Assigned(FFindForm) then
FFormTop := FFindForm.Top;
Result:=FFormTop;
end;
procedure TFindDialog.SetFindText(const AValue: string);
begin
if FFindText = AValue then exit;
FFindText:=AValue;
If Assigned(FFindForm) then
TFindDialogForm(FFindForm).EditFind.Text := AValue;
end;
procedure TFindDialog.SetLeft(const AValue: Integer);
begin
if FFormLeft = AValue then Exit;
FFormLeft:=AValue;
if Assigned(FFindForm) then FFindForm.Left :=FFormLeft;
end;
procedure TFindDialog.SetOptions(AValue: TFindOptions);
begin
if FOptions=AValue then Exit;
FOptions:=AValue;
If Assigned(FFindForm) then begin
TFindDialogForm(FFindForm).EntireScopeCheckBox.Checked := (frEntireScope in FOptions);
TFindDialogForm(FFindForm).WholeWordsOnlyCheckBox.Checked := (frWholeWord in FOptions);
TFindDialogForm(FFindForm).CaseSensitiveCheckBox.checked := (frMatchCase in FOptions);
end;
end;
procedure TFindDialog.SetPosition(const AValue: TPoint);
begin
if (GetLeft <> AValue.x) then Left := AValue.x;
If (GetTop <> AValue.y) then Top := AValue.y;
end;
procedure TFindDialog.SetTop(const AValue: Integer);
begin
if FFormTop = AValue then exit;
FFormTop:=AValue;
if Assigned(FFindForm) then FFindForm.Top :=FFormTop;
end;
procedure TFindDialog.Find;
begin
if Assigned(FOnFind) then
FOnFind(Self);
end;
procedure TFindDialog.Help;
begin
if Assigned(FOnHelpClicked) then
FOnHelpClicked(Self);
end;
procedure TFindDialog.Replace;
begin
if Assigned(FOnReplace) then
FOnReplace(Self);
end;
function TFindDialog.CreateForm: TForm;
begin
// do not use Self as Owner, otherwise as desgntime this will not work
//debugln(['TFindDialog.CreateForm: Left=',Left,', Top=',Top,', Position=',dbgs(position),', FFormLeft=',FFormLeft,', FFormTop=',FFormTop]);
Result := TFindDialogForm.CreateNew(nil,Options);
with TFindDialogForm(Result) do
begin
FindButton.Caption := rsFind;
CancelButton.Caption := rsMbCancel;
HelpButton.Caption := rsHelp;
WholeWordsOnlyCheckBox.Caption := rsWholeWordsOnly;
CaseSensitiveCheckBox.Caption := rsCaseSensitive;
EntireScopeCheckBox.Caption := rsEntireScope;
FindLabel.Caption := rsText;
DirectionRadioGroup.Caption := rsDirection;
DirectionRadioGroup.Items[0] := rsForward;
DirectionRadioGroup.Items[1] := rsBackward;
//Setting up button eventhandlers
FindButton.OnClick := @FindClick;
HelpButton.OnClick := @HelpClick;
CancelButton.OnClick := @CancelClick;
PopupMode := pmAuto;
// Init local property with default value
Result.Top := FFormTop;
Result.Left := FFormLeft;
end;
end;
procedure TFindDialog.SetFormValues;
var
Dlg: TFindDialogForm;
begin
Dlg:=TFindDialogForm(FFindForm);
Dlg.EditFind.Text:=FFindText;
Dlg.EditFind.SelectAll;
Dlg.ActiveControl:=Dlg.EditFind;
Dlg.WholeWordsOnlyCheckBox.Checked:=frWholeWord in Options;
Dlg.CaseSensitiveCheckBox.Checked:=frMatchCase in Options;
Dlg.EntireScopeCheckBox.Checked:=frEntireScope in Options;
Dlg.DirectionRadioGroup.ItemIndex:=ord(not(frDown in Options));
Dlg.WholeWordsOnlyCheckBox.Enabled:=not (frDisableWholeWord in Options);
Dlg.CaseSensitiveCheckBox.Enabled:=not (frDisableMatchCase in Options);
Dlg.DirectionRadioGroup.Enabled:=not (frDisableUpDown in Options);
Dlg.WholeWordsOnlyCheckBox.Visible:=not (frHideWholeWord in Options);
Dlg.CaseSensitiveCheckBox.Visible:=not (frHideMatchCase in Options);
Dlg.DirectionRadioGroup.Visible:=not (frHideUpDown in Options);
Dlg.HelpButton.Visible:=(frShowHelp in Options);
Dlg.EntireScopeCheckBox.Visible := not (frHideEntireScope in Options);
end;
procedure TFindDialog.GetFormValues;
var
Dlg: TFindDialogForm;
begin
Dlg:=TFindDialogForm(FFindForm);
if Dlg.DirectionRadioGroup.ItemIndex = 0 then
FOptions:=FOptions + [frDown]
else
FOptions:=FOptions - [frDown];
if Dlg.WholeWordsOnlyCheckBox.Checked then
FOptions:=FOptions + [frWholeWord]
else
FOptions:=FOptions - [frWholeWord];
if Dlg.CaseSensitiveCheckBox.Checked then
FOptions:=FOptions + [frMatchCase]
else
FOptions:=FOptions - [frMatchCase];
if Dlg.EntireScopeCheckBox.Checked then
FOptions:=FOptions + [frEntireScope]
else
FOptions:=FOptions - [frEntireScope];
FFindText := Dlg.EditFind.Text;
end;
procedure TFindDialog.CalcPosition(aForm:Tform);
begin
//debugln(['TFindDialog.CalcPosition: Left=',Left,', Top=',Top,', Position=',dbgs(position),', FFormLeft=',FFormLeft,', FFormTop=',FFormTop]);
if (csDesigning in ComponentState) then
begin
aForm.Position := poScreenCenter;
Exit;
end;
if (FFormLeft < 0) and (FFormTop < 0) then
begin
aForm.Position := poMainFormCenter;
FFormTop := aForm.Top;
FFormLeft := aForm.Left;
end;
end;
constructor TFindDialog.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FOptions:=[frDown];
FFormLeft := -1;
FFormTop := -1;
end;
destructor TFindDialog.Destroy;
begin
FreeAndNil(FFindForm);
inherited Destroy;
end;
procedure TFindDialog.CloseDialog;
begin
if Assigned(FFindForm) then
FFindForm.Close;
end;
function TFindDialog.Execute: Boolean;
begin
Result := False;
if not Assigned(FFindForm) then
FFindForm:=CreateForm;
if Assigned(FFindForm) then begin
CalcPosition(FFindForm);
SetFormValues;
FFindForm.OnClose:=@DoCloseForm;
FFindForm.OnShow := @DoShowForm;
FFindForm.HelpContext:=HelpContext;
FFindForm.Caption:=Title;
FFindForm.Show;
FHeight := FFindForm.Height;
FWidth := FFindForm.Width;
Result := true;
end;
end;
function TFindDialog.DefaultTitle: string;
begin
Result := rsFind;
end;