mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-05 15:18:09 +02:00
1421 lines
54 KiB
ObjectPascal
1421 lines
54 KiB
ObjectPascal
unit EnvGuiOptions;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, Contnrs, Math,
|
|
// LCL
|
|
Graphics, Forms, Controls,
|
|
// LazUtils
|
|
LazFileUtils, FileUtil, LazFileCache, LazUTF8, Laz2_XMLCfg, Laz2_DOM,
|
|
// BuildIntf
|
|
ProjectIntf, IDEOptionsIntf, IDEExternToolIntf, ComponentReg,
|
|
// IDEIntf
|
|
ObjectInspector, IDEWindowIntf, IDEOptEditorIntf, SrcEditorIntf,
|
|
// IdeConfig
|
|
IDEOptionDefs, EnvironmentOpts, ModeMatrixOpts, CoolBarOptions, EditorToolBarOptions;
|
|
|
|
const
|
|
DefaultRubberbandSelectsGrandChilds = false;
|
|
DefaultBorderSpacingColor = clRed;
|
|
DefaultGridColor = clBlack;
|
|
DefaultGridSize = 8;
|
|
DefaultGuideLineColorLeftTop = clBlue;
|
|
DefaultGuideLineColorRightBottom = clGreen;
|
|
|
|
type
|
|
{ Messages window }
|
|
TMsgWndFileNameStyle = (
|
|
mwfsShort, // = ExtractFilename
|
|
mwfsRelative, // = CreateRelativePath
|
|
mwfsFull
|
|
);
|
|
//TMsgWndFileNameStyles = set of TMsgWndFileNameStyle;
|
|
const
|
|
MsgWndFileNameStyleNames: array[TMsgWndFileNameStyle] of string = (
|
|
'Short', // mwfsShort
|
|
'Relative', // mwfsRelative
|
|
'Full' // mwfsFull
|
|
);
|
|
type
|
|
TMsgWndColor = (
|
|
mwBackground,
|
|
mwRunning,
|
|
mwSuccess,
|
|
mwFailed,
|
|
mwAutoHeader,
|
|
mwTextColor
|
|
);
|
|
const
|
|
MsgWndDefBackgroundColor = clWindow;
|
|
MsgWndDefHeaderBackgroundRunning = clYellow;
|
|
MsgWndDefHeaderBackgroundSuccess = TColor($60FF60); // light green
|
|
MsgWndDefHeaderBackgroundFailed = TColor($6060FF); // light red
|
|
MsgWndDefAutoHeaderBackground = clSkyBlue;
|
|
MsgWndDefTextColor = clDefault;
|
|
|
|
MsgWndDefaultColors: array[TMsgWndColor] of TColor = (
|
|
MsgWndDefBackgroundColor, // mwBackground
|
|
MsgWndDefHeaderBackgroundRunning, // mwRunning
|
|
MsgWndDefHeaderBackgroundSuccess, // mwSuccess
|
|
MsgWndDefHeaderBackgroundFailed, // mwFailed
|
|
MsgWndDefAutoHeaderBackground, // mwAutoHeader
|
|
MsgWndDefTextColor
|
|
);
|
|
MsgWndColorNames: array[TMsgWndColor] of string = (
|
|
'Background',
|
|
'Running',
|
|
'Success',
|
|
'Failed',
|
|
'AutoHeader',
|
|
'TextColor'
|
|
);
|
|
|
|
type
|
|
{ TCustomDesktopOpt }
|
|
|
|
TCustomDesktopOpt = class
|
|
protected
|
|
FName:string;
|
|
FAssociatedDebugDesktopName: String;
|
|
FConfigStore: TXMLOptionsStorage;
|
|
FIsDocked: Boolean;
|
|
FXMLCfg: TRttiXMLConfig;
|
|
function GetCompatible: Boolean; virtual;
|
|
public
|
|
constructor Create(const aName: String); virtual; overload;
|
|
constructor Create(const aName: String; const aIsDocked: Boolean); virtual; overload;
|
|
destructor Destroy; override;
|
|
procedure SetConfig(aXMLCfg: TRttiXMLConfig; aConfigStore: TXMLOptionsStorage);
|
|
procedure Load(Path: String); virtual;
|
|
procedure Save(Path: String); virtual; abstract;
|
|
property Name: String read FName write FName;
|
|
property AssociatedDebugDesktopName: String read FAssociatedDebugDesktopName write FAssociatedDebugDesktopName;
|
|
property IsDocked: Boolean read FIsDocked;
|
|
property Compatible: Boolean read GetCompatible;
|
|
end;
|
|
TDesktopOptClass = class of TCustomDesktopOpt;
|
|
|
|
TEnvGuiOptions = class;
|
|
|
|
{ TDesktopOIOptions }
|
|
|
|
TDesktopOIOptions = class(TPersistent)
|
|
private
|
|
FComponentTreeHeight: integer;
|
|
FInfoBoxHeight: integer;
|
|
FShowComponentTree: Boolean;
|
|
FShowInfoBox: boolean;
|
|
FSplitterX: array[TObjectInspectorPage] of Integer;
|
|
|
|
function GetSplitterX(const APage: TObjectInspectorPage): Integer;
|
|
procedure SetSplitterX(const APage: TObjectInspectorPage; const ASplitterX: Integer);
|
|
protected
|
|
procedure AssignTo(Dest: TPersistent); override;
|
|
public
|
|
constructor Create;
|
|
procedure ImportSettingsFromIDE(const AOptions: TEnvGuiOptions);
|
|
procedure ExportSettingsToIDE(const AOptions: TEnvGuiOptions);
|
|
procedure Load(XMLConfig: TXMLConfig; Path: String);
|
|
procedure Save(XMLConfig: TXMLConfig; Path: String);
|
|
|
|
property ShowComponentTree: Boolean read FShowComponentTree write FShowComponentTree;
|
|
property ComponentTreeHeight: integer read FComponentTreeHeight write FComponentTreeHeight;
|
|
property SplitterX[const APage: TObjectInspectorPage]: Integer read GetSplitterX write SetSplitterX;
|
|
property ShowInfoBox: boolean read FShowInfoBox write FShowInfoBox;
|
|
property InfoBoxHeight: integer read FInfoBoxHeight write FInfoBoxHeight;
|
|
end;
|
|
|
|
{ TDesktopOpt }
|
|
|
|
TDesktopOpt = class(TCustomDesktopOpt)
|
|
private
|
|
// window layout
|
|
FIDEWindowCreatorsLayoutList: TSimpleWindowLayoutList;
|
|
FIDEDialogLayoutList: TIDEDialogLayoutList;
|
|
FObjectInspectorOptions: TDesktopOIOptions;
|
|
FSingleTaskBarButton: boolean;
|
|
FHideIDEOnRun: boolean;
|
|
FAutoAdjustIDEHeight: boolean;
|
|
FAutoAdjustIDEHeightFullCompPal: boolean;
|
|
FProjectInspectorShowProps: boolean;
|
|
// window menu
|
|
FIDENameForDesignedFormList: boolean;
|
|
// CompletionWindow
|
|
FCompletionWindowWidth: Integer;
|
|
FCompletionWindowHeight: Integer;
|
|
// title
|
|
FIDETitleStartsWithProject: boolean;
|
|
FIDETitleShowsBuildMode: boolean;
|
|
FIDETitleShowsProjectDir: boolean;
|
|
// IDE Coolbar
|
|
FIDECoolBarOptions: TIDECoolBarOptions;
|
|
// Editor Toolbar
|
|
FEditorToolBarOptions: TEditorToolBarOptions;
|
|
// component palette
|
|
FComponentPaletteOptions: TCompPaletteOptions;
|
|
// Docking options
|
|
FDockedOpt: TAbstractDesktopDockingOpt;
|
|
|
|
procedure InitLayoutList;
|
|
protected
|
|
function GetCompatible: Boolean; override;
|
|
public
|
|
constructor Create(const aName: String; const aIsDocked: Boolean); override; overload;
|
|
destructor Destroy; override;
|
|
procedure Assign(Source: TDesktopOpt; const AssignName: Boolean = False;
|
|
const IsCompatible: Boolean = True);
|
|
public
|
|
procedure Load(Path: String); override;
|
|
procedure Save(Path: String); override;
|
|
procedure ImportSettingsFromIDE(const AOptions: TEnvGuiOptions);
|
|
procedure ExportSettingsToIDE(const AOptions: TEnvGuiOptions);
|
|
procedure RestoreDesktop;
|
|
|
|
property IDEWindowCreatorsLayoutList: TSimpleWindowLayoutList read FIDEWindowCreatorsLayoutList write FIDEWindowCreatorsLayoutList;
|
|
property IDEDialogLayoutList: TIDEDialogLayoutList read FIDEDialogLayoutList;
|
|
property SingleTaskBarButton: boolean read FSingleTaskBarButton write FSingleTaskBarButton;
|
|
property HideIDEOnRun: boolean read FHideIDEOnRun write FHideIDEOnRun;
|
|
property AutoAdjustIDEHeight: Boolean read FAutoAdjustIDEHeight write FAutoAdjustIDEHeight;
|
|
property AutoAdjustIDEHeightFullCompPal: Boolean read FAutoAdjustIDEHeightFullCompPal
|
|
write FAutoAdjustIDEHeightFullCompPal;
|
|
property IDENameForDesignedFormList: boolean read FIDENameForDesignedFormList
|
|
write FIDENameForDesignedFormList;
|
|
property CompletionWindowWidth: Integer read FCompletionWindowWidth write FCompletionWindowWidth;
|
|
property CompletionWindowHeight: Integer read FCompletionWindowHeight write FCompletionWindowHeight;
|
|
property IDETitleStartsWithProject: boolean read FIDETitleStartsWithProject
|
|
write FIDETitleStartsWithProject;
|
|
property IDETitleShowsBuildMode: boolean read FIDETitleShowsBuildMode
|
|
write FIDETitleShowsBuildMode;
|
|
property IDETitleShowsProjectDir: boolean read FIDETitleShowsProjectDir
|
|
write FIDETitleShowsProjectDir;
|
|
property IDECoolBarOptions: TIDECoolBarOptions read FIDECoolBarOptions;
|
|
property EditorToolBarOptions: TEditorToolBarOptions read FEditorToolBarOptions;
|
|
property ComponentPaletteOptions: TCompPaletteOptions read FComponentPaletteOptions;
|
|
property ObjectInspectorOptions: TDesktopOIOptions read FObjectInspectorOptions;
|
|
property ProjectInspectorShowProps: boolean read FProjectInspectorShowProps
|
|
write FProjectInspectorShowProps;
|
|
end;
|
|
|
|
{ TUnsupportedDesktopOpt }
|
|
|
|
TUnsupportedDesktopOpt = Class(TCustomDesktopOpt)
|
|
private
|
|
FRetainXMLData:TDOMDocument;
|
|
public
|
|
destructor Destroy; override;
|
|
procedure Load(Path: String); override;
|
|
procedure Save(Path: String); override;
|
|
end;
|
|
|
|
{ TDesktopOptList }
|
|
|
|
TDesktopOptList = class(TObjectList)
|
|
private
|
|
FXMLCfg: TRttiXMLConfig;
|
|
FConfigStore: TXMLOptionsStorage;
|
|
function GetItem(Index: Integer): TCustomDesktopOpt;
|
|
procedure SetConfig(aXMLCfg: TRttiXMLConfig; aConfigStore: TXMLOptionsStorage);
|
|
public
|
|
constructor Create;
|
|
destructor Destroy; override;
|
|
procedure AddFromCfg(Path: String);
|
|
function IndexOf(aName: string): integer;
|
|
function Find(aName: string): TCustomDesktopOpt;
|
|
property Items[Index: Integer]: TCustomDesktopOpt read GetItem; default;
|
|
end;
|
|
|
|
{ TEnvGuiOptions }
|
|
|
|
TEnvGuiOptions = class(TIDESubOptions)
|
|
private
|
|
FConfigStorage: TXMLOptionsStorage;
|
|
// hints
|
|
FShowHintsForComponentPalette: boolean;
|
|
FShowHintsForMainSpeedButtons: boolean;
|
|
// glyphs
|
|
FShowButtonGlyphs: TApplicationShowGlyphs;
|
|
FShowMenuGlyphs: TApplicationShowGlyphs;
|
|
// designer
|
|
FCreateComponentFocusNameProperty: boolean;
|
|
FSwitchToFavoritesOITab: boolean;
|
|
FShowBorderSpacing: boolean;
|
|
FBorderSpacingColor: TColor;
|
|
FShowGrid: boolean;
|
|
FSnapToGrid: boolean;
|
|
FGridSizeX: integer;
|
|
FGridSizeY: integer;
|
|
FGridColor: TColor;
|
|
FShowGuideLines: boolean;
|
|
FSnapToGuideLines: boolean;
|
|
FGuideLineColorLeftTop: TColor;
|
|
FGuideLineColorRightBottom: TColor;
|
|
FShowComponentCaptions: boolean;
|
|
FShowEditorHints: boolean;
|
|
FAutoCreateFormsOnOpen: boolean;
|
|
FRightClickSelects: boolean;
|
|
FGrabberColor: TColor;
|
|
FMarkerColor: TColor;
|
|
FNonFormBackgroundColor: TColor;
|
|
FRubberbandSelectionColor: TColor;
|
|
FRubberbandCreationColor: TColor;
|
|
FRubberbandSelectsGrandChilds: boolean;
|
|
FCheckPackagesOnFormCreate: boolean;
|
|
FFormTitleBarChangesObjectInspector: boolean;
|
|
FForceDPIScalingInDesignTime: boolean;
|
|
// component list
|
|
FComponentListKeepOpen: Boolean;
|
|
FComponentListPageIndex: Integer;
|
|
// search result view
|
|
FSearchResultViewPathStyle: TMsgWndFileNameStyle;
|
|
// object inspector
|
|
FObjectInspectorOptions: TOIOptions;
|
|
// messages
|
|
FMsgViewDblClickJumps: boolean;
|
|
FMsgViewFocus: boolean;
|
|
FShowMessagesIcons: boolean;
|
|
FMsgViewStayOnTop: boolean;
|
|
FMsgViewShowTranslations: boolean;
|
|
FMsgViewAlwaysDrawFocused: boolean;
|
|
FMsgViewFilenameStyle: TMsgWndFileNameStyle;
|
|
FMsgViewColors: array[TMsgWndColor] of TColor;
|
|
FMsgColors: array[TMessageLineUrgency] of TColor;
|
|
FMsgViewFilters: TLMsgViewFilters;
|
|
// desktops
|
|
FDesktops: TDesktopOptList;
|
|
FDesktop: TDesktopOpt;
|
|
FLastDesktopBeforeDebug: TDesktopOpt;
|
|
FActiveDesktopName: string;
|
|
FAutoSaveActiveDesktop: Boolean;
|
|
FDebugDesktopName: string;
|
|
function GetMsgColors(u: TMessageLineUrgency): TColor;
|
|
function GetMsgViewColors(c: TMsgWndColor): TColor;
|
|
procedure SetMsgColors(u: TMessageLineUrgency; AValue: TColor);
|
|
procedure SetMsgViewColors(c: TMsgWndColor; AValue: TColor);
|
|
|
|
function GetActiveDesktop: TDesktopOpt;
|
|
function GetDebugDesktop: TDesktopOpt;
|
|
public
|
|
constructor Create;
|
|
destructor Destroy; override;
|
|
procedure ReadFromXml({%H-}OnlyDesktop: boolean); override;
|
|
procedure WriteToXml({%H-}OnlyDesktop: boolean); override;
|
|
procedure InitConfig; override;
|
|
|
|
procedure UseDesktop(ADesktop: TDesktopOpt);
|
|
procedure EnableDebugDesktop;
|
|
procedure DisableDebugDesktop;
|
|
class function DesktopCanBeLoaded(const aDockMaster: string): Boolean;
|
|
|
|
// hints
|
|
property ShowHintsForComponentPalette: boolean read FShowHintsForComponentPalette
|
|
write FShowHintsForComponentPalette;
|
|
property ShowHintsForMainSpeedButtons: boolean read FShowHintsForMainSpeedButtons
|
|
write FShowHintsForMainSpeedButtons;
|
|
// glyphs
|
|
property ShowButtonGlyphs: TApplicationShowGlyphs read FShowButtonGlyphs write FShowButtonGlyphs;
|
|
property ShowMenuGlyphs: TApplicationShowGlyphs read FShowMenuGlyphs write FShowMenuGlyphs;
|
|
// form designer
|
|
property ShowBorderSpacing: boolean read FShowBorderSpacing write FShowBorderSpacing;
|
|
property BorderSpacingColor: TColor read FBorderSpacingColor write FBorderSpacingColor;
|
|
property ShowGrid: boolean read FShowGrid write FShowGrid;
|
|
property SnapToGrid: boolean read FSnapToGrid write FSnapToGrid;
|
|
property GridColor: TColor read FGridColor write FGridColor;
|
|
property GridSizeX: integer read FGridSizeX write FGridSizeX;
|
|
property GridSizeY: integer read FGridSizeY write FGridSizeY;
|
|
property ShowGuideLines: boolean read FShowGuideLines write FShowGuideLines;
|
|
property SnapToGuideLines: boolean read FSnapToGuideLines write FSnapToGuideLines;
|
|
property GuideLineColorLeftTop: TColor read FGuideLineColorLeftTop
|
|
write FGuideLineColorLeftTop;
|
|
property GuideLineColorRightBottom: TColor read FGuideLineColorRightBottom
|
|
write FGuideLineColorRightBottom;
|
|
property ShowComponentCaptions: boolean read FShowComponentCaptions
|
|
write FShowComponentCaptions;
|
|
property ShowEditorHints: boolean read FShowEditorHints
|
|
write FShowEditorHints;
|
|
property AutoCreateFormsOnOpen: boolean read FAutoCreateFormsOnOpen
|
|
write FAutoCreateFormsOnOpen;
|
|
property CheckPackagesOnFormCreate: boolean read FCheckPackagesOnFormCreate
|
|
write FCheckPackagesOnFormCreate;
|
|
property RightClickSelects: boolean read FRightClickSelects
|
|
write FRightClickSelects;
|
|
property GrabberColor: TColor read FGrabberColor write FGrabberColor;
|
|
property MarkerColor: TColor read FMarkerColor write FMarkerColor;
|
|
property NonFormBackgroundColor: TColor read FNonFormBackgroundColor
|
|
write FNonFormBackgroundColor;
|
|
property RubberbandSelectionColor: TColor read FRubberbandSelectionColor
|
|
write FRubberbandSelectionColor;
|
|
property RubberbandCreationColor: TColor read FRubberbandCreationColor
|
|
write FRubberbandCreationColor;
|
|
property RubberbandSelectsGrandChilds: boolean read FRubberbandSelectsGrandChilds
|
|
write FRubberbandSelectsGrandChilds;
|
|
property CreateComponentFocusNameProperty: boolean read FCreateComponentFocusNameProperty
|
|
write FCreateComponentFocusNameProperty;
|
|
property SwitchToFavoritesOITab: boolean read FSwitchToFavoritesOITab
|
|
write FSwitchToFavoritesOITab;
|
|
property FormTitleBarChangesObjectInspector: boolean read FFormTitleBarChangesObjectInspector
|
|
write FFormTitleBarChangesObjectInspector;
|
|
property ForceDPIScalingInDesignTime: boolean read FForceDPIScalingInDesignTime
|
|
write FForceDPIScalingInDesignTime;
|
|
// component list
|
|
property ComponentListKeepOpen: Boolean read FComponentListKeepOpen write FComponentListKeepOpen;
|
|
property ComponentListPageIndex: Integer read FComponentListPageIndex write FComponentListPageIndex;
|
|
// search result view
|
|
property SearchResultViewPathStyle: TMsgWndFileNameStyle read FSearchResultViewPathStyle write FSearchResultViewPathStyle;
|
|
// object inspector
|
|
property ObjectInspectorOptions: TOIOptions read FObjectInspectorOptions;
|
|
// messages view
|
|
property MsgViewDblClickJumps: boolean read FMsgViewDblClickJumps
|
|
write FMsgViewDblClickJumps; // true=dbl click jump to error, false=single click jumps
|
|
property MsgViewFocus: boolean read FMsgViewFocus
|
|
write FMsgViewFocus; // when showing the message window, focus it
|
|
property ShowMessagesIcons: boolean read FShowMessagesIcons write FShowMessagesIcons;
|
|
property MsgViewStayOnTop: boolean read FMsgViewStayOnTop write FMsgViewStayOnTop;
|
|
property MsgViewShowTranslations: boolean read FMsgViewShowTranslations
|
|
write FMsgViewShowTranslations;
|
|
property MsgViewAlwaysDrawFocused: boolean read FMsgViewAlwaysDrawFocused
|
|
write FMsgViewAlwaysDrawFocused;
|
|
property MsgViewFilenameStyle: TMsgWndFileNameStyle read FMsgViewFilenameStyle
|
|
write FMsgViewFilenameStyle;
|
|
property MsgViewColors[c: TMsgWndColor]: TColor read GetMsgViewColors write SetMsgViewColors;
|
|
property MsgViewFilters: TLMsgViewFilters read FMsgViewFilters;
|
|
property MsgColors[u: TMessageLineUrgency]: TColor read GetMsgColors write SetMsgColors;
|
|
// desktops
|
|
property Desktops: TDesktopOptList read FDesktops;
|
|
property Desktop: TDesktopOpt read FDesktop; // the working desktop, standalone
|
|
property DebugDesktopName: string read FDebugDesktopName write FDebugDesktopName;
|
|
property DebugDesktop: TDesktopOpt read GetDebugDesktop; // debug desktop from Desktops list
|
|
property LastDesktopBeforeDebug: TDesktopOpt read FLastDesktopBeforeDebug write FLastDesktopBeforeDebug;
|
|
property ActiveDesktopName: string read FActiveDesktopName write FActiveDesktopName;
|
|
property ActiveDesktop: TDesktopOpt read GetActiveDesktop; // active desktop from Desktops list
|
|
property AutoSaveActiveDesktop: Boolean read FAutoSaveActiveDesktop write FAutoSaveActiveDesktop;
|
|
end;
|
|
|
|
function StrToMsgWndFilenameStyle(const s: string): TMsgWndFileNameStyle;
|
|
|
|
var
|
|
EnvironmentGuiOpts: TEnvGuiOptions;
|
|
|
|
|
|
implementation
|
|
|
|
function StrToMsgWndFilenameStyle(const s: string): TMsgWndFileNameStyle;
|
|
begin
|
|
for Result in TMsgWndFileNameStyle do
|
|
if CompareText(s,MsgWndFileNameStyleNames[Result])=0 then exit;
|
|
Result:=mwfsShort;
|
|
end;
|
|
|
|
{ TCustomDesktopOpt }
|
|
|
|
function TCustomDesktopOpt.GetCompatible: Boolean;
|
|
begin
|
|
Result := false;
|
|
end;
|
|
|
|
procedure TCustomDesktopOpt.Load(Path: String);
|
|
begin
|
|
FAssociatedDebugDesktopName:=FXMLCfg.GetValue(Path+'AssociatedDebugDesktopName/Value', '');
|
|
end;
|
|
|
|
constructor TCustomDesktopOpt.Create(const aName: String);
|
|
begin
|
|
Create(aName, Assigned(IDEDockMaster));
|
|
end;
|
|
|
|
constructor TCustomDesktopOpt.Create(const aName: String; const aIsDocked: Boolean);
|
|
begin
|
|
inherited Create;
|
|
FName:=aName;
|
|
FIsDocked := aIsDocked;
|
|
end;
|
|
|
|
destructor TCustomDesktopOpt.Destroy;
|
|
begin
|
|
inherited Destroy;
|
|
end;
|
|
|
|
procedure TCustomDesktopOpt.SetConfig(aXMLCfg: TRttiXMLConfig;
|
|
aConfigStore: TXMLOptionsStorage);
|
|
begin
|
|
FXMLCfg := aXMLCfg;
|
|
FConfigStore := aConfigStore;
|
|
end;
|
|
|
|
{ TDesktopOIOptions }
|
|
|
|
constructor TDesktopOIOptions.Create;
|
|
var
|
|
I: TObjectInspectorPage;
|
|
begin
|
|
FComponentTreeHeight := -1;
|
|
FInfoBoxHeight := -1;
|
|
FShowInfoBox := True;
|
|
for I in TObjectInspectorPage do
|
|
SplitterX[I] := -1;
|
|
end;
|
|
|
|
procedure TDesktopOIOptions.AssignTo(Dest: TPersistent);
|
|
var
|
|
DDest: TDesktopOIOptions;
|
|
I: TObjectInspectorPage;
|
|
begin
|
|
if Dest is TDesktopOIOptions then
|
|
begin
|
|
DDest := TDesktopOIOptions(Dest);
|
|
|
|
for I in TObjectInspectorPage do
|
|
DDest.SplitterX[I] := SplitterX[I];
|
|
DDest.ShowInfoBox := ShowInfoBox;
|
|
DDest.ComponentTreeHeight := ComponentTreeHeight;
|
|
DDest.ShowComponentTree := ShowComponentTree;
|
|
DDest.InfoBoxHeight := InfoBoxHeight;
|
|
end else
|
|
inherited AssignTo(Dest);
|
|
end;
|
|
|
|
function TDesktopOIOptions.GetSplitterX(const APage: TObjectInspectorPage): Integer;
|
|
begin
|
|
Result := FSplitterX[APage];
|
|
end;
|
|
|
|
procedure TDesktopOIOptions.ImportSettingsFromIDE(const AOptions: TEnvGuiOptions);
|
|
var
|
|
I: TObjectInspectorPage;
|
|
o: TOIOptions;
|
|
begin
|
|
o := AOptions.ObjectInspectorOptions;
|
|
for I in TObjectInspectorPage do
|
|
FSplitterX[I] := o.GridSplitterX[I];
|
|
|
|
ShowInfoBox := o.ShowInfoBox;
|
|
ComponentTreeHeight := o.ComponentTreeHeight;
|
|
ShowComponentTree := o.ShowComponentTree;
|
|
InfoBoxHeight := o.InfoBoxHeight;
|
|
end;
|
|
|
|
procedure TDesktopOIOptions.ExportSettingsToIDE(const AOptions: TEnvGuiOptions);
|
|
var
|
|
I: TObjectInspectorPage;
|
|
o: TOIOptions;
|
|
begin
|
|
o := AOptions.ObjectInspectorOptions;
|
|
for I in TObjectInspectorPage do
|
|
if FSplitterX[I]>=0 then
|
|
o.GridSplitterX[I] := Max(10, FSplitterX[I]);
|
|
|
|
o.ShowInfoBox := ShowInfoBox;
|
|
o.ShowComponentTree := ShowComponentTree;
|
|
if ComponentTreeHeight>=0 then
|
|
o.ComponentTreeHeight := Max(10, ComponentTreeHeight);
|
|
if InfoBoxHeight>=0 then
|
|
o.InfoBoxHeight := Max(10, InfoBoxHeight);
|
|
end;
|
|
|
|
procedure TDesktopOIOptions.Load(XMLConfig: TXMLConfig; Path: String);
|
|
var
|
|
I: TObjectInspectorPage;
|
|
begin
|
|
Path := Path + 'ObjectInspectorOptions/';
|
|
for I in TObjectInspectorPage do
|
|
FSplitterX[I] := XMLConfig.GetValue(Path+'SplitterX/'+DefaultOIPageNames[I]+'/Value',-1);
|
|
ShowComponentTree := XMLConfig.GetValue(Path+'ComponentTree/Show/Value',True);
|
|
ComponentTreeHeight := XMLConfig.GetValue(Path+'ComponentTree/Height/Value',-1);
|
|
ShowInfoBox := XMLConfig.GetValue(Path+'InfoBox/Show/Value',True);
|
|
InfoBoxHeight := XMLConfig.GetValue(Path+'InfoBox/Height/Value',-1);
|
|
end;
|
|
|
|
procedure TDesktopOIOptions.Save(XMLConfig: TXMLConfig; Path: String);
|
|
var
|
|
I: TObjectInspectorPage;
|
|
begin
|
|
Path := Path + 'ObjectInspectorOptions/';
|
|
for I in TObjectInspectorPage do
|
|
XMLConfig.SetDeleteValue(Path+'SplitterX/'+DefaultOIPageNames[I]+'/Value',FSplitterX[I],-1);
|
|
XMLConfig.SetDeleteValue(Path+'ComponentTree/Show/Value',ShowComponentTree,True);
|
|
XMLConfig.SetDeleteValue(Path+'ComponentTree/Height/Value',ComponentTreeHeight,-1);
|
|
XMLConfig.SetDeleteValue(Path+'InfoBox/Show/Value',ShowInfoBox,True);
|
|
XMLConfig.SetDeleteValue(Path+'InfoBox/Height/Value',InfoBoxHeight,-1);
|
|
end;
|
|
|
|
procedure TDesktopOIOptions.SetSplitterX(const APage: TObjectInspectorPage;
|
|
const ASplitterX: Integer);
|
|
begin
|
|
FSplitterX[APage] := ASplitterX;
|
|
end;
|
|
|
|
{ TDesktopOpt }
|
|
|
|
constructor TDesktopOpt.Create(const aName: String; const aIsDocked: Boolean);
|
|
begin
|
|
if aIsDocked and not Assigned(IDEDockMaster) then
|
|
raise Exception.Create('Internal error: TEnvironmentOptions.CreateDesktop cannot create docked desktop in undocked environment.');
|
|
|
|
inherited;
|
|
|
|
if aIsDocked then
|
|
FDockedOpt := IDEDockMaster.DockedDesktopOptClass.Create;
|
|
|
|
FSingleTaskBarButton:=false;
|
|
FHideIDEOnRun:=false;
|
|
FAutoAdjustIDEHeight:=true;
|
|
FAutoAdjustIDEHeightFullCompPal := true;
|
|
// window menu
|
|
FIDENameForDesignedFormList:=false;
|
|
// CompletionWindow
|
|
FCompletionWindowWidth := 320 * Screen.PixelsPerInch div 96;
|
|
FCompletionWindowHeight := 6;
|
|
// title
|
|
FIDETitleStartsWithProject:=true;
|
|
FIDETitleShowsBuildMode:=true;
|
|
FIDETitleShowsProjectDir:=true;
|
|
// IDE Coolbar
|
|
FIDECoolBarOptions:=TIDECoolBarOptions.Create;
|
|
// Editor Toolbar
|
|
FEditorToolBarOptions:=TEditorToolBarOptions.Create;
|
|
// component palette
|
|
FComponentPaletteOptions:=TCompPaletteOptions.Create;
|
|
// object inspector
|
|
FObjectInspectorOptions:=TDesktopOIOptions.Create;
|
|
// project inspector
|
|
FProjectInspectorShowProps := true;
|
|
// Windows layout
|
|
InitLayoutList;
|
|
|
|
FIDEDialogLayoutList:=TIDEDialogLayoutList.Create;
|
|
FIDEWindowCreatorsLayoutList:=TSimpleWindowLayoutList.Create(False);
|
|
FIDEDialogLayoutList.Assign(IDEWindowIntf.IDEDialogLayoutList);
|
|
FIDEWindowCreatorsLayoutList.CopyItemsFrom(IDEWindowIntf.IDEWindowCreators.SimpleLayoutStorage);
|
|
end;
|
|
|
|
destructor TDesktopOpt.Destroy;
|
|
begin
|
|
FreeAndNil(FComponentPaletteOptions);
|
|
FreeAndNil(FEditorToolBarOptions);
|
|
FreeAndNil(FIDECoolBarOptions);
|
|
FreeAndNil(FDockedOpt);
|
|
FreeAndNil(FObjectInspectorOptions);
|
|
|
|
FreeAndNil(FIDEDialogLayoutList);
|
|
FreeAndNil(FIDEWindowCreatorsLayoutList);
|
|
|
|
inherited Destroy;
|
|
end;
|
|
|
|
function TDesktopOpt.GetCompatible: Boolean;
|
|
begin
|
|
Result := (IsDocked = Assigned(IDEDockMaster));
|
|
end;
|
|
|
|
procedure TDesktopOpt.Assign(Source: TDesktopOpt; const AssignName: Boolean;
|
|
const IsCompatible: Boolean);
|
|
begin
|
|
if AssignName then
|
|
FName := Source.FName;
|
|
|
|
if IsCompatible and (Assigned(FDockedOpt) <> Assigned(Source.FDockedOpt)) then
|
|
raise Exception.Create('Internal error: TDesktopOpt.Assign mixed docked/undocked desktops.');
|
|
|
|
// window layout
|
|
if IsCompatible then
|
|
begin
|
|
FIDEWindowCreatorsLayoutList.CopyItemsFrom(Source.FIDEWindowCreatorsLayoutList);
|
|
FIDEDialogLayoutList.Assign(Source.FIDEDialogLayoutList);
|
|
FAssociatedDebugDesktopName := Source.FAssociatedDebugDesktopName;
|
|
end;
|
|
FSingleTaskBarButton := Source.FSingleTaskBarButton;
|
|
FHideIDEOnRun := Source.FHideIDEOnRun;
|
|
FAutoAdjustIDEHeight := Source.FAutoAdjustIDEHeight;
|
|
FAutoAdjustIDEHeightFullCompPal := Source.FAutoAdjustIDEHeightFullCompPal;
|
|
// window menu
|
|
FIDENameForDesignedFormList := Source.FIDENameForDesignedFormList;
|
|
// CompletionWindow
|
|
FCompletionWindowWidth := Source.FCompletionWindowWidth;
|
|
FCompletionWindowHeight := Source.FCompletionWindowHeight;
|
|
// title
|
|
FIDETitleStartsWithProject := Source.FIDETitleStartsWithProject;
|
|
FIDETitleShowsBuildMode := Source.FIDETitleShowsBuildMode;
|
|
FIDETitleShowsProjectDir := Source.FIDETitleShowsProjectDir;
|
|
// IDE Coolbar
|
|
FIDECoolBarOptions.Assign(Source.FIDECoolBarOptions);
|
|
// Editor Toolbar
|
|
FEditorToolBarOptions.Assign(Source.FEditorToolBarOptions);
|
|
// component palette
|
|
FComponentPaletteOptions.Assign(Source.FComponentPaletteOptions);
|
|
// object inspector
|
|
FObjectInspectorOptions.Assign(Source.FObjectInspectorOptions);
|
|
// project inspector
|
|
FProjectInspectorShowProps := Source.FProjectInspectorShowProps;
|
|
|
|
if IsCompatible and Assigned(FDockedOpt) then
|
|
FDockedOpt.Assign(Source.FDockedOpt);
|
|
end;
|
|
|
|
procedure TDesktopOpt.Load(Path: String);
|
|
begin
|
|
inherited;
|
|
|
|
// Windows layout
|
|
FIDEWindowCreatorsLayoutList.LoadFromConfig(FConfigStore, Path);
|
|
FIDEDialogLayoutList.LoadFromConfig(FConfigStore, Path+'Dialogs/');
|
|
|
|
FSingleTaskBarButton:=FXMLCfg.GetValue(Path+'SingleTaskBarButton/Value', False);
|
|
FHideIDEOnRun:=FXMLCfg.GetValue(Path+'HideIDEOnRun/Value',false);
|
|
FAutoAdjustIDEHeight:=FXMLCfg.GetValue(Path+'AutoAdjustIDEHeight/Value',true);
|
|
FAutoAdjustIDEHeightFullCompPal:=FXMLCfg.GetValue(Path+'AutoAdjustIDEHeightFullComponentPalette/Value',true);
|
|
// Window menu
|
|
FIDENameForDesignedFormList:=FXMLCfg.GetValue(Path+'IDENameForDesignedFormList/Value',false);
|
|
// title
|
|
FIDETitleStartsWithProject:=FXMLCfg.GetValue(Path+'IDETitleStartsWithProject/Value',true);
|
|
FIDETitleShowsBuildMode:=FXMLCfg.GetValue(Path+'IDETitleShowsBuildMode/Value',true);
|
|
FIDETitleShowsProjectDir:=FXMLCfg.GetValue(Path+'IDETitleShowsProjectDir/Value',true);
|
|
// CompletionWindow
|
|
FCompletionWindowWidth:=FXMLCfg.GetValue(Path+'CompletionWindowOptions/Width/Value', FCompletionWindowWidth);
|
|
FCompletionWindowHeight:=FXMLCfg.GetValue(Path+'CompletionWindowOptions/Height/Value', 6);
|
|
// Project Inspector
|
|
FProjectInspectorShowProps := FXMLCfg.GetValue(Path+'ProjectInspectorShowProps/Value', true);
|
|
|
|
if not FXMLCfg.HasPath(Path+'IDECoolBarOptions/', True) then
|
|
Path := ''; // Toolbars and palette were at the top level in XML.
|
|
// IDE Coolbar
|
|
FIDECoolBarOptions.Load(FXMLCfg, Path);
|
|
// Editor Toolbar
|
|
FEditorToolBarOptions.Load(FXMLCfg, Path);
|
|
// component palette
|
|
FComponentPaletteOptions.Load(FXMLCfg, Path);
|
|
// Object Inspector
|
|
FObjectInspectorOptions.Load(FXMLCfg, Path);
|
|
|
|
if Assigned(FDockedOpt) then
|
|
FDockedOpt.Load(Path, FXMLCfg);
|
|
end;
|
|
|
|
procedure TDesktopOpt.RestoreDesktop;
|
|
begin
|
|
IDEWindowCreators.RestoreSimpleLayout;
|
|
if Assigned(FDockedOpt) then
|
|
FDockedOpt.RestoreDesktop;
|
|
end;
|
|
|
|
procedure TDesktopOpt.Save(Path: String);
|
|
begin
|
|
// windows
|
|
FXMLCfg.SetDeleteValue(Path+'Name', FName, '');
|
|
if Assigned(FDockedOpt) then
|
|
FXMLCfg.SetDeleteValue(Path+'DockMaster', IDEDockMaster.ClassName, '')
|
|
else
|
|
FXMLCfg.DeleteValue(Path+'DockMaster');
|
|
|
|
FIDEWindowCreatorsLayoutList.SaveToConfig(FConfigStore, Path);
|
|
FIDEDialogLayoutList.SaveToConfig(FConfigStore,Path+'Dialogs/');
|
|
|
|
FXMLCfg.SetDeleteValue(Path+'AssociatedDebugDesktopName/Value', FAssociatedDebugDesktopName, '');
|
|
FXMLCfg.SetDeleteValue(Path+'SingleTaskBarButton/Value',FSingleTaskBarButton, False);
|
|
FXMLCfg.SetDeleteValue(Path+'HideIDEOnRun/Value',FHideIDEOnRun,false);
|
|
FXMLCfg.SetDeleteValue(Path+'AutoAdjustIDEHeight/Value',FAutoAdjustIDEHeight,true);
|
|
FXMLCfg.SetDeleteValue(Path+'AutoAdjustIDEHeightFullComponentPalette/Value',
|
|
FAutoAdjustIDEHeightFullCompPal,true);
|
|
// Window menu
|
|
FXMLCfg.SetDeleteValue(Path+'IDENameForDesignedFormList/Value',FIDENameForDesignedFormList,false);
|
|
// title
|
|
FXMLCfg.SetDeleteValue(Path+'IDETitleStartsWithProject/Value',FIDETitleStartsWithProject,true);
|
|
FXMLCfg.SetDeleteValue(Path+'IDETitleShowsBuildMode/Value',FIDETitleShowsBuildMode,true);
|
|
FXMLCfg.SetDeleteValue(Path+'IDETitleShowsProjectDir/Value',FIDETitleShowsProjectDir,true);
|
|
// CompletionWindow
|
|
FXMLCfg.SetValue(Path+'CompletionWindowOptions/Width/Value',FCompletionWindowWidth);
|
|
FXMLCfg.SetDeleteValue(Path+'CompletionWindowOptions/Height/Value',FCompletionWindowHeight, 6);
|
|
// Project Inspector
|
|
FXMLCfg.SetDeleteValue(Path+'ProjectInspectorShowProps/Value', FProjectInspectorShowProps, true);
|
|
// IDE Coolbar
|
|
FIDECoolBarOptions.Save(FXMLCfg, Path);
|
|
// Editor Toolbar
|
|
FEditorToolBarOptions.Save(FXMLCfg, Path);
|
|
// component palette
|
|
FComponentPaletteOptions.Save(FXMLCfg, Path);
|
|
// Object Inspector
|
|
FObjectInspectorOptions.Save(FXMLCfg, Path);
|
|
|
|
if Assigned(FDockedOpt) then
|
|
FDockedOpt.Save(Path, FXMLCfg);
|
|
end;
|
|
|
|
procedure TDesktopOpt.ImportSettingsFromIDE(const AOptions: TEnvGuiOptions);
|
|
begin
|
|
IDEWindowIntf.IDEWindowCreators.SimpleLayoutStorage.StoreWindowPositions;
|
|
FIDEDialogLayoutList.Assign(IDEWindowIntf.IDEDialogLayoutList);
|
|
FIDEWindowCreatorsLayoutList.CopyItemsFrom(IDEWindowIntf.IDEWindowCreators.SimpleLayoutStorage);
|
|
FObjectInspectorOptions.ImportSettingsFromIDE(AOptions);
|
|
|
|
if Assigned(FDockedOpt) then
|
|
FDockedOpt.ImportSettingsFromIDE;
|
|
end;
|
|
|
|
procedure TDesktopOpt.ExportSettingsToIDE(const AOptions: TEnvGuiOptions);
|
|
var
|
|
ComplForm: TCustomForm;
|
|
begin
|
|
if Assigned(FDockedOpt) then
|
|
FDockedOpt.ExportSettingsToIDE;
|
|
|
|
IDEWindowIntf.IDEDialogLayoutList.Assign(FIDEDialogLayoutList);
|
|
IDEWindowIntf.IDEWindowCreators.SimpleLayoutStorage.CopyItemsFrom(FIDEWindowCreatorsLayoutList);
|
|
FObjectInspectorOptions.ExportSettingsToIDE(AOptions);
|
|
if Assigned(SourceEditorManagerIntf) then
|
|
begin
|
|
ComplForm := SourceEditorManagerIntf.DefaultSynCompletionForm;
|
|
if Assigned(ComplForm) then
|
|
ComplForm.Width := Max(50, CompletionWindowWidth);
|
|
SourceEditorManagerIntf.SynCompletionLinesInWindow := Max(3, CompletionWindowHeight);
|
|
end;
|
|
end;
|
|
|
|
procedure InitLayoutHelper(const FormID: string);
|
|
begin
|
|
with IDEWindowCreators.SimpleLayoutStorage do
|
|
if not Assigned(ItemByFormID(FormID)) then
|
|
CreateWindowLayout(FormID);
|
|
end;
|
|
|
|
procedure TDesktopOpt.InitLayoutList;
|
|
var
|
|
l: TNonModalIDEWindow;
|
|
begin
|
|
for l:=Low(TNonModalIDEWindow) to High(TNonModalIDEWindow) do
|
|
if l<>nmiwNone then
|
|
InitLayoutHelper(NonModalIDEWindowNames[l]);
|
|
InitLayoutHelper(DefaultObjectInspectorName);
|
|
end;
|
|
|
|
{ TUnsupportedDesktopOpt }
|
|
|
|
destructor TUnsupportedDesktopOpt.Destroy;
|
|
begin
|
|
freeandnil(FRetainXMLData);
|
|
inherited Destroy;
|
|
end;
|
|
|
|
procedure TUnsupportedDesktopOpt.Load(Path: string);
|
|
var
|
|
lPnode, lChldNode: TDOMNode;
|
|
begin
|
|
inherited;
|
|
|
|
FreeAndNil(FRetainXMLData);
|
|
FRetainXMLData := TDOMDocument.Create;
|
|
lPnode := FXMLCfg.FindNode(Path, False);
|
|
lChldNode := lPnode.CloneNode(True, FRetainXMLData);
|
|
FRetainXMLData.AppendChild(lChldNode);
|
|
end;
|
|
|
|
procedure TUnsupportedDesktopOpt.Save(Path: string);
|
|
var
|
|
lChldNode, lChCh: TDOMNode;
|
|
lsNodeName: DOMString;
|
|
lParentNode: TDOMNode;
|
|
PathM1, PreD, LastD: String;
|
|
begin
|
|
if Assigned(FRetainXMLData) then
|
|
begin
|
|
PathM1 := copy(Path, 1, length(Path) - 1);
|
|
PreD := ExtractFilePath(PathM1);
|
|
LastD := ExtractFileNameOnly(PathM1);
|
|
lParentNode:= FXMLCfg.FindNode(path, False);
|
|
lChldNode := FRetainXMLData.FirstChild.CloneNode(True, FXMLCfg.Document);
|
|
lsNodeName := lChldNode.NodeName;
|
|
if LastD = lsNodeName then
|
|
FXMLCfg.FindNode(PreD,False).ReplaceChild(lChldNode,FXMLCfg.FindNode(Path,False))
|
|
else
|
|
begin
|
|
try
|
|
if not assigned(lParentNode) then
|
|
begin
|
|
lParentNode:=FXMLCfg.Document.CreateElement(LastD);
|
|
FXMLCfg.FindNode(PreD, False).AppendChild(lParentNode);
|
|
end;
|
|
while lChldNode.HasChildNodes do
|
|
begin
|
|
lChCh := lChldNode.FirstChild;
|
|
lChldNode.DetachChild(lChCh);
|
|
lParentNode.AppendChild(lChCh);
|
|
end;
|
|
finally
|
|
FreeAndNil(lChldNode);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
{ TDesktopOptList }
|
|
|
|
constructor TDesktopOptList.Create;
|
|
begin
|
|
inherited Create;
|
|
end;
|
|
|
|
destructor TDesktopOptList.Destroy;
|
|
begin
|
|
inherited Destroy;
|
|
end;
|
|
|
|
procedure TDesktopOptList.SetConfig(aXMLCfg: TRttiXMLConfig; aConfigStore: TXMLOptionsStorage);
|
|
begin
|
|
FXMLCfg := aXMLCfg;
|
|
FConfigStore := aConfigStore;
|
|
end;
|
|
|
|
procedure TDesktopOptList.AddFromCfg(Path: String);
|
|
var
|
|
dsk: TCustomDesktopOpt;
|
|
dskClass: TDesktopOptClass;
|
|
dskName, dskDockMaster: String;
|
|
begin
|
|
dskName := FXMLCfg.GetValue(Path+'Name', 'default');
|
|
dskDockMaster := FXMLCfg.GetValue(Path+'DockMaster', '');
|
|
|
|
if IndexOf(dskname) >=0 then
|
|
exit;
|
|
|
|
if TEnvGuiOptions.DesktopCanBeLoaded(dskDockMaster) then
|
|
dskClass := TDesktopOpt
|
|
else
|
|
dskClass := TUnsupportedDesktopOpt;
|
|
|
|
dsk := dskClass.Create(dskName, dskDockMaster<>'');
|
|
dsk.SetConfig(FXMLCfg, FConfigStore);
|
|
dsk.Load(Path);
|
|
Add(dsk);
|
|
end;
|
|
|
|
function TDesktopOptList.IndexOf(aName: string): integer;
|
|
begin
|
|
Result:=Count-1;
|
|
while (Result>=0)
|
|
and (CompareText(aName, Items[Result].Name)<>0) do
|
|
dec(Result);
|
|
end;
|
|
|
|
function TDesktopOptList.Find(aName: string): TCustomDesktopOpt;
|
|
var
|
|
i: LongInt;
|
|
begin
|
|
i:=IndexOf(aName);
|
|
if i>=0 then
|
|
Result:=Items[i]
|
|
else
|
|
Result:=nil;
|
|
end;
|
|
|
|
function TDesktopOptList.GetItem(Index: Integer): TCustomDesktopOpt;
|
|
begin
|
|
Result := TCustomDesktopOpt(inherited Items[Index]);
|
|
end;
|
|
|
|
{ TEnvGuiOptions }
|
|
|
|
constructor TEnvGuiOptions.Create;
|
|
var
|
|
c: TMsgWndColor;
|
|
u: TMessageLineUrgency;
|
|
begin
|
|
FShowHintsForComponentPalette:=true;
|
|
FShowHintsForMainSpeedButtons:=true;
|
|
// glyphs
|
|
FShowButtonGlyphs := sbgSystem;
|
|
FShowMenuGlyphs := sbgSystem;
|
|
// designer
|
|
FShowGrid:=true;
|
|
FShowBorderSpacing:=false;
|
|
FBorderSpacingColor:=DefaultBorderSpacingColor;
|
|
FGridColor:=DefaultGridColor;
|
|
FSnapToGrid:=true;
|
|
FGridSizeX:=DefaultGridSize;
|
|
FGridSizeY:=DefaultGridSize;
|
|
FShowGuideLines:=true;
|
|
FSnapToGuideLines:=true;
|
|
FGuideLineColorLeftTop:=DefaultGuideLineColorLeftTop;
|
|
FGuideLineColorRightBottom:=DefaultGuideLineColorRightBottom;
|
|
FShowComponentCaptions:=false;
|
|
FShowEditorHints:=true;
|
|
FAutoCreateFormsOnOpen:=true;
|
|
FCheckPackagesOnFormCreate:=true;
|
|
FRightClickSelects:=true;
|
|
FGrabberColor:=clBlack;
|
|
FMarkerColor:=clDkGray;
|
|
FNonFormBackgroundColor:=clWindow;
|
|
FRubberbandSelectionColor:=clNavy;
|
|
FRubberbandCreationColor:=clMaroon;
|
|
FRubberbandSelectsGrandChilds:=DefaultRubberbandSelectsGrandChilds;
|
|
FCreateComponentFocusNameProperty:=false;
|
|
FSwitchToFavoritesOITab:=false;
|
|
FFormTitleBarChangesObjectInspector:=false;
|
|
FForceDPIScalingInDesignTime:=true;
|
|
// object inspector
|
|
FObjectInspectorOptions:=TOIOptions.Create;
|
|
// messages view
|
|
fMsgViewDblClickJumps:=true;
|
|
fMsgViewFocus:=DefaultMsgViewFocus;
|
|
FShowMessagesIcons:=true;
|
|
FMsgViewStayOnTop:=false;
|
|
FMsgViewShowTranslations:=false;
|
|
FMsgViewAlwaysDrawFocused:=false;
|
|
FMsgViewFilenameStyle:=mwfsShort;
|
|
for c:=low(TMsgWndColor) to high(TMsgWndColor) do
|
|
fMsgViewColors[c]:=MsgWndDefaultColors[c];
|
|
for u:=low(TMessageLineUrgency) to high(TMessageLineUrgency) do
|
|
fMsgColors[u] := clDefault;
|
|
FMsgViewFilters:=TLMsgViewFilters.Create(nil);
|
|
// Desktop collection
|
|
FDesktops := TDesktopOptList.Create;
|
|
// FDesktop points to the IDE properties
|
|
FDesktop := TDesktopOpt.Create('');
|
|
FAutoSaveActiveDesktop := True;
|
|
end;
|
|
|
|
destructor TEnvGuiOptions.Destroy;
|
|
begin
|
|
FreeAndNil(FDesktop);
|
|
FreeAndNil(FDesktops);
|
|
FreeAndNil(FMsgViewFilters);
|
|
FreeAndNil(FObjectInspectorOptions);
|
|
FreeAndNil(FConfigStorage);
|
|
inherited Destroy;
|
|
end;
|
|
|
|
procedure TEnvGuiOptions.ReadFromXml(OnlyDesktop: boolean);
|
|
var
|
|
mwc: TMsgWndColor;
|
|
Rec: PIDEOptionsGroupRec;
|
|
Path, CurPath, NodeName: String;
|
|
u: TMessageLineUrgency;
|
|
i, j: Integer;
|
|
begin
|
|
Path:='EnvironmentOptions/';
|
|
// hints
|
|
FShowHintsForComponentPalette:=XMLCfg.GetValue(Path+'ShowHintsForComponentPalette/Value',true);
|
|
FShowHintsForMainSpeedButtons:=XMLCfg.GetValue(Path+'ShowHintsForMainSpeedButtons/Value',true);
|
|
// glyphs
|
|
FShowButtonGlyphs := TApplicationShowGlyphs(XMLCfg.GetValue(Path+'ShowButtonGlyphs/Value',
|
|
Ord(sbgSystem)));
|
|
FShowMenuGlyphs := TApplicationShowGlyphs(XMLCfg.GetValue(Path+'ShowMenuGlyphs/Value',
|
|
Ord(sbgSystem)));
|
|
// form editor
|
|
FShowGrid:=XMLCfg.GetValue(Path+'FormEditor/ShowGrid',true);
|
|
FShowBorderSpacing:=XMLCfg.GetValue(Path+'FormEditor/ShowBorderSpacing',false);
|
|
FBorderSpacingColor:=XMLCfg.GetValue(Path+'FormEditor/BorderSpacingColor',DefaultBorderSpacingColor);
|
|
FGridColor:=XMLCfg.GetValue(Path+'FormEditor/GridColor',DefaultGridColor);
|
|
FSnapToGrid:=XMLCfg.GetValue(Path+'FormEditor/SnapToGrid',true);
|
|
FGridSizeX:=XMLCfg.GetValue(Path+'FormEditor/GridSizeX',DefaultGridSize);
|
|
FGridSizeY:=XMLCfg.GetValue(Path+'FormEditor/GridSizeY',DefaultGridSize);
|
|
FShowGuideLines:=XMLCfg.GetValue(Path+'FormEditor/ShowGuideLines',true);
|
|
FSnapToGuideLines:=XMLCfg.GetValue(Path+'FormEditor/SnapToGuideLines',true);
|
|
FGuideLineColorLeftTop:=XMLCfg.GetValue(Path+'FormEditor/GuideLineColorLeftTop',
|
|
DefaultGuideLineColorLeftTop);
|
|
FGuideLineColorRightBottom:=XMLCfg.GetValue(Path+'FormEditor/GuideLineColorRightBottom',
|
|
DefaultGuideLineColorRightBottom);
|
|
FShowComponentCaptions:=XMLCfg.GetValue(Path+'FormEditor/ShowComponentCaptions',true);
|
|
FShowEditorHints:=XMLCfg.GetValue(Path+'FormEditor/ShowEditorHints',true);
|
|
FAutoCreateFormsOnOpen:=XMLCfg.GetValue(Path+'FormEditor/AutoCreateFormsOnOpen',true);
|
|
FCheckPackagesOnFormCreate:=XMLCfg.GetValue(Path+'FormEditor/CheckPackagesOnFormCreate',true);
|
|
FRightClickSelects:=XMLCfg.GetValue(Path+'FormEditor/RightClickSelects',true);
|
|
FGrabberColor:=XMLCfg.GetValue(Path+'FormEditor/GrabberColor/Value',FGrabberColor);
|
|
FMarkerColor:=XMLCfg.GetValue(Path+'FormEditor/MarkerColor/Value',FMarkerColor);
|
|
FNonFormBackgroundColor:=XMLCfg.GetValue(Path+'FormEditor/NonFormBackgroundColor/Value',FNonFormBackgroundColor);
|
|
FRubberbandSelectionColor:=XMLCfg.GetValue(Path+'FormEditor/Rubberband/SelectionColor/Value',
|
|
FRubberbandSelectionColor);
|
|
FRubberbandCreationColor:=XMLCfg.GetValue(Path+'FormEditor/Rubberband/CreationColor/Value',
|
|
FRubberbandCreationColor);
|
|
FRubberbandSelectsGrandChilds:=XMLCfg.GetValue(Path+'FormEditor/Rubberband/SelectsGrandChilds/Value',DefaultRubberbandSelectsGrandChilds);
|
|
FCreateComponentFocusNameProperty:=XMLCfg.GetValue(
|
|
Path+'FormEditor/CreateComponentFocusNameProperty/Value',false);
|
|
FSwitchToFavoritesOITab:=XMLCfg.GetValue(Path+'FormEditor/SwitchToFavoritesOITab/Value',false);
|
|
FFormTitleBarChangesObjectInspector:=XMLCfg.GetValue(Path+'FormEditor/FormTitleBarChangesObjectInspector/Value',false);
|
|
FForceDPIScalingInDesignTime:=XMLCfg.GetValue(Path+'FormEditor/ForceDPIScalingInDesignTime/Value',true);
|
|
// component list
|
|
FComponentListKeepOpen:=XMLCfg.GetValue(Path+'ComponentList/KeepOpen',false);
|
|
FComponentListPageIndex:=XMLCfg.GetValue(Path+'ComponentList/PageIndex',0);
|
|
// search result view
|
|
FSearchResultViewPathStyle:=StrToMsgWndFilenameStyle(XMLCfg.GetValue(
|
|
Path+'SearchResultView/PathStyle',MsgWndFileNameStyleNames[mwfsRelative]));
|
|
// object inspector
|
|
FObjectInspectorOptions.Load;
|
|
FObjectInspectorOptions.SaveBounds:=false;
|
|
// messages view
|
|
fMsgViewDblClickJumps:=XMLCfg.GetValue(Path+'MsgViewDblClickJumps/Value',false);
|
|
fMsgViewFocus:=XMLCfg.GetValue(Path+'MsgViewFocus/Value',DefaultMsgViewFocus);
|
|
FShowMessagesIcons:=XMLCfg.GetValue(Path+'MsgView/ShowMessagesIcons/Value',true);
|
|
FMsgViewStayOnTop:=XMLCfg.GetValue(Path+'MsgView/StayOnTop/Value',false);
|
|
FMsgViewShowTranslations:=XMLCfg.GetValue(Path+'MsgView/ShowTranslations/Value',false);
|
|
FMsgViewAlwaysDrawFocused:=XMLCfg.GetValue(Path+'MsgView/AlwaysDrawFocused/Value',false);
|
|
FMsgViewFilenameStyle:=StrToMsgWndFilenameStyle(XMLCfg.GetValue(
|
|
Path+'MsgView/Filename/Style',MsgWndFileNameStyleNames[mwfsShort]));
|
|
for mwc:=low(TMsgWndColor) to high(TMsgWndColor) do
|
|
fMsgViewColors[mwc]:=XMLCfg.GetValue(
|
|
Path+'MsgView/Colors/'+MsgWndColorNames[mwc],MsgWndDefaultColors[mwc]);
|
|
for u:=low(TMessageLineUrgency) to high(TMessageLineUrgency) do
|
|
fMsgColors[u] := XMLCfg.GetValue(
|
|
Path+'MsgView/MsgColors/'+dbgs(u),clDefault);
|
|
FMsgViewFilters.LoadFromXMLConfig(XMLCfg,'MsgView/Filters/');
|
|
// IDEEditorGroups
|
|
for i := 0 to IDEEditorGroups.Count-1 do
|
|
begin
|
|
Rec := IDEEditorGroups[i];
|
|
NodeName := Rec^.GroupClass.ClassName;
|
|
Rec^.Collapsed := XMLCfg.GetValue(Path+'OptionDialog/Tree/' + NodeName + '/Value',
|
|
Rec^.DefaultCollapsed);
|
|
if Rec^.Items <> nil then begin
|
|
for j := 0 to Rec^.Items.Count-1 do begin
|
|
Rec^.Items[j]^.Collapsed := XMLCfg.GetValue(Path+'OptionDialog/Tree/' + NodeName
|
|
+ '/' + Rec^.Items[j]^.EditorClass.ClassName + '/Value',
|
|
Rec^.Items[j]^.DefaultCollapsed);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
// auto save
|
|
FAutoSaveActiveDesktop:=XMLCfg.GetValue(Path+'AutoSave/ActiveDesktop',True);
|
|
|
|
// The user can define many desktops. They are saved under path Desktops/.
|
|
FDesktops.Clear;
|
|
FDesktops.SetConfig(XMLCfg, FConfigStorage);
|
|
FActiveDesktopName := '';
|
|
if Version<109 then begin
|
|
//load old default desktop - backwards compatibility - or create a new default desktop
|
|
CurPath := 'Desktop/'; // New place: Desktop/
|
|
if not XMLCfg.HasPath(CurPath, True) then
|
|
CurPath := Path+'Desktop/'; // Old place: EnvironmentOptions/Desktop/
|
|
if XMLCfg.HasPath(CurPath, True) or//default desktop exists in the settings
|
|
((ActiveDesktop.IDECoolBarOptions.ToolBars.Count = 0) and
|
|
(ActiveDesktop.FIDEDialogLayoutList.Count = 0))//desktop is empty, load it to recreate!
|
|
then
|
|
begin
|
|
ActiveDesktop.SetConfig(XMLCfg, FConfigStorage);
|
|
ActiveDesktop.Load(CurPath);
|
|
end;
|
|
end else begin
|
|
CurPath := 'Desktops/';
|
|
FDebugDesktopName := XMLCfg.GetValue(CurPath+'DebugDesktop', '');
|
|
FActiveDesktopName := XMLCfg.GetValue(CurPath+'ActiveDesktop', '');
|
|
j := XMLCfg.GetValue(CurPath+'Count', 1);
|
|
for i := 1 to j do
|
|
FDesktops.AddFromCfg(CurPath+'Desktop'+IntToStr(i)+'/');
|
|
end;
|
|
if Version<=109 then begin
|
|
XMLCfg.DeletePath('Desktop');
|
|
XMLCfg.DeletePath(CurPath+'Desktop');
|
|
end;
|
|
FDesktop.Assign(ActiveDesktop, False);
|
|
FDesktop.ExportSettingsToIDE(Self);
|
|
end;
|
|
|
|
procedure TEnvGuiOptions.WriteToXml(OnlyDesktop: boolean);
|
|
var
|
|
mwc: TMsgWndColor;
|
|
Rec: PIDEOptionsGroupRec;
|
|
Path, CurPath, NodeName: String;
|
|
u: TMessageLineUrgency;
|
|
i, j: Integer;
|
|
xSaveDesktop: TCustomDesktopOpt;
|
|
xActiveDesktopName: string;
|
|
begin
|
|
Path:='EnvironmentOptions/';
|
|
// hints
|
|
XMLCfg.SetDeleteValue(Path+'ShowHintsForComponentPalette/Value',FShowHintsForComponentPalette,true);
|
|
XMLCfg.SetDeleteValue(Path+'ShowHintsForMainSpeedButtons/Value',FShowHintsForMainSpeedButtons,true);
|
|
// glyphs
|
|
XMLCfg.SetDeleteValue(Path+'ShowButtonGlyphs/Value',Ord(FShowButtonGlyphs), Ord(sbgSystem));
|
|
XMLCfg.SetDeleteValue(Path+'ShowMenuGlyphs/Value',Ord(FShowMenuGlyphs), Ord(sbgSystem));
|
|
// form editor
|
|
XMLCfg.SetDeleteValue(Path+'FormEditor/ShowBorderSpacing',FShowBorderSpacing,false);
|
|
XMLCfg.SetDeleteValue(Path+'FormEditor/BorderSpacingColor',FBorderSpacingColor,DefaultBorderSpacingColor);
|
|
XMLCfg.SetDeleteValue(Path+'FormEditor/ShowGrid',FShowGrid,true);
|
|
XMLCfg.SetDeleteValue(Path+'FormEditor/GridColor',FGridColor,DefaultGridColor);
|
|
XMLCfg.SetDeleteValue(Path+'FormEditor/SnapToGrid',FSnapToGrid,true);
|
|
XMLCfg.SetDeleteValue(Path+'FormEditor/GridSizeX',FGridSizeX,DefaultGridSize);
|
|
XMLCfg.SetDeleteValue(Path+'FormEditor/GridSizeY',FGridSizeY,DefaultGridSize);
|
|
XMLCfg.SetDeleteValue(Path+'FormEditor/ShowGuideLines',FShowGuideLines,true);
|
|
XMLCfg.SetDeleteValue(Path+'FormEditor/SnapToGuideLines',FSnapToGuideLines,true);
|
|
XMLCfg.SetDeleteValue(Path+'FormEditor/GuideLineColorLeftTop',FGuideLineColorLeftTop,DefaultGuideLineColorLeftTop);
|
|
XMLCfg.SetDeleteValue(Path+'FormEditor/GuideLineColorRightBottom',FGuideLineColorRightBottom,DefaultGuideLineColorRightBottom);
|
|
XMLCfg.SetDeleteValue(Path+'FormEditor/ShowComponentCaptions',FShowComponentCaptions,true);
|
|
XMLCfg.SetDeleteValue(Path+'FormEditor/ShowEditorHints',FShowEditorHints,true);
|
|
XMLCfg.SetDeleteValue(Path+'FormEditor/AutoCreateFormsOnOpen',FAutoCreateFormsOnOpen,true);
|
|
XMLCfg.SetDeleteValue(Path+'FormEditor/CheckPackagesOnFormCreate',FCheckPackagesOnFormCreate,true);
|
|
XMLCfg.SetDeleteValue(Path+'FormEditor/RightClickSelects',FRightClickSelects,true);
|
|
XMLCfg.SetDeleteValue(Path+'FormEditor/GrabberColor/Value',FGrabberColor,clBlack);
|
|
XMLCfg.SetDeleteValue(Path+'FormEditor/MarkerColor/Value',FMarkerColor,clDkGray);
|
|
XMLCfg.SetDeleteValue(Path+'FormEditor/NonFormBackgroundColor/Value',FNonFormBackgroundColor,clWindow);
|
|
XMLCfg.SetDeleteValue(Path+'FormEditor/Rubberband/SelectionColor/Value',
|
|
FRubberbandSelectionColor,clBlack);
|
|
XMLCfg.SetDeleteValue(Path+'FormEditor/Rubberband/CreationColor/Value',
|
|
FRubberbandCreationColor,clRed);
|
|
XMLCfg.SetDeleteValue(Path+'FormEditor/Rubberband/SelectsGrandChilds/Value',
|
|
FRubberbandSelectsGrandChilds,DefaultRubberbandSelectsGrandChilds);
|
|
XMLCfg.SetDeleteValue(Path+'FormEditor/CreateComponentFocusNameProperty/Value',
|
|
FCreateComponentFocusNameProperty,false);
|
|
XMLCfg.SetDeleteValue(Path+'FormEditor/SwitchToFavoritesOITab/Value',FSwitchToFavoritesOITab,false);
|
|
XMLCfg.SetDeleteValue(Path+'FormEditor/FormTitleBarChangesObjectInspector/Value',FFormTitleBarChangesObjectInspector,false);
|
|
XMLCfg.SetDeleteValue(Path+'FormEditor/ForceDPIScalingInDesignTime/Value',FForceDPIScalingInDesignTime,true);
|
|
// component list
|
|
XMLCfg.SetDeleteValue(Path+'ComponentList/KeepOpen',FComponentListKeepOpen,false);
|
|
XMLCfg.SetDeleteValue(Path+'ComponentList/PageIndex',FComponentListPageIndex,0);
|
|
// search result view
|
|
XMLCfg.SetDeleteValue(Path+'SearchResultView/PathStyle',
|
|
MsgWndFileNameStyleNames[FSearchResultViewPathStyle],
|
|
MsgWndFileNameStyleNames[mwfsRelative]);
|
|
// object inspector
|
|
FObjectInspectorOptions.SaveBounds:=false;
|
|
FObjectInspectorOptions.Save;
|
|
// messages view
|
|
XMLCfg.SetDeleteValue(Path+'MsgViewDblClickJumps/Value',fMsgViewDblClickJumps,false);
|
|
XMLCfg.SetDeleteValue(Path+'MsgViewFocus/Value',fMsgViewFocus,DefaultMsgViewFocus);
|
|
XMLCfg.SetDeleteValue(Path+'MsgView/ShowMessagesIcons/Value',FShowMessagesIcons,true);
|
|
XMLCfg.SetDeleteValue(Path+'MsgView/StayOnTop/Value',FMsgViewStayOnTop,false);
|
|
XMLCfg.SetDeleteValue(Path+'MsgView/ShowTranslations/Value',FMsgViewShowTranslations,false);
|
|
XMLCfg.SetDeleteValue(Path+'MsgView/AlwaysDrawFocused/Value',FMsgViewAlwaysDrawFocused,false);
|
|
XMLCfg.SetDeleteValue(Path+'MsgView/Filename/Style',
|
|
MsgWndFileNameStyleNames[FMsgViewFilenameStyle],
|
|
MsgWndFileNameStyleNames[mwfsShort]);
|
|
for mwc:=low(TMsgWndColor) to high(TMsgWndColor) do
|
|
XMLCfg.SetDeleteValue(Path+'MsgView/Colors/'+MsgWndColorNames[mwc],
|
|
fMsgViewColors[mwc],MsgWndDefaultColors[mwc]);
|
|
for u:=low(TMessageLineUrgency) to high(TMessageLineUrgency) do
|
|
XMLCfg.SetDeleteValue(Path+'MsgView/MsgColors/'+dbgs(u),
|
|
fMsgColors[u],clDefault);
|
|
MsgViewFilters.SaveToXMLConfig(XMLCfg,'MsgView/Filters/');
|
|
// IDEEditorGroups
|
|
for i := 0 to IDEEditorGroups.Count-1 do
|
|
begin
|
|
Rec := IDEEditorGroups[i];
|
|
NodeName := Rec^.GroupClass.ClassName;
|
|
XMLCfg.SetDeleteValue(Path+'OptionDialog/Tree/' + NodeName + '/Value',
|
|
Rec^.Collapsed,
|
|
Rec^.DefaultCollapsed);
|
|
if Rec^.Items <> nil then begin
|
|
for j := 0 to Rec^.Items.Count-1 do begin
|
|
XMLCfg.SetDeleteValue(Path+'OptionDialog/Tree/' + NodeName
|
|
+ '/' + Rec^.Items[j]^.EditorClass.ClassName + '/Value',
|
|
Rec^.Items[j]^.Collapsed,
|
|
Rec^.Items[j]^.DefaultCollapsed);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
// auto save
|
|
XMLCfg.SetDeleteValue(Path+'AutoSave/ActiveDesktop', FAutoSaveActiveDesktop, True);
|
|
|
|
//automatically save active desktops
|
|
if AutoSaveActiveDesktop
|
|
and (Application.MainForm<>nil) and Application.MainForm.Visible then
|
|
begin
|
|
//save active desktop
|
|
FDesktop.ImportSettingsFromIDE(Self);
|
|
ActiveDesktop.Assign(FDesktop);
|
|
if Assigned(FLastDesktopBeforeDebug) then//are we in debug session?
|
|
begin
|
|
//save last desktop before the debug desktop
|
|
xSaveDesktop := FDesktops.Find(FLastDesktopBeforeDebug.Name);
|
|
if Assigned(xSaveDesktop) and xSaveDesktop.InheritsFrom(TDesktopOpt) then
|
|
TDesktopOpt(xSaveDesktop).Assign(FLastDesktopBeforeDebug, False);
|
|
end;
|
|
end;
|
|
if Assigned(FLastDesktopBeforeDebug) then
|
|
xActiveDesktopName := FLastDesktopBeforeDebug.Name
|
|
else
|
|
xActiveDesktopName := FActiveDesktopName;
|
|
// The user can define many desktops. They are saved under path Desktops/.
|
|
XMLCfg.DeletePath('Desktops/');
|
|
CurPath:='Desktops/';
|
|
XMLCfg.SetDeleteValue(CurPath+'Count', FDesktops.Count, 0);
|
|
XMLCfg.SetDeleteValue(CurPath+'DebugDesktop', FDebugDesktopName, '');
|
|
XMLCfg.SetDeleteValue(CurPath+'ActiveDesktop', xActiveDesktopName, '');
|
|
for i := 0 to FDesktops.Count-1 do
|
|
begin
|
|
FDesktops[i].SetConfig(XMLCfg, FConfigStorage);
|
|
FDesktops[i].Save(CurPath+'Desktop'+IntToStr(i+1)+'/');
|
|
end;
|
|
end;
|
|
|
|
procedure TEnvGuiOptions.InitConfig;
|
|
begin
|
|
FreeAndNil(FConfigStorage);
|
|
FConfigStorage:=TXMLOptionsStorage.Create(XMLCfg);
|
|
ObjectInspectorOptions.ConfigStore:=FConfigStorage;
|
|
end;
|
|
|
|
function _ContainsControl(const _Parent, _Control: TWinControl): Boolean;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to _Parent.ControlCount-1 do
|
|
if _Parent.Controls[I] is TWinControl then
|
|
if (_Parent.Controls[I] = _Control)
|
|
or _ContainsControl(TWinControl(_Parent.Controls[I]), _Control)
|
|
then
|
|
Exit(True);
|
|
Result := False;
|
|
end;
|
|
|
|
procedure TEnvGuiOptions.UseDesktop(ADesktop: TDesktopOpt);
|
|
var
|
|
xLastFocusControl: TWinControl;
|
|
xLastFocusForm: TCustomForm;
|
|
s: String;
|
|
begin
|
|
xLastFocusControl := Screen.ActiveControl;
|
|
xLastFocusForm := Screen.ActiveCustomForm;
|
|
// needed to get EditorToolBar refreshed! - needed only here in UseDesktop()
|
|
EnvironmentOptions.DoBeforeWrite(False);
|
|
|
|
Desktop.Assign(ADesktop);
|
|
ActiveDesktopName := ADesktop.Name;
|
|
s := ADesktop.AssociatedDebugDesktopName;
|
|
if (s<>'') and Assigned(Desktops.Find(s)) then
|
|
DebugDesktopName := s;
|
|
Desktop.ExportSettingsToIDE(Self);
|
|
|
|
EnvironmentOptions.DoAfterWrite(False); // needed to get EditorToolBar refreshed!
|
|
Desktop.RestoreDesktop;
|
|
|
|
//set focus back to the previously focused control
|
|
if Screen.CustomFormIndex(xLastFocusForm) >= 0 then
|
|
begin //check if form or control hasn't been destroyed
|
|
if ((xLastFocusForm = xLastFocusControl) or _ContainsControl(xLastFocusForm, xLastFocusControl))
|
|
and xLastFocusForm.CanFocus
|
|
and xLastFocusControl.CanFocus
|
|
then
|
|
xLastFocusControl.SetFocus;
|
|
end;
|
|
end;
|
|
|
|
procedure TEnvGuiOptions.EnableDebugDesktop;
|
|
begin
|
|
if not Assigned(LastDesktopBeforeDebug)
|
|
and Assigned(DebugDesktop)
|
|
and (DebugDesktop <> ActiveDesktop) then
|
|
begin
|
|
LastDesktopBeforeDebug := TDesktopOpt.Create(ActiveDesktopName);
|
|
if AutoSaveActiveDesktop then
|
|
Desktop.ImportSettingsFromIDE(Self);
|
|
LastDesktopBeforeDebug.Assign(Desktop, False);
|
|
UseDesktop(DebugDesktop);
|
|
end;
|
|
end;
|
|
|
|
procedure TEnvGuiOptions.DisableDebugDesktop;
|
|
begin
|
|
if (LastDesktopBeforeDebug=nil) or (Desktop=nil) then
|
|
Exit;
|
|
try
|
|
if AutoSaveActiveDesktop and Assigned(DebugDesktop) then
|
|
begin
|
|
Desktop.ImportSettingsFromIDE(Self);
|
|
DebugDesktop.Assign(Desktop);
|
|
end;
|
|
UseDesktop(LastDesktopBeforeDebug);
|
|
finally
|
|
LastDesktopBeforeDebug.Free;
|
|
LastDesktopBeforeDebug:=Nil
|
|
end;
|
|
end;
|
|
|
|
class function TEnvGuiOptions.DesktopCanBeLoaded(const aDockMaster: string): Boolean;
|
|
begin
|
|
Result := (aDockMaster = '') or (
|
|
Assigned(IDEDockMaster) and (IDEDockMaster.ClassName = aDockMaster));
|
|
end;
|
|
|
|
function TEnvGuiOptions.GetMsgColors(u: TMessageLineUrgency): TColor;
|
|
begin
|
|
Result:=fMsgColors[u];
|
|
end;
|
|
|
|
function TEnvGuiOptions.GetMsgViewColors(c: TMsgWndColor): TColor;
|
|
begin
|
|
Result:=fMsgViewColors[c];
|
|
end;
|
|
|
|
procedure TEnvGuiOptions.SetMsgColors(u: TMessageLineUrgency; AValue: TColor);
|
|
begin
|
|
fMsgColors[u] := AValue;
|
|
end;
|
|
|
|
procedure TEnvGuiOptions.SetMsgViewColors(c: TMsgWndColor; AValue: TColor);
|
|
begin
|
|
fMsgViewColors[c]:=AValue;
|
|
end;
|
|
|
|
function TEnvGuiOptions.GetActiveDesktop: TDesktopOpt;
|
|
|
|
procedure ChooseDefault;
|
|
begin
|
|
//use default desktop name
|
|
if Assigned(IDEDockMaster) then
|
|
FActiveDesktopName := 'default docked'//name for desktop with AnchorDocking
|
|
else
|
|
FActiveDesktopName := 'default';
|
|
end;
|
|
|
|
var
|
|
OldActiveDesktopName: string;
|
|
OldActiveDesktop, lDskTpOpt: TCustomDesktopOpt;
|
|
begin
|
|
Result := nil;
|
|
if FActiveDesktopName <> '' then
|
|
begin
|
|
lDskTpOpt := FDesktops.Find(FActiveDesktopName);
|
|
if Assigned(lDskTpOpt) and lDskTpOpt.InheritsFrom(TDesktopOpt) and lDskTpOpt.Compatible then
|
|
Exit(TDesktopOpt(lDskTpOpt));
|
|
end;
|
|
|
|
//the selected desktop is unsupported (docked/undocked)
|
|
// -> use default
|
|
OldActiveDesktopName := FActiveDesktopName;
|
|
ChooseDefault;
|
|
lDskTpOpt := FDesktops.Find(FActiveDesktopName);
|
|
if Assigned(lDskTpOpt) and lDskTpOpt.InheritsFrom(TDesktopOpt) then
|
|
if lDskTpOpt.Compatible then
|
|
Exit(TDesktopOpt(lDskTpOpt))
|
|
else
|
|
Result := TDesktopOpt(lDskTpOpt);
|
|
|
|
//recreate desktop with ActiveDesktopName
|
|
if Assigned(Result) then
|
|
FDesktops.Remove(Result);
|
|
|
|
Result := TDesktopOpt.Create(FActiveDesktopName);
|
|
FDesktops.Add(Result);
|
|
Result.Assign(FDesktop);
|
|
if Assigned(IDEDockMaster) then
|
|
Result.FDockedOpt.LoadDefaults;
|
|
OldActiveDesktop := FDesktops.Find(OldActiveDesktopName);
|
|
if not (OldActiveDesktop is TDesktopOpt) then
|
|
begin
|
|
lDskTpOpt := FDesktops.Find('default');
|
|
if Assigned(lDskTpOpt) and lDskTpOpt.InheritsFrom(TDesktopOpt) and lDskTpOpt.Compatible then
|
|
OldActiveDesktop := TDesktopOpt(lDskTpOpt)
|
|
else
|
|
OldActiveDesktop := nil;
|
|
end;
|
|
if Assigned(OldActiveDesktop) then
|
|
Result.Assign(TDesktopOpt(OldActiveDesktop), False, False);
|
|
end;
|
|
|
|
function TEnvGuiOptions.GetDebugDesktop: TDesktopOpt;
|
|
var
|
|
lDskTpOpt: TCustomDesktopOpt;
|
|
begin
|
|
Result := nil;
|
|
if FDebugDesktopName <> '' then
|
|
begin
|
|
lDskTpOpt := FDesktops.Find(FDebugDesktopName);
|
|
if Assigned(lDskTpOpt) //do not mix docked/undocked desktops
|
|
and lDskTpOpt.InheritsFrom(TDesktopOpt) and lDskTpOpt.Compatible then
|
|
Result := TDesktopOpt(lDskTpOpt);
|
|
end;
|
|
end;
|
|
|
|
end.
|
|
|