IDE: update inherited compiler options when frame becomes visible

git-svn-id: trunk@41246 -
This commit is contained in:
mattias 2013-05-17 21:49:44 +00:00
parent b5943c123d
commit 6e218ad039
9 changed files with 312 additions and 63 deletions

View File

@ -47,7 +47,7 @@ uses
EditDefineTree, ProjectResources, MiscOptions, LazConf, EnvironmentOpts,
TransferMacros, CompilerOptions, OutputFilter, Compiler, FPCSrcScan,
PackageDefs, PackageSystem, Project, ProjectIcon,
BaseBuildManager, ApplicationBundle;
ModeMatrixOpts, BaseBuildManager, ApplicationBundle;
type
{ TBuildManager }
@ -148,6 +148,11 @@ type
override;
function OnGetBuildMacroValues(Options: TBaseCompilerOptions;
IncludeSelf: boolean): TCTCfgScriptVariables;
procedure AppendMatrixCustomOption(Sender: TObject;
var Options: string; Types: TBuildMatrixGroupTypes);
procedure GetMatrixOutputDirectoryOverride(Sender: TObject;
var OutDir: string; Types: TBuildMatrixGroupTypes);
function GetModeMatrixTarget(Sender: TObject): string;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
@ -298,14 +303,20 @@ begin
RunCompilerWithOptions:=@OnRunCompilerWithOptions;
GetBuildMacroValues:=@OnGetBuildMacroValues;
OnAppendCustomOption:=@AppendMatrixCustomOption;
OnGetOutputDirectoryOverride:=@GetMatrixOutputDirectoryOverride;
end;
destructor TBuildManager.Destroy;
begin
GetBuildMacroValues:=nil;
OnAppendCustomOption:=nil;
OnBackupFileInteractive:=nil;
RunCompilerWithOptions:=nil;
FreeAndNil(FFPCSrcScans);
LazConfMacroFunc:=nil;
OnBackupFileInteractive:=nil;
FreeAndNil(InputHistories);
FreeAndNil(DefaultCfgVars);
@ -2328,6 +2339,59 @@ begin
end;
end;
procedure TBuildManager.AppendMatrixCustomOption(Sender: TObject;
var Options: string; Types: TBuildMatrixGroupTypes);
var
Target: String;
ActiveMode: String;
begin
if Project1=nil then exit;
Target:=GetModeMatrixTarget(Sender);
ActiveMode:=Project1.ActiveBuildMode.Identifier;
if bmgtEnvironment in Types then
EnvironmentOptions.BuildMatrixOptions.AppendCustomOptions(Target,ActiveMode,Options);
if bmgtProject in Types then
Project1.BuildModes.SharedMatrixOptions.AppendCustomOptions(Target,ActiveMode,Options);
if bmgtSession in Types then
Project1.BuildModes.SessionMatrixOptions.AppendCustomOptions(Target,ActiveMode,Options);
end;
procedure TBuildManager.GetMatrixOutputDirectoryOverride(Sender: TObject;
var OutDir: string; Types: TBuildMatrixGroupTypes);
var
Target: String;
ActiveMode: String;
begin
if Project1=nil then exit;
Target:=GetModeMatrixTarget(Sender);
ActiveMode:=Project1.ActiveBuildMode.Identifier;
if bmgtEnvironment in Types then
EnvironmentOptions.BuildMatrixOptions.GetOutputDirectory(Target,ActiveMode,OutDir);
if bmgtProject in Types then
Project1.BuildModes.SharedMatrixOptions.GetOutputDirectory(Target,ActiveMode,OutDir);
if bmgtSession in Types then
Project1.BuildModes.SessionMatrixOptions.GetOutputDirectory(Target,ActiveMode,OutDir);
end;
function TBuildManager.GetModeMatrixTarget(Sender: TObject): string;
begin
Result:='';
if Sender is TParsedCompilerOptions then
Sender:=TParsedCompilerOptions(Sender).Owner;
if Sender is TPkgAdditionalCompilerOptions then
exit; // matrix options are added only to normal options
if Sender is TPkgCompilerOptions then
Sender:=TPkgCompilerOptions(Sender).Owner
else if Sender is TProjectCompilerOptions then
Sender:=TProjectCompilerOptions(Sender).Owner;
if Sender is TProject then begin
Result:=BuildMatrixProjectName;
end else if Sender is TLazPackage then begin
Result:=TLazPackage(Sender).Name;
end;
//debugln(['TBuildManager.GetModeMatrixTarget ',DbgSName(Sender),' Target="',Result,'"']);
end;
procedure TBuildManager.SetBuildTarget(const TargetOS, TargetCPU,
LCLWidgetType: string; ScanFPCSrc: TScanModeFPCSources; Quiet: boolean);

