IDE: Don't close package editors before layout is saved. Just test if package editors can be closed.

git-svn-id: trunk@60092 -
This commit is contained in:
michl 2019-01-15 21:38:30 +00:00
parent fcf8d854dc
commit f060e4ae45
5 changed files with 68 additions and 27 deletions

View File

@ -2055,6 +2055,7 @@ begin
CloseAllForms;
SaveIncludeLinks;
InputHistories.Save;
PkgBoss.DoCloseAllPackageEditors;
PkgBoss.SaveSettings;
if TheControlSelection<>nil then
TheControlSelection.Clear;
@ -2079,7 +2080,7 @@ begin
if not CloseQueryIDEWindows then exit;
// save packages
if PkgBoss.DoCloseAllPackageEditors<>mrOk then exit;
if PkgBoss.CanCloseAllPackageEditors<>mrOk then exit;
// save project
if AskSaveProject(lisDoYouStillWantToQuit,lisDiscardChangesAndQuit)<>mrOk then
@ -2493,6 +2494,7 @@ begin
if AForm=MainIDEBar then continue;
if IsFormDesign(AForm) then continue;
if AForm.Parent<>nil then continue;
if PkgBoss.IsPackageEditorForm(AForm) then continue;
if not AForm.CloseQuery then exit(false);
end;
Result:=true;

View File

@ -106,6 +106,8 @@ type
procedure OnProjectInspectorCopyMoveFiles(Sender: TObject); virtual; abstract;
// package editors
function CanClosePackageEditor(APackage: TLazPackage): TModalResult; virtual; abstract;
function CanCloseAllPackageEditors: TModalResult; virtual; abstract;
function DoNewPackage: TModalResult; virtual; abstract;
function DoOpenPackage(APackage: TLazPackage; Flags: TPkgOpenFlags;
ShowAbort: boolean): TModalResult; virtual; abstract;
@ -116,6 +118,7 @@ type
function DoCloseAllPackageEditors: TModalResult; virtual; abstract;
function AddPackageDependency(APackage: TLazPackage; const ReqPackage: string;
OnlyTestIfPossible: boolean = false): TModalResult; virtual; abstract;
function IsPackageEditorForm(AForm: TCustomForm): boolean; virtual; abstract;
procedure OpenHiddenModifiedPackages; virtual; abstract;
// package graph

View File

@ -785,6 +785,7 @@ type
function GetLazPackage: TLazPackage; virtual;
procedure SetLazPackage(const AValue: TLazPackage); virtual; abstract;
public
function CanCloseEditor: TModalResult; virtual; abstract;
procedure UpdateAll(Immediately: boolean = false); virtual; abstract;
property LazPackage: TLazPackage read GetLazPackage write SetLazPackage;
end;

View File

