mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-05 05:28:17 +02:00
476 lines
16 KiB
ObjectPascal
476 lines
16 KiB
ObjectPascal
{
|
|
***************************************************************************
|
|
* *
|
|
* This source is free software; you can redistribute it and/or modify *
|
|
* it under the terms of the GNU General Public License as published by *
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
* (at your option) any later version. *
|
|
* *
|
|
* This code is distributed in the hope that it will be useful, but *
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
|
* General Public License for more details. *
|
|
* *
|
|
* A copy of the GNU General Public License is available on the World *
|
|
* Wide Web at <http://www.gnu.org/copyleft/gpl.html>. You can also *
|
|
* obtain it by writing to the Free Software Foundation, *
|
|
* Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1335, USA. *
|
|
* *
|
|
***************************************************************************
|
|
}
|
|
unit IDEOptionsIntf;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils,
|
|
// LazUtils
|
|
Laz2_XMLCfg, LazMethodList;
|
|
|
|
const
|
|
NoParent = -1;
|
|
|
|
type
|
|
TIDEOptionsHandler = (
|
|
iohBeforeRead,
|
|
iohAfterRead,
|
|
iohBeforeWrite,
|
|
iohAfterWrite,
|
|
iohDestroy
|
|
);
|
|
TIDEOptionsHandlers = set of TIDEOptionsHandler;
|
|
|
|
TIDEOptionsEditorSetting = (
|
|
ioesReadOnly // open options editor read only
|
|
);
|
|
TIDEOptionsEditorSettings = set of TIDEOptionsEditorSetting;
|
|
|
|
TIDEOptionsWriteEvent = procedure(Sender: TObject; Restore: boolean) of object;
|
|
|
|
TAbstractDesktopDockingOpt = class
|
|
public
|
|
constructor Create; virtual;
|
|
procedure StoreWindowPositions; virtual; abstract;
|
|
procedure LoadDefaults; virtual; abstract;
|
|
procedure Load(Path: String; aXMLCfg: TRttiXMLConfig); virtual; abstract;
|
|
procedure Save(Path: String; aXMLCfg: TRttiXMLConfig); virtual; abstract;
|
|
procedure ImportSettingsFromIDE; virtual; abstract;
|
|
procedure ExportSettingsToIDE; virtual; abstract;
|
|
function RestoreDesktop: Boolean; virtual; abstract;
|
|
procedure Assign(Source: TAbstractDesktopDockingOpt); virtual; abstract;
|
|
end;
|
|
TAbstractDesktopDockingOptClass = class of TAbstractDesktopDockingOpt;
|
|
|
|
{ TAbstractIDEOptions base class for all option containers }
|
|
|
|
TAbstractIDEOptions = class(TPersistent)
|
|
private
|
|
fHandlers: array[TIDEOptionsHandler] of TMethodList;
|
|
FOnAfterRead: TNotifyEvent;
|
|
FOnAfterWrite: TIDEOptionsWriteEvent;
|
|
FOnBeforeRead: TNotifyEvent;
|
|
FOnBeforeWrite: TIDEOptionsWriteEvent;
|
|
public
|
|
constructor Create;
|
|
destructor Destroy; override;
|
|
procedure BeforeDestruction; override;
|
|
|
|
class function GetGroupCaption: string; virtual; abstract;
|
|
class function GetInstance: TAbstractIDEOptions; virtual; abstract;
|
|
|
|
procedure DoBeforeRead; virtual;
|
|
procedure DoAfterRead; virtual;
|
|
procedure DoBeforeWrite(Restore: boolean); virtual;
|
|
procedure DoAfterWrite(Restore: boolean); virtual;
|
|
|
|
procedure AddHandlerBeforeRead(const Handler: TNotifyEvent; const AsFirst: boolean = true); // AsFirst means: first to call
|
|
procedure RemoveHandlerBeforeRead(const Handler: TNotifyEvent);
|
|
procedure AddHandlerAfterRead(const Handler: TNotifyEvent; const AsFirst: boolean = true); // AsFirst means: first to call
|
|
procedure RemoveHandlerAfterRead(const Handler: TNotifyEvent);
|
|
procedure AddHandlerBeforeWrite(const Handler: TIDEOptionsWriteEvent; const AsFirst: boolean = true); // AsFirst means: first to call
|
|
procedure RemoveHandlerBeforeWrite(const Handler: TIDEOptionsWriteEvent);
|
|
procedure AddHandlerAfterWrite(const Handler: TIDEOptionsWriteEvent; const AsFirst: boolean = true); // AsFirst means: first to call
|
|
procedure RemoveHandlerAfterWrite(const Handler: TIDEOptionsWriteEvent);
|
|
procedure AddHandlerDestroy(const Handler: TNotifyEvent; const AsFirst: boolean = true); // AsFirst means: first to call
|
|
procedure RemoveHandlerDestroy(const Handler: TNotifyEvent);
|
|
|
|
property OnBeforeRead: TNotifyEvent read FOnBeforeRead write FOnBeforeRead;
|
|
property OnAfterRead: TNotifyEvent read FOnAfterRead write FOnAfterRead;
|
|
property OnBeforeWrite: TIDEOptionsWriteEvent read FOnBeforeWrite write FOnBeforeWrite;
|
|
property OnAfterWrite: TIDEOptionsWriteEvent read FOnAfterWrite write FOnAfterWrite;
|
|
end;
|
|
TAbstractIDEOptionsClass = class of TAbstractIDEOptions;
|
|
|
|
TAbstractIDEEnvironmentOptions = class(TAbstractIDEOptions);
|
|
TAbstractIDEHelpOptions = class(TAbstractIDEEnvironmentOptions);
|
|
|
|
TOnLoadIDEOptions = procedure(Sender: TObject; AOptions: TAbstractIDEOptions) of object;
|
|
TOnSaveIDEOptions = procedure(Sender: TObject; AOptions: TAbstractIDEOptions) of object;
|
|
|
|
TOnAddToRecent = procedure(Sender: TObject; AFileName: string; var AAllow: Boolean) of object;
|
|
TIDERecentHandler = (irhOpenFiles, irhProjectFiles, irhPackageFiles);
|
|
|
|
{ TIDEEnvironmentOptions }
|
|
|
|
TIDEEnvironmentOptions = class(TAbstractIDEEnvironmentOptions)
|
|
private
|
|
fRecentHandlers: array[TIDERecentHandler] of TMethodList;
|
|
procedure DoCallRecentHandlers(AHandler: TIDERecentHandler;
|
|
const AFileName: string; var AAllow: Boolean);
|
|
protected
|
|
procedure DoAddToRecentOpenFiles(const AFileName: string; var AAllow: Boolean);
|
|
procedure DoAddToRecentProjectFiles(const AFileName: string; var AAllow: Boolean);
|
|
procedure DoAddToRecentPackageFiles(const AFileName: string; var AAllow: Boolean);
|
|
public
|
|
constructor Create;
|
|
destructor Destroy; override;
|
|
public
|
|
procedure AddToRecentOpenFiles(const AFilename: string); virtual; abstract;
|
|
procedure RemoveFromRecentOpenFiles(const AFilename: string); virtual; abstract;
|
|
procedure AddToRecentProjectFiles(const AFilename: string); virtual; abstract;
|
|
procedure RemoveFromRecentProjectFiles(const AFilename: string); virtual; abstract;
|
|
Procedure GetRecentFiles(aType: TIDERecentHandler; aList : TStrings); virtual; abstract;
|
|
procedure AddToRecentPackageFiles(const AFilename: string); virtual; abstract;
|
|
procedure RemoveFromRecentPackageFiles(const AFilename: string); virtual; abstract;
|
|
|
|
function GetParsedCompilerFilename: string; virtual; abstract;
|
|
function GetParsedFppkgConfig: string; virtual; abstract;
|
|
function GetParsedLazarusDirectory: string; virtual; abstract;
|
|
|
|
procedure AddHandlerAddToRecentOpenFiles(Handler: TOnAddToRecent; const AsFirst: boolean = true); // AsFirst means: first to call
|
|
procedure RemoveHandlerAddToRecentOpenFiles(Handler: TOnAddToRecent);
|
|
procedure AddHandlerAddToRecentProjectFiles(Handler: TOnAddToRecent; const AsFirst: boolean = true); // AsFirst means: first to call
|
|
procedure RemoveHandlerAddToRecentProjectFiles(Handler: TOnAddToRecent);
|
|
procedure AddHandlerAddToRecentPackageFiles(Handler: TOnAddToRecent; const AsFirst: boolean = true); // AsFirst means: first to call
|
|
procedure RemoveHandlerAddToRecentPackageFiles(Handler: TOnAddToRecent);
|
|
end;
|
|
|
|
var
|
|
IDEEnvironmentOptions: TIDEEnvironmentOptions;
|
|
HasGUI: boolean = true; // lazbuild sets this to false
|
|
|
|
const
|
|
// predefined environment options groups
|
|
GroupEnvironment = 100;
|
|
EnvOptionsFiles = 100;
|
|
EnvOptionsDesktop = 200;
|
|
EnvOptionsWindow = 300;
|
|
EnvOptionsToolbar = 320;
|
|
EnvOptionsEditorToolbar = 330;
|
|
EnvOptionsCompPalette = 350;
|
|
EnvOptionsFormEd = 400;
|
|
EnvOptionsOI = 500;
|
|
EnvOptionsMessages = 550;
|
|
EnvOptionsFpDoc = 600;
|
|
EnvOptionsIdeStartup = 650;
|
|
EnvOptionsBackup = 700;
|
|
EnvOptionsNaming = 800;
|
|
EnvOptionsFileFilters = 900;
|
|
|
|
GroupEditor = 200;
|
|
EdtOptionsGeneral = 100;
|
|
EdtOptionsIndent = 110;
|
|
EdtOptionsGeneralMisc = 120;
|
|
EdtOptionsDisplay = 200;
|
|
EdtOptionsColors = 500;
|
|
EdtOptionsTMLColors = 501;
|
|
EdtOptionsMarkup = 502;
|
|
EdtOptionsUserDefined = 504;
|
|
EdtOptionsKeys = 300;
|
|
EdtOptionsMouse = 400;
|
|
EdtOptionsMouseAdv = 401;
|
|
EdtOptionsCodetools = 600;
|
|
EdtOptionsCodeFolding = 700;
|
|
EdtOptionsCodeFoldingMouse = 701;
|
|
EdtOptionsLineWrap = 800;
|
|
EdtOptionsDrawDivider = 900;
|
|
EdtOptionsMultiWindow = 1000;
|
|
|
|
GroupCodetools = 300;
|
|
CdtOptionsGeneral = 100;
|
|
CdtOptionsClassCompletion = 200;
|
|
CdtOptionsCodeCreation = 300;
|
|
CdtOptionsWords = 400;
|
|
CdtOptionsLineSplitting = 500;
|
|
CdtOptionsSpace = 600;
|
|
CdtOptionsIdentCompletion = 700;
|
|
|
|
GroupCodeExplorer = 350;
|
|
cdeOptionsUpdate = 100;
|
|
cdeOptionsCategories = 200;
|
|
cdeOptionsFigures = 300;
|
|
|
|
GroupDebugger = 400;
|
|
DbgOptionsGeneral = 100;
|
|
DbgOptionsClass = 150;
|
|
DbgOptionsEventLog = 200;
|
|
DbgOptionsSignals = 400;
|
|
DbgOptionsDispFormat = 500;
|
|
DbgOptionsValFormatter = 600;
|
|
DbgOptionsBackConverter = 700;
|
|
|
|
GroupHelp = 500;
|
|
HlpOptionsGeneral = 100;
|
|
|
|
// predefined project options groups
|
|
GroupProject = 100100;
|
|
ProjectOptionsApplication = 100;
|
|
ProjectOptionsForms = 200;
|
|
ProjectOptionsLazDoc = 300;
|
|
ProjectOptionsSave = 400;
|
|
ProjectOptionsVersionInfo = 500;
|
|
ProjectOptionsResources = 550;
|
|
ProjectOptionsI18N = 600;
|
|
ProjectOptionsMisc = 700;
|
|
ProjectOptionsDebug = 800;
|
|
DbgOptionsLanguageExceptions = 900;
|
|
ProjectOptionsDbgDisplayFormat = 1000;
|
|
ProjectOptionsDbgValueFormatter = 1100;
|
|
ProjectOptionsDbgValueConvert = 1200;
|
|
|
|
GroupPackage = 200100;
|
|
PackageOptionsUsage = 100;
|
|
PackageOptionsDescription = 200;
|
|
PackageOptionsIntegration = 300;
|
|
PackageOptionsProvides = 400;
|
|
PackageOptionsI18N = 500;
|
|
|
|
GroupCompiler = 100200;
|
|
CompilerOptionsBuildModes = 0100;
|
|
CompilerOptionsSearchPaths = 0200;
|
|
CompilerOptionsConfigTarget = 0250;
|
|
CompilerOptionsParsing = 0300;
|
|
CompilerOptionsCodeGeneration = 0400;
|
|
CompilerOptionsDebugging = 0500;
|
|
CompilerOptionsVerbosity = 0600;
|
|
CompilerOptionsMessages = 0700;
|
|
CompilerOptionsConditional = 0800; // IDE Macros
|
|
CompilerOptionsInherited = 0900;
|
|
CompilerOptionsCompilation = 1000;
|
|
CompilerOptionsOther = 1100;
|
|
CompilerOptionsAdditionsAndOverrides = 1200;
|
|
|
|
GroupPkgCompiler = 200200;
|
|
|
|
GroupPackageFile = 200300;
|
|
|
|
|
|
implementation
|
|
|
|
{ TIDEEnvironmentOptions }
|
|
|
|
constructor TIDEEnvironmentOptions.Create;
|
|
var
|
|
I: TIDERecentHandler;
|
|
begin
|
|
inherited Create;
|
|
for I := Low(fRecentHandlers) to High(fRecentHandlers) do
|
|
fRecentHandlers[I] := TMethodList.Create;
|
|
end;
|
|
|
|
destructor TIDEEnvironmentOptions.Destroy;
|
|
var
|
|
I: TIDERecentHandler;
|
|
begin
|
|
for I := Low(fRecentHandlers) to High(fRecentHandlers) do
|
|
fRecentHandlers[I].Free;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
procedure TIDEEnvironmentOptions.AddHandlerAddToRecentOpenFiles(
|
|
Handler: TOnAddToRecent; const AsFirst: boolean);
|
|
begin
|
|
fRecentHandlers[irhOpenFiles].Add(TMethod(Handler), AsFirst);
|
|
end;
|
|
|
|
procedure TIDEEnvironmentOptions.AddHandlerAddToRecentPackageFiles(
|
|
Handler: TOnAddToRecent; const AsFirst: boolean);
|
|
begin
|
|
fRecentHandlers[irhPackageFiles].Add(TMethod(Handler), AsFirst);
|
|
end;
|
|
|
|
procedure TIDEEnvironmentOptions.AddHandlerAddToRecentProjectFiles(
|
|
Handler: TOnAddToRecent; const AsFirst: boolean);
|
|
begin
|
|
fRecentHandlers[irhProjectFiles].Add(TMethod(Handler), AsFirst);
|
|
end;
|
|
|
|
procedure TIDEEnvironmentOptions.DoAddToRecentOpenFiles(
|
|
const AFileName: string; var AAllow: Boolean);
|
|
begin
|
|
DoCallRecentHandlers(irhOpenFiles, AFileName, AAllow);
|
|
end;
|
|
|
|
procedure TIDEEnvironmentOptions.DoAddToRecentPackageFiles(
|
|
const AFileName: string; var AAllow: Boolean);
|
|
begin
|
|
DoCallRecentHandlers(irhPackageFiles, AFileName, AAllow);
|
|
end;
|
|
|
|
procedure TIDEEnvironmentOptions.DoAddToRecentProjectFiles(
|
|
const AFileName: string; var AAllow: Boolean);
|
|
begin
|
|
DoCallRecentHandlers(irhProjectFiles, AFileName, AAllow);
|
|
end;
|
|
|
|
procedure TIDEEnvironmentOptions.DoCallRecentHandlers(
|
|
AHandler: TIDERecentHandler; const AFileName: string; var AAllow: Boolean);
|
|
var
|
|
xMethod: TOnAddToRecent;
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to fRecentHandlers[AHandler].Count-1 do
|
|
begin
|
|
xMethod := TOnAddToRecent(fRecentHandlers[AHandler][I]);
|
|
xMethod(Self, AFileName, AAllow);
|
|
end;
|
|
end;
|
|
|
|
procedure TIDEEnvironmentOptions.RemoveHandlerAddToRecentOpenFiles(
|
|
Handler: TOnAddToRecent);
|
|
begin
|
|
fRecentHandlers[irhOpenFiles].Remove(TMethod(Handler));
|
|
end;
|
|
|
|
procedure TIDEEnvironmentOptions.RemoveHandlerAddToRecentPackageFiles(
|
|
Handler: TOnAddToRecent);
|
|
begin
|
|
fRecentHandlers[irhPackageFiles].Remove(TMethod(Handler));
|
|
end;
|
|
|
|
procedure TIDEEnvironmentOptions.RemoveHandlerAddToRecentProjectFiles(
|
|
Handler: TOnAddToRecent);
|
|
begin
|
|
fRecentHandlers[irhProjectFiles].Remove(TMethod(Handler));
|
|
end;
|
|
|
|
{ TAbstractDesktopDockingOpt }
|
|
|
|
constructor TAbstractDesktopDockingOpt.Create;
|
|
begin
|
|
inherited Create;
|
|
end;
|
|
|
|
{ TAbstractIDEOptions }
|
|
|
|
constructor TAbstractIDEOptions.Create;
|
|
var
|
|
h: TIDEOptionsHandler;
|
|
begin
|
|
for h:=low(TIDEOptionsHandler) to high(TIDEOptionsHandler) do
|
|
fHandlers[h]:=TMethodList.Create;
|
|
end;
|
|
|
|
destructor TAbstractIDEOptions.Destroy;
|
|
var
|
|
h: TIDEOptionsHandler;
|
|
begin
|
|
for h:=low(TIDEOptionsHandler) to high(TIDEOptionsHandler) do
|
|
FreeAndNil(fHandlers[h]);
|
|
inherited Destroy;
|
|
end;
|
|
|
|
procedure TAbstractIDEOptions.BeforeDestruction;
|
|
begin
|
|
inherited BeforeDestruction;
|
|
fHandlers[iohDestroy].CallNotifyEvents(Self);
|
|
end;
|
|
|
|
procedure TAbstractIDEOptions.DoBeforeRead;
|
|
begin
|
|
if Assigned(FOnBeforeRead) then
|
|
FOnBeforeRead(Self);
|
|
fHandlers[iohBeforeRead].CallNotifyEvents(Self);
|
|
end;
|
|
|
|
procedure TAbstractIDEOptions.DoAfterRead;
|
|
begin
|
|
fHandlers[iohAfterRead].CallNotifyEvents(Self);
|
|
if Assigned(FOnAfterRead) then
|
|
FOnAfterRead(Self);
|
|
end;
|
|
|
|
procedure TAbstractIDEOptions.DoBeforeWrite(Restore: boolean);
|
|
var
|
|
i: LongInt;
|
|
begin
|
|
if Assigned(FOnBeforeWrite) then
|
|
FOnBeforeWrite(Self,Restore);
|
|
i:=fHandlers[iohBeforeWrite].Count;
|
|
while fHandlers[iohBeforeWrite].NextDownIndex(i) do
|
|
TIDEOptionsWriteEvent(fHandlers[iohBeforeWrite][i])(Self,Restore);
|
|
end;
|
|
|
|
procedure TAbstractIDEOptions.DoAfterWrite(Restore: boolean);
|
|
var
|
|
i: LongInt;
|
|
begin
|
|
i:=fHandlers[iohAfterWrite].Count;
|
|
while fHandlers[iohAfterWrite].NextDownIndex(i) do
|
|
TIDEOptionsWriteEvent(fHandlers[iohAfterWrite][i])(Self,Restore);
|
|
// OnAfterWrite event handler may overwrite Self. Call it last.
|
|
if Assigned(FOnAfterWrite) then
|
|
FOnAfterWrite(Self,Restore);
|
|
end;
|
|
|
|
procedure TAbstractIDEOptions.AddHandlerBeforeRead(const Handler: TNotifyEvent;
|
|
const AsFirst: boolean);
|
|
begin
|
|
fHandlers[iohBeforeRead].Add(TMethod(Handler),AsFirst);
|
|
end;
|
|
|
|
procedure TAbstractIDEOptions.RemoveHandlerBeforeRead(const Handler: TNotifyEvent);
|
|
begin
|
|
fHandlers[iohBeforeRead].Remove(TMethod(Handler));
|
|
end;
|
|
|
|
procedure TAbstractIDEOptions.AddHandlerAfterRead(const Handler: TNotifyEvent;
|
|
const AsFirst: boolean);
|
|
begin
|
|
fHandlers[iohAfterRead].Add(TMethod(Handler),AsFirst);
|
|
end;
|
|
|
|
procedure TAbstractIDEOptions.RemoveHandlerAfterRead(const Handler: TNotifyEvent);
|
|
begin
|
|
fHandlers[iohAfterRead].Remove(TMethod(Handler));
|
|
end;
|
|
|
|
procedure TAbstractIDEOptions.AddHandlerBeforeWrite(
|
|
const Handler: TIDEOptionsWriteEvent; const AsFirst: boolean);
|
|
begin
|
|
fHandlers[iohBeforeWrite].Add(TMethod(Handler),AsFirst);
|
|
end;
|
|
|
|
procedure TAbstractIDEOptions.RemoveHandlerBeforeWrite(
|
|
const Handler: TIDEOptionsWriteEvent);
|
|
begin
|
|
fHandlers[iohBeforeWrite].Remove(TMethod(Handler));
|
|
end;
|
|
|
|
procedure TAbstractIDEOptions.AddHandlerAfterWrite(
|
|
const Handler: TIDEOptionsWriteEvent; const AsFirst: boolean);
|
|
begin
|
|
fHandlers[iohAfterWrite].Add(TMethod(Handler),AsFirst);
|
|
end;
|
|
|
|
procedure TAbstractIDEOptions.RemoveHandlerAfterWrite(
|
|
const Handler: TIDEOptionsWriteEvent);
|
|
begin
|
|
fHandlers[iohAfterWrite].Remove(TMethod(Handler));
|
|
end;
|
|
|
|
procedure TAbstractIDEOptions.AddHandlerDestroy(const Handler: TNotifyEvent;
|
|
const AsFirst: boolean);
|
|
begin
|
|
fHandlers[iohDestroy].Add(TMethod(Handler),AsFirst);
|
|
end;
|
|
|
|
procedure TAbstractIDEOptions.RemoveHandlerDestroy(const Handler: TNotifyEvent);
|
|
begin
|
|
fHandlers[iohDestroy].Remove(TMethod(Handler));
|
|
end;
|
|
|
|
end.
|