View File

@ -29,18 +29,6 @@
* *
***************************************************************************
ToDo:
- when adding/removing search path: do it for all build modes
- add unit to project
- remove unit from project
- move unit in project
- make lazbuild lcl independent, independent of packages except one
- license gpl2
- create package lazbuildsystem with some units
- move
- i18n for descriptions
- keyword help for a build macro
}
unit CompilerOptions;
@ -61,7 +49,8 @@ uses
ProjectIntf, MacroIntf, IDEExternToolIntf, SrcEditorIntf, CompOptsIntf,
IDEOptionsIntf,
// IDE
LazarusIDEStrConsts, IDEProcs, IDEMsgIntf, LazConf, TransferMacros, CompOptsModes;
LazarusIDEStrConsts, IDEProcs, IDEMsgIntf, LazConf, TransferMacros,
ModeMatrixOpts, CompOptsModes;
type
@ -686,8 +675,14 @@ function ConvertOptionsToCmdLine(const Switch, OptionStr: string): string;
type
TGetBuildMacroValues = function(Options: TBaseCompilerOptions;
IncludeSelf: boolean): TCTCfgScriptVariables of object;
TOnAppendCustomOptions = procedure(Sender: TObject;
var CustomOptions: string; Types: TBuildMatrixGroupTypes) of object;
TOnGetOutputDirectoryOverride = procedure(Sender: TObject;
var OutDir: string; Types: TBuildMatrixGroupTypes) of object;
var
GetBuildMacroValues: TGetBuildMacroValues = nil; // set by TPkgManager, do not change or free the variables
OnAppendCustomOption: TOnAppendCustomOptions = nil; // set by MainBuildBoss
OnGetOutputDirectoryOverride: TOnGetOutputDirectoryOverride = nil; // set by MainBuildBoss
function LoadXMLCompileReasons(const AConfig: TXMLConfig;
const APath: String; const DefaultReasons: TCompileReasons): TCompileReasons;
@ -3867,6 +3862,15 @@ var
begin
s:=OptionText;
// apply overrides
if Option=pcosCustomOptions then begin
if Assigned(OnAppendCustomOption) then
OnAppendCustomOption(Self,s,bmgtAll);
end else if Option=pcosOutputDir then begin
if Assigned(OnGetOutputDirectoryOverride) then
OnGetOutputDirectoryOverride(Self,s,bmgtAll);
end;
// parse locally (macros depending on owner, like pkgdir and build macros)
if Assigned(OnLocalSubstitute) then
begin

View File