@ -374,6 +374,7 @@ type
public
constructor Create(TheOwner: TComponent); override;
destructor Destroy; override;
function CanCloseEditor: TModalResult; override;
procedure DoCompile(CompileClean, CompileRequired: boolean);
procedure DoFindInFiles;
procedure DoFixFilesCase;
@ -1235,33 +1236,8 @@ end;
procedure TPackageEditorForm.PackageEditorFormCloseQuery(Sender: TObject;
var CanClose: boolean);
var
MsgResult: Integer;
begin
//debugln(['TPackageEditorForm.PackageEditorFormCloseQuery ',Caption]);
if (LazPackage<>nil) and (not (lpfDestroying in LazPackage.Flags)) then
begin
if (not LazPackage.ReadOnly) and LazPackage.Modified then
begin
MsgResult:=MessageDlg(lisPkgMangSavePackage,
Format(lisPckEditPackageHasChangedSavePackage, [LazPackage.IDAsString, LineEnding]),
mtConfirmation,[mbYes,mbNo,mbAbort],0);
case MsgResult of
mrYes:
MsgResult:=PackageEditors.SavePackage(LazPackage,false);
mrNo:
LazPackage.UserIgnoreChangeStamp:=LazPackage.ChangeStamp;
end;
if MsgResult=mrAbort then CanClose:=false;
LazPackage.Modified:=false; // clear modified flag, so that it will be closed
end;
if CanClose and not MainIDE.IDEIsClosing then
begin
EnvironmentOptions.LastOpenPackages.Remove(LazPackage.Filename);
MainIDE.SaveEnvironment;
end;
end;
//debugln(['TPackageEditorForm.PackageEditorFormCloseQuery CanClose=',CanClose,' ',Caption]);
CanClose:=CanCloseEditor=mrOK;
if CanClose then
Application.ReleaseComponent(Self);
end;
@ -3328,6 +3304,39 @@ begin
inherited Destroy;
end;
function TPackageEditorForm.CanCloseEditor: TModalResult;
var
MsgResult: Integer;
begin
Result:=mrOK;
//debugln(['TPackageEditorForm.CanCloseEditor ',Caption]);
if (LazPackage<>nil) and (not (lpfDestroying in LazPackage.Flags)) then
begin
if (not LazPackage.ReadOnly) and LazPackage.Modified then
begin
MsgResult:=MessageDlg(lisPkgMangSavePackage,
Format(lisPckEditPackageHasChangedSavePackage, [LazPackage.IDAsString, LineEnding]),
mtConfirmation,[mbYes,mbNo,mbAbort],0);
case MsgResult of
mrYes:
MsgResult:=PackageEditors.SavePackage(LazPackage,false);
mrNo:
LazPackage.UserIgnoreChangeStamp:=LazPackage.ChangeStamp;
end;
if MsgResult=mrAbort then
Result:=mrAbort
else
LazPackage.Modified:=false; // clear modified flag, so that it will be closed
end;
if (Result=mrOK) and not MainIDE.IDEIsClosing then
begin
EnvironmentOptions.LastOpenPackages.Remove(LazPackage.Filename);
MainIDE.SaveEnvironment;
end;
end;
//debugln(['TPackageEditorForm.CanCloseEditor Result=',dbgs(Result),' ',Caption]);
end;
procedure TPackageEditorForm.TraverseSettings(AOptions: TAbstractPackageFileIDEOptions;
anAction: TIDEPackageOptsDlgAction);

View File

@ -299,6 +299,8 @@ type
procedure OnProjectInspectorCopyMoveFiles(Sender: TObject); override;
// package editors
function CanClosePackageEditor(APackage: TLazPackage): TModalResult; override;
function CanCloseAllPackageEditors: TModalResult; override;
function DoOpenPkgFile(PkgFile: TPkgFile): TModalResult;
function DoNewPackage: TModalResult; override;
function DoShowLoadedPkgDlg: TModalResult; override;
@ -309,6 +311,7 @@ type
function DoOpenPackageFile(AFilename: string;
Flags: TPkgOpenFlags;
ShowAbort: boolean): TModalResult; override;
function IsPackageEditorForm(AForm: TCustomForm): boolean; override;
procedure OpenHiddenModifiedPackages; override;
function DoSavePackage(APackage: TLazPackage;
Flags: TPkgSaveFlags): TModalResult; override;
@ -3717,6 +3720,11 @@ begin
MainIDEInterface.UpdateHighlighters;
end;
function TPkgManager.IsPackageEditorForm(AForm: TCustomForm): boolean;
begin
Result:=AForm is TPackageEditorForm;
end;
procedure TPkgManager.OpenHiddenModifiedPackages;
var
i: Integer;
@ -6427,6 +6435,24 @@ begin
CopyMoveFiles(Sender);
end;
function TPkgManager.CanClosePackageEditor(APackage: TLazPackage): TModalResult;
begin
Result:=APackage.Editor.CanCloseEditor;
end;
function TPkgManager.CanCloseAllPackageEditors: TModalResult;
var
APackage: TLazPackage;
i: Integer;
begin
for i:=0 to PackageEditors.Count-1 do begin
APackage:=PackageEditors.Editors[i].LazPackage;
Result:=CanClosePackageEditor(APackage);
if Result<>mrOk then exit;
end;
Result:=mrOk;
end;
function TPkgManager.CanOpenDesignerForm(AnUnitInfo: TUnitInfo;
Interactive: boolean): TModalResult;
var