lazarus/components/ideintf/idedialogs.pas
2019-03-08 12:12:59 +00:00

199 lines
5.7 KiB
ObjectPascal

{ Copyright (C) 2004
*****************************************************************************
See the file COPYING.modifiedLGPL.txt, included in this distribution,
for details about the license.
*****************************************************************************
Author: Mattias Gaertner
Abstract:
Common IDE dialogs.
}
unit IDEDialogs;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils,
// LCL
Dialogs,
// LazUtils
UITypes, LazFileCache,
// IdeIntf
LazMsgDialogs;
type
{ TIDEOpenDialog }
TIDEOpenDialog = class(TOpenDialog)
protected
function DoExecute: boolean; override;
end;
TIDEOpenDialogClass = class of TIDEOpenDialog;
{ TIDESaveDialog }
TIDESaveDialog = class(TSaveDialog)
protected
function DoExecute: boolean; override;
end;
TIDESaveDialogClass = class of TIDESaveDialog;
TIDESelectDirectory = function(const Title, InitialDir: string): string of object;
TInitIDEFileDialog = procedure(AFileDialog: TFileDialog) of object;
TStoreIDEFileDialog = procedure(AFileDialog: TFileDialog) of object;
var // set by the IDE
LazIDESelectDirectory: TIDESelectDirectory = nil;
InitIDEFileDialog: TInitIDEFileDialog = nil;
StoreIDEFileDialog: TStoreIDEFileDialog = nil;
IDEOpenDialogClass: TIDEOpenDialogClass = TIDEOpenDialog;
IDESaveDialogClass: TIDESaveDialogClass = TIDESaveDialog;
// Wrapper function for LazIDESelectDirectory with a default parameter.
function LazSelectDirectory(const Title: string; const InitialDir: string = ''): string;
// Wrapper function for LazMessageDialog in LazMsgDialogs.
function IDEMessageDialog(const aCaption, aMsg: string;
DlgType: TMsgDlgType; Buttons: TMsgDlgButtons;
const HelpKeyword: string = ''): Integer;
// Wrapper function for LazQuestionDialog in LazMsgDialogs.
function IDEQuestionDialog(const aCaption, aMsg: string;
DlgType: TMsgDlgType; Buttons: array of const;
const HelpKeyword: string = ''): Integer;
function IDEMessageDialogAb(const aCaption, aMsg: string;
DlgType: TMsgDlgType; Buttons: TMsgDlgButtons;
ShowAbort: boolean; const HelpKeyword: string = ''): Integer;
function IDEQuestionDialogAb(const aCaption, aMsg: string;
DlgType: TMsgDlgType; Buttons: array of const;
HideAbort: boolean; const HelpKeyword: string = ''): Integer;
type
{ TIgnoreIDEQuestionItem }
TIgnoreQuestionDuration = (
iiidIDERestart,
iiid24H,
iiidForever
);
TIgnoreQuestionDurations = set of TIgnoreQuestionDuration;
TIgnoreIDEQuestionItem = class
private
FIdentifier: string;
public
Date: TDateTime;
Flag: string;
Duration: TIgnoreQuestionDuration;
constructor Create(const TheIdentifier: string);
property Identifier: string read FIdentifier;
end;
{ TIgnoreIDEQuestionList }
TIgnoreIDEQuestionList = class
public
function Add(const Identifier: string;
const Duration: TIgnoreQuestionDuration;
const Flag: string = ''): TIgnoreIDEQuestionItem; virtual; abstract;
procedure Delete(const Identifier: string); virtual; abstract;
function Find(const Identifier: string): TIgnoreIDEQuestionItem; virtual; abstract;
end;
var
IgnoreQuestions: TIgnoreIDEQuestionList = nil;
implementation
function LazSelectDirectory(const Title: string; const InitialDir: string): string;
begin
Result:=LazIDESelectDirectory(Title,InitialDir);
end;
function IDEMessageDialog(const aCaption, aMsg: string;
DlgType: TMsgDlgType; Buttons: TMsgDlgButtons;
const HelpKeyword: string = ''): Integer;
begin
Result := LazMessageDialog(aCaption, aMsg, DlgType, Buttons, HelpKeyword);
end;
function IDEQuestionDialog(const aCaption, aMsg: string;
DlgType: TMsgDlgType; Buttons: array of const;
const HelpKeyword: string = ''): Integer;
begin
Result := LazQuestionDialog(aCaption, aMsg, DlgType, Buttons, HelpKeyword);
end;
function IDEMessageDialogAb(const aCaption, aMsg: string; DlgType: TMsgDlgType;
Buttons: TMsgDlgButtons; ShowAbort: boolean; const HelpKeyword: string): Integer;
begin
if ShowAbort then begin
// add an abort button for 'Cancel all' and replace a Cancel with Ignore
Buttons:=Buttons+[mbAbort];
if mbCancel in Buttons then
Buttons:=Buttons-[mbCancel]+[mbIgnore];
end;
Result:=IDEMessageDialog(aCaption,aMsg,DlgType,Buttons,HelpKeyword);
end;
function IDEQuestionDialogAb(const aCaption, aMsg: string;
DlgType: TMsgDlgType; Buttons: array of const;
HideAbort: boolean; const HelpKeyword: string): Integer;
var
NewButtons: array of TVarRec;
i: Integer;
j: Integer;
begin
SetLength(NewButtons,High(Buttons)-Low(Buttons)+1);
i:=low(Buttons);
j:=0;
while i<=High(Buttons) do begin
if HideAbort
and (Buttons[i].VType=vtInteger)
and (Buttons[i].VInteger=mrAbort) then begin
// skip abort button
inc(i);
// and skip abort caption
if Buttons[i].VType<>vtInteger then
inc(i);
end else begin
NewButtons[j]:=Buttons[i];
inc(i);
inc(j);
end;
end;
SetLength(NewButtons,j);
Result:=IDEQuestionDialog(aCaption,aMsg,DlgType,NewButtons,HelpKeyword);
end;
{ TIDESaveDialog }
function TIDESaveDialog.DoExecute: boolean;
begin
Result:=inherited DoExecute;
LazFileCache.InvalidateFileStateCache;
end;
{ TIDEOpenDialog }
function TIDEOpenDialog.DoExecute: boolean;
begin
Result:=inherited DoExecute;
LazFileCache.InvalidateFileStateCache;
end;
{ TIgnoreIDEQuestionItem }
constructor TIgnoreIDEQuestionItem.Create(const TheIdentifier: string);
begin
fIdentifier:=TheIdentifier;
end;
end.