@ -36,7 +36,7 @@ uses
ProjectIntf, IDEImagesIntf, IDEOptionsIntf, CompOptsIntf,
PackageDefs, compiler_inherited_options, TransferMacros,
PathEditorDlg, Project, PackageSystem, LazarusIDEStrConsts, CompilerOptions,
IDEProcs, BuildModeDiffDlg;
IDEProcs, BuildModeDiffDlg, Compiler_ModeMatrix;
type
@ -78,6 +78,7 @@ type
procedure DoShowSession;
procedure UpdateDialogCaption;
function GetDialogCaption: string;
procedure ModesChanged;
public
constructor Create(TheOwner: TComponent); override;
destructor Destroy; override;
@ -154,6 +155,8 @@ begin
BuildModesStringGrid.Col:=fModeNameCol;
BuildModesStringGrid.Row:=BuildModesStringGrid.RowCount-1;
BuildModesStringGrid.EditorMode:=true;
ModesChanged;
end;
procedure TBuildModesEditorFrame.BuildModeDeleteSpeedButtonClick(Sender: TObject);
@ -192,6 +195,8 @@ begin
Grid.Row:=Grid.RowCount-1
else
Grid.Row:=i;
ModesChanged;
end;
procedure TBuildModesEditorFrame.BuildModeMoveDownSpeedButtonClick(Sender: TObject);
@ -205,6 +210,8 @@ begin
inc(i);
FillBuildModesGrid;
BuildModesStringGrid.Row:=i+1;
ModesChanged;
end;
procedure TBuildModesEditorFrame.BuildModeMoveUpSpeedButtonClick(Sender: TObject);
@ -218,6 +225,8 @@ begin
AProject.BuildModes[0].InSession:=false;
FillBuildModesGrid;
BuildModesStringGrid.Row:=i+1;
ModesChanged;
end;
procedure TBuildModesEditorFrame.BuildModesStringGridCheckboxToggled(
@ -255,6 +264,7 @@ begin
exit;
end;
CurMode.InSession:=b;
ModesChanged;
end;
end;
@ -273,7 +283,7 @@ var
b: Boolean;
i: Integer;
begin
debugln(['TBuildModesForm.BuildModesStringGridValidateEntry Row=',aRow,' Col=',aCol]);
//debugln(['TBuildModesForm.BuildModesStringGridValidateEntry Row=',aRow,' Col=',aCol]);
i:=aRow-1;
if (i<0) or (i>=AProject.BuildModes.Count) then exit;
CurMode:=AProject.BuildModes[i];
@ -290,6 +300,7 @@ begin
exit;
end;
CurMode.InSession:=b;
ModesChanged;
end
else if aCol=fModeNameCol then
begin
@ -301,6 +312,7 @@ begin
CurMode.Identifier:=s;
NewValue:=s;
UpdateDialogCaption;
ModesChanged;
end;
end;
@ -367,6 +379,12 @@ begin
Result:='TBuildModesEditorFrame.GetDialogCaption: no project';
end;
procedure TBuildModesEditorFrame.ModesChanged;
begin
if ModeMatrixFrame<>nil then
ModeMatrixFrame.UpdateModes;
end;
procedure TBuildModesEditorFrame.UpdateInheritedOptions;
var
InhOptionCtrl: TCompilerInheritedOptionsFrame;
@ -450,6 +468,7 @@ begin
finally
FSwitchingMode:=false;
end;
ModesChanged;
end;
procedure TBuildModesEditorFrame.UpdateShowSession;

View File

@ -1,12 +1,15 @@
inherited CompilerInheritedOptionsFrame: TCompilerInheritedOptionsFrame
object CompilerInheritedOptionsFrame: TCompilerInheritedOptionsFrame
Left = 0
Height = 444
Top = 0
Width = 576
ClientHeight = 444
ClientWidth = 576
TabOrder = 0
DesignLeft = 957
DesignTop = 308
object InhNoteLabel: TLabel[0]
Visible = False
DesignLeft = 246
DesignTop = 162
object InhNoteLabel: TLabel
Left = 0
Height = 16
Top = 0
@ -15,20 +18,20 @@ inherited CompilerInheritedOptionsFrame: TCompilerInheritedOptionsFrame
Caption = 'InhNoteLabel'
ParentColor = False
end
object InhTreeView: TTreeView[1]
object InhTreeView: TTreeView
Left = 0
Height = 247
Top = 16
Width = 576
Align = alTop
DefaultItemHeight = 17
DefaultItemHeight = 18
ReadOnly = True
RightClickSelect = True
TabOrder = 0
OnSelectionChanged = InhTreeViewSelectionChanged
Options = [tvoAutoItemHeight, tvoHideSelection, tvoKeepCollapsedNodes, tvoReadOnly, tvoRightClickSelect, tvoShowButtons, tvoShowLines, tvoShowRoot, tvoToolTips, tvoThemedDraw]
end
object InhItemMemo: TMemo[2]
object InhItemMemo: TMemo
Left = 0
Height = 176
Top = 268
@ -38,7 +41,7 @@ inherited CompilerInheritedOptionsFrame: TCompilerInheritedOptionsFrame
ScrollBars = ssAutoVertical
TabOrder = 1
end
object InhSplitter: TSplitter[3]
object InhSplitter: TSplitter
Cursor = crVSplit
Left = 0
Height = 5

View File

@ -39,7 +39,8 @@ uses
Classes, SysUtils, LCLProc, FileUtil, Forms, Controls, Graphics, Dialogs,
StdCtrls, ComCtrls, ExtCtrls,
CodeToolsCfgScript, IDEOptionsIntf, IDEImagesIntf, ProjectIntf, CompOptsIntf,
Project, PackageDefs, CompilerOptions, LazarusIDEStrConsts, IDEProcs;
Project, PackageDefs, ModeMatrixOpts, CompilerOptions,
LazarusIDEStrConsts, IDEProcs;
type
@ -52,11 +53,14 @@ type
InhTreeView: TTreeView;
procedure InhTreeViewSelectionChanged(Sender: TObject);
private
FLastOptions: TBaseCompilerOptions;
ImageIndexInherited: Integer;
ImageIndexRequired: Integer;
ImageIndexPackage: Integer;
InheritedChildDatas: TList; // list of PInheritedNodeData
procedure ClearInheritedTree;
protected
procedure VisibleChanged; override;
public
destructor Destroy; override;
function GetTitle: string; override;
@ -65,6 +69,7 @@ type
procedure WriteSettings(AOptions: TAbstractIDEOptions); override;
procedure UpdateInheritedTree(CompilerOpts: TBaseCompilerOptions);
class function SupportedOptionsClass: TAbstractIDEOptionsClass; override;
property LastOptions: TBaseCompilerOptions read FLastOptions;
end;
implementation
@ -154,7 +159,46 @@ var
SkippedPkgList: TFPList;
AProject: TProject;
Pkg: TLazPackage;
t: TBuildMatrixGroupType;
procedure AddMatrixGroupNode(Grp: TBuildMatrixGroupType);
begin
AncestorNode := InhTreeView.Items.Add(nil, '');
case Grp of
bmgtEnvironment: AncestorNode.Text:='Environment';
bmgtProject: AncestorNode.Text:='Project';
bmgtSession: AncestorNode.Text:='Project Session';
end;
AncestorNode.ImageIndex := ImageIndexPackage;
AncestorNode.SelectedIndex := AncestorNode.ImageIndex;
end;
procedure AddMatrixGroup(Grp: TBuildMatrixGroupType);
var
CustomOptions: String;
OutDir: String;
begin
AncestorNode := nil;
CustomOptions:='';
OnAppendCustomOption(CompilerOpts,CustomOptions,[Grp]);
if CustomOptions<>'' then begin
AddMatrixGroupNode(Grp);
AddChildNode(liscustomOptions, CustomOptions, icoCustomOptions);
end;
OutDir:='.*';
OnGetOutputDirectoryOverride(CompilerOpts,OutDir,[Grp]);
if OutDir<>'.*' then begin
AddMatrixGroupNode(Grp);
AddChildNode('Output directory', OutDir, icoNone);
end;
if AncestorNode<>nil then
AncestorNode.Expand(true);
end;
begin
FLastOptions:=CompilerOpts;
if not Visible then exit;
OptionsList := nil;
//debugln(['TCompilerInheritedOptionsFrame.UpdateInheritedTree START CompilerOpts=',DbgSName(CompilerOpts)]);
CompilerOpts.GetInheritedCompilerOptions(OptionsList);
@ -235,8 +279,7 @@ begin
AncestorNode.Expanded := True;
end;
OptionsList.Free;
end
else
end else
begin
InhTreeView.Items.Add(nil, lisNoCompilerOptionsInherited);
end;
@ -249,6 +292,11 @@ begin
AncestorNode.SelectedIndex := AncestorNode.ImageIndex;
end;
end;
// add matrix options
for t:=low(TBuildMatrixGroupType) to high(TBuildMatrixGroupType) do
AddMatrixGroup(t);
InhTreeView.EndUpdate;
finally
SkippedPkgList.Free;
@ -284,6 +332,12 @@ begin
InhTreeView.EndUpdate;
end;
procedure TCompilerInheritedOptionsFrame.VisibleChanged;
begin
inherited VisibleChanged;
if IsVisible and (LastOptions<>nil) then
UpdateInheritedTree(LastOptions);
end;
procedure TCompilerInheritedOptionsFrame.InhTreeViewSelectionChanged(Sender: TObject);
var

View File

@ -19,26 +19,14 @@
***************************************************************************
ToDo:
- follow active mode
- write options: global, save envopt.xml
- restore options: global, save xml
- rename build mode => update matrix modes and title
- delete build mode => delete column
- add build mode => add column
- project custom options
- show added custom options in project inherited tree
- pkg custom options
- show added custom options in package inherited tree
- pkg out dir
- show OutDir in package inherited tree
- project outdir
- show OutDir in project inherited tree
- ide macro
- warn for syntax errors in ide macro
- wiki
- ide macro
- load old build macro values into matrix
- save matrix options for old build macro values
- easy way to change LCLWidgetType
- wiki
- remove old frame
- remove old macro value classes
}
unit Compiler_ModeMatrix;
@ -49,7 +37,8 @@ interface
uses
Classes, SysUtils, LazFileUtils, LazLogger, KeywordFuncLists, IDEOptionsIntf,
IDEImagesIntf, LResources, Forms, Controls, Graphics, ComCtrls,
ModeMatrixCtrl, EnvironmentOpts, ModeMatrixOpts, Project, LazarusIDEStrConsts;
ModeMatrixCtrl, EnvironmentOpts, ModeMatrixOpts, Project, LazarusIDEStrConsts,
TransferMacros;
type
@ -89,11 +78,12 @@ type
fOldIDEOptions: TBuildMatrixOptions;
fOldSharedOptions: TBuildMatrixOptions;
fOldSessionOptions: TBuildMatrixOptions;
procedure DoWriteSettings;
procedure MoveRow(Direction: integer);
procedure UpdateButtons;
function AddTarget(StorageGroup: TGroupedMatrixGroup): TGroupedMatrixGroup;
procedure UpdateModes(UpdateGrid: boolean);
procedure UpdateActiveMode;
protected
procedure VisibleChanged; override;
public
constructor Create(TheOwner: TComponent); override;
destructor Destroy; override;
@ -103,6 +93,8 @@ type
procedure ReadSettings(AOptions: TAbstractIDEOptions); override;
procedure WriteSettings(AOptions: TAbstractIDEOptions); override;
procedure RestoreSettings(AOptions: TAbstractIDEOptions); override;
procedure UpdateModes(UpdateGrid: boolean = true);
procedure UpdateActiveMode;
public
property Grid: TGroupedMatrixControl read FGrid;
property GroupIDE: TGroupedMatrixGroup read FGroupIDE;
@ -121,12 +113,15 @@ function IsEqual(Options: TBuildMatrixOptions; StorageGroup: TGroupedMatrixGroup
procedure AssignBuildMatrixOptionsToGroup(Options: TBuildMatrixOptions;
Matrix: TGroupedMatrix; StorageGroup: TGroupedMatrixGroup);
procedure AssignBuildMatrixGroupToOptions(StorageGroup: TGroupedMatrixGroup;
Options: TBuildMatrixOptions);
Options: TBuildMatrixOptions; InvalidateCompOpts: boolean);
function TargetsPrefix: string;
function AddMatrixTarget(Matrix: TGroupedMatrix; StorageGroup: TGroupedMatrixGroup): TGroupedMatrixGroup;
function SplitMatrixMacro(MacroAssignment: string;
out MacroName, MacroValue: string; ExceptionOnError: boolean): boolean;
var
ModeMatrixFrame: TCompOptModeMatrix = nil;
implementation
function BuildMatrixOptionTypeCaption(Typ: TBuildMatrixOptionType): string;
@ -226,7 +221,7 @@ begin
end;
procedure AssignBuildMatrixGroupToOptions(StorageGroup: TGroupedMatrixGroup;
Options: TBuildMatrixOptions);
Options: TBuildMatrixOptions; InvalidateCompOpts: boolean);
var
GrpIndex: Integer;
Target: TGroupedMatrixGroup;
@ -262,6 +257,8 @@ begin
end;
end;
end;
if InvalidateCompOpts then
IncreaseCompilerParseStamp;
end;
function TargetsPrefix: string;
@ -579,6 +576,13 @@ begin
Result:=AddMatrixTarget(Grid.Matrix,StorageGroup);
end;
procedure TCompOptModeMatrix.VisibleChanged;
begin
inherited VisibleChanged;
if (not Visible) and (LazProject<>nil) then
DoWriteSettings;
end;
procedure TCompOptModeMatrix.UpdateModes(UpdateGrid: boolean);
var
i: Integer;
@ -723,11 +727,25 @@ begin
UpdateButtons;
end;
procedure TCompOptModeMatrix.DoWriteSettings;
begin
// write IDE options
AssignBuildMatrixGroupToOptions(GroupIDE,
EnvironmentOptions.BuildMatrixOptions, true);
// write Project options
AssignBuildMatrixGroupToOptions(GroupProject,
LazProject.BuildModes.SharedMatrixOptions, true);
// write Session options
AssignBuildMatrixGroupToOptions(GroupSession,
LazProject.BuildModes.SessionMatrixOptions, true);
end;
constructor TCompOptModeMatrix.Create(TheOwner: TComponent);
var
t: TBuildMatrixOptionType;
begin
inherited Create(TheOwner);
ModeMatrixFrame:=Self;
fOldIDEOptions:=TBuildMatrixOptions.Create;
fOldSharedOptions:=TBuildMatrixOptions.Create;
@ -789,6 +807,7 @@ end;
destructor TCompOptModeMatrix.Destroy;
begin
ModeMatrixFrame:=nil;
FreeAndNil(fOldIDEOptions);
FreeAndNil(fOldSharedOptions);
FreeAndNil(fOldSessionOptions);
@ -857,12 +876,7 @@ begin
CompOptions:=TProjectCompilerOptions(AOptions);
fProject:=CompOptions.LazProject;
// write IDE options
AssignBuildMatrixGroupToOptions(GroupIDE,EnvironmentOptions.BuildMatrixOptions);
// write Project options
AssignBuildMatrixGroupToOptions(GroupProject,LazProject.BuildModes.SharedMatrixOptions);
// write Session options
AssignBuildMatrixGroupToOptions(GroupSession,LazProject.BuildModes.SessionMatrixOptions);
DoWriteSettings;
end;
procedure TCompOptModeMatrix.RestoreSettings(AOptions: TAbstractIDEOptions);
@ -879,6 +893,8 @@ begin
LazProject.BuildModes.SharedMatrixOptions.Assign(fOldSharedOptions);
// write Session options
LazProject.BuildModes.SessionMatrixOptions.Assign(fOldSessionOptions);
IncreaseCompilerParseStamp;
end;
initialization

View File

@ -28,7 +28,8 @@ interface
uses
Classes, SysUtils, math, types, contnrs, Controls, LCLType, LCLIntf, Grids,
Graphics, StdCtrls, Menus, LazLogger, LazConfigStorage, Laz2_XMLCfg,
FileProcs, KeywordFuncLists, ModeMatrixOpts;
FileProcs, KeywordFuncLists,
IDEProcs, ModeMatrixOpts;
const
DefaultModeMatrixMaxUndo = 100;
@ -1178,7 +1179,7 @@ begin
MatRow:=Matrix.Rows[aRow-1];
if MatRow is TGroupedMatrixValue then begin
//debugln(['TGroupedMatrixControl.GetCheckBoxState ',aCol,' ',aRow,' "',Modes[aCol-1],'" ',TGroupedMatrixValue(MatRow).Modes.Text]);
if TGroupedMatrixValue(MatRow).Modes.IndexOf(Modes[aCol-1].Caption)>=0
if IndexInStringList(TGroupedMatrixValue(MatRow).Modes,cstCaseInsensitive,Modes[aCol-1].Caption)>=0
then begin
aState:=cbChecked;
//debugln(['TGroupedMatrixControl.GetCheckBoxState ',aCol,' ',aRow,' "',Modes[aCol-1],'" ',TGroupedMatrixValue(MatRow).Modes.Text]);
@ -1205,7 +1206,7 @@ begin
if assigned(OnSetCheckboxState) then
OnSetCheckboxState(Self, aCol, aRow, aState);
ModeName:=Modes[aCol-1].Caption;
i:=ValueRow.Modes.IndexOf(ModeName);
i:=IndexInStringList(ValueRow.Modes,cstCaseInsensitive,ModeName);
if (i<0) = (aState=cbUnchecked) then exit;
StoreUndo;
if i>=0 then begin
@ -1443,7 +1444,7 @@ procedure TGroupedMatrixControl.DefaultDrawCell(aCol, aRow: Integer; var aRect:
procedure DrawActiveModeRow(ValueRow: TGroupedMatrixValue);
begin
if ActiveMode<0 then exit;
if ValueRow.Modes.IndexOf(Modes[ActiveMode].Caption)<0 then exit;
if IndexInStringList(ValueRow.Modes,cstCaseInsensitive,Modes[ActiveMode].Caption)<0 then exit;
Canvas.GradientFill(Rect(aRect.Left,(aRect.Top+aRect.Bottom) div 2,aRect.Right,aRect.Bottom),
Color,ActiveModeColor,gdVertical);
end;

View File

@ -4676,7 +4676,8 @@ begin
else
Application.TaskBarBehavior := tbDefault;
end else begin
IDEOptionsDialog.WriteAll(true); // restore
// restore
IDEOptionsDialog.WriteAll(true);
end;
finally
IDEOptionsDialog.Free;

View File

@ -46,6 +46,16 @@ const
'IDEMacro'
);
type
TBuildMatrixGroupType = (
bmgtEnvironment,
bmgtProject,
bmgtSession
);
TBuildMatrixGroupTypes = set of TBuildMatrixGroupType;
const
bmgtAll = [low(TBuildMatrixGroupType)..high(TBuildMatrixGroupType)];
type
TBuildMatrixOptions = class;
@ -68,9 +78,11 @@ type
procedure Assign(Source: TPersistent); override;
constructor Create(aList: TBuildMatrixOptions);
destructor Destroy; override;
function FitsTarget(const Target: string): boolean;
function FitsMode(const Mode: string): boolean;
property List: TBuildMatrixOptions read FList;
property Targets: string read FTargets write SetTargets;
property Modes: string read FModes write SetModes; // modes separated by line breaks
property Modes: string read FModes write SetModes; // modes separated by line breaks, case insensitive
property Typ: TBuildMatrixOptionType read FTyp write SetTyp;
property MacroName: string read FMacroName write SetMacroName;
property Value: string read FValue write SetValue;
@ -106,19 +118,28 @@ type
function IndexOf(Option: TBuildMatrixOption): integer;
function Add(Typ: TBuildMatrixOptionType = bmotCustom; Targets: string = '*'): TBuildMatrixOption;
procedure Delete(Index: integer);
// equals, modified
property ChangeStep: int64 read FChangeStep;
procedure IncreaseChangeStep;
function Equals(Obj: TObject): boolean; override;
property OnChanged: TNotifyEvent read FOnChanged write FOnChangesd;
property Modified: boolean read GetModified write SetModified;
// load, save
procedure LoadFromConfig(Cfg: TConfigStorage);
procedure SaveToConfig(Cfg: TConfigStorage);
procedure LoadFromXMLConfig(Cfg: TXMLConfig; const aPath: string);
procedure SaveToXMLConfig(Cfg: TXMLConfig; const aPath: string);
property OnChanged: TNotifyEvent read FOnChanged write FOnChangesd;
property Modified: boolean read GetModified write SetModified;
// queries
procedure AppendCustomOptions(Target, ActiveMode: string; var Options: string);
procedure GetOutputDirectory(Target, ActiveMode: string; var OutDir: string);
end;
function BuildMatrixTargetFits(Target, Targets: string): boolean;
function BuildMatrixTargetFitsPattern(Target, Pattern: PChar): boolean;
function BuildMatrixModeFits(Mode, ModesSeparatedByLineBreaks: string): boolean;
function Str2BuildMatrixOptionType(const s: string): TBuildMatrixOptionType;
implementation
@ -219,6 +240,28 @@ begin
until false;
end;
function BuildMatrixModeFits(Mode, ModesSeparatedByLineBreaks: string): boolean;
var
p: PChar;
m: PChar;
begin
Result:=false;
if Mode='' then exit;
if ModesSeparatedByLineBreaks='' then exit;
p:=PChar(ModesSeparatedByLineBreaks);
while p^<>#0 do begin
while p^ in [#1..#31] do inc(p);
m:=PChar(Mode);
while (UpChars[p^]=UpChars[m^]) and (p^>=' ') do begin
inc(p);
inc(m);
end;
if (m^=#0) and (p^ in [#10,#13,#0]) then
exit(true);
while p^>=' ' do inc(p);
end;
end;
function Str2BuildMatrixOptionType(const s: string): TBuildMatrixOptionType;
begin
for Result:=low(TBuildMatrixOptionType) to high(TBuildMatrixOptionType) do
@ -384,6 +427,40 @@ begin
Items[i].SaveToXMLConfig(Cfg,aPath+'item'+IntToStr(i+1)+'/');
end;
procedure TBuildMatrixOptions.AppendCustomOptions(Target, ActiveMode: string;
var Options: string);
var
i: Integer;
Option: TBuildMatrixOption;
Value: String;
begin
for i:=0 to Count-1 do begin
Option:=Items[i];
if Option.Typ<>bmotCustom then continue;
Value:=Trim(Option.Value);
if Value='' then continue;
if not Option.FitsTarget(Target) then continue;
if not Option.FitsMode(ActiveMode) then continue;
if Options<>'' then Options+=' ';
Options+=Value;
end;
end;
procedure TBuildMatrixOptions.GetOutputDirectory(Target, ActiveMode: string;
var OutDir: string);
var
i: Integer;
Option: TBuildMatrixOption;
begin
for i:=0 to Count-1 do begin
Option:=Items[i];
if Option.Typ<>bmotOutDir then continue;
if not Option.FitsTarget(Target) then continue;
if not Option.FitsMode(ActiveMode) then continue;
OutDir:=Option.Value;
end;
end;
{ TBuildMatrixOption }
procedure TBuildMatrixOption.SetMacroName(AValue: string);
@ -451,6 +528,16 @@ begin
inherited Destroy;
end;
function TBuildMatrixOption.FitsTarget(const Target: string): boolean;
begin
Result:=BuildMatrixTargetFits(Target,Targets);
end;
function TBuildMatrixOption.FitsMode(const Mode: string): boolean;
begin
Result:=BuildMatrixModeFits(Mode,Modes);
end;
function TBuildMatrixOption.Equals(Obj: TObject): boolean;
var
Src: TBuildMatrixOption;