diff --git a/components/ideintf/ideoptionsintf.pas b/components/ideintf/ideoptionsintf.pas
index ff88b2899e..05cf66b99e 100644
--- a/components/ideintf/ideoptionsintf.pas
+++ b/components/ideintf/ideoptionsintf.pas
@@ -302,6 +302,7 @@ const
CompilerOptionsMacroValues = 1000;
CompilerOptionsInherited = 1100;
CompilerOptionsCompilation = 1200;
+ CompilerOptionsModeMatrix = 1300;
GroupPkgCompiler = 200200;
diff --git a/ide/frames/compiler_modematrix.lfm b/ide/frames/compiler_modematrix.lfm
index 88bcc437e0..2b774da72d 100644
--- a/ide/frames/compiler_modematrix.lfm
+++ b/ide/frames/compiler_modematrix.lfm
@@ -1,4 +1,4 @@
-object Frame1: TFrame1
+object CompOptModeMatrix: TCompOptModeMatrix
Left = 0
Height = 429
Top = 0
@@ -14,6 +14,7 @@ object Frame1: TFrame1
Top = 0
Width = 550
Caption = 'BMMatrixToolBar'
+ List = True
ShowCaptions = True
TabOrder = 0
object BMMMoveUpToolButton: TToolButton
@@ -21,42 +22,56 @@ object Frame1: TFrame1
Top = 2
Caption = 'Up'
OnClick = BMMMoveUpToolButtonClick
+ ParentShowHint = False
+ ShowHint = True
end
object BMMMoveDownToolButton: TToolButton
Left = 26
Top = 2
Caption = 'Down'
OnClick = BMMMoveDownToolButtonClick
+ ParentShowHint = False
+ ShowHint = True
end
object BMMUndoToolButton: TToolButton
Left = 80
Top = 2
Caption = 'Undo'
OnClick = BMMUndoToolButtonClick
+ ParentShowHint = False
+ ShowHint = True
end
object BMMRedoToolButton: TToolButton
Left = 121
Top = 2
Caption = 'Redo'
OnClick = BMMRedoToolButtonClick
+ ParentShowHint = False
+ ShowHint = True
end
object BMMNewTargetToolButton: TToolButton
Left = 171
Top = 2
Caption = 'New Target'
OnClick = BMMNewTargetToolButtonClick
+ ParentShowHint = False
+ ShowHint = True
end
object BMMNewOptionToolButton: TToolButton
Left = 251
Top = 2
Caption = 'New Option'
OnClick = BMMNewOptionToolButtonClick
+ ParentShowHint = False
+ ShowHint = True
end
object BMMDeleteToolButton: TToolButton
Left = 343
Top = 2
Caption = 'Delete'
OnClick = BMMDeleteToolButtonClick
+ ParentShowHint = False
+ ShowHint = True
end
object ToolButton1: TToolButton
Left = 70
diff --git a/ide/frames/compiler_modematrix.pas b/ide/frames/compiler_modematrix.pas
index c04eea9065..8ef6f465b1 100644
--- a/ide/frames/compiler_modematrix.pas
+++ b/ide/frames/compiler_modematrix.pas
@@ -19,25 +19,16 @@
***************************************************************************
ToDo:
- - add frame
- follow active mode
- - read options: global
- - read options: shared
- - read options: session
- write options: global, save envopt.xml
- - write options: shared
- - write options: session
- - restore options: global
- - restore options: shared
- - restore options: session
- - resourcestrings
+ - restore options: global, save xml
- rename build mode => update matrix modes and title
- delete build mode => delete column
- add build mode => add column
- - pkg custom options
- - show added custom options in package inherited tree
- 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
@@ -56,15 +47,15 @@ unit Compiler_ModeMatrix;
interface
uses
- Classes, SysUtils, LazFileUtils, LazLogger, KeywordFuncLists, LResources,
- Forms, Controls, Graphics, ComCtrls,
- ModeMatrixCtrl;
+ Classes, SysUtils, LazFileUtils, LazLogger, KeywordFuncLists, IDEOptionsIntf,
+ IDEImagesIntf, LResources, Forms, Controls, Graphics, ComCtrls,
+ ModeMatrixCtrl, EnvironmentOpts, ModeMatrixOpts, Project, LazarusIDEStrConsts;
type
- { TFrame1 }
+ { TCompOptModeMatrix }
- TFrame1 = class(TFrame)
+ TCompOptModeMatrix = class(TAbstractIDEOptionsEditor)
BMMatrixToolBar: TToolBar;
BMMMoveUpToolButton: TToolButton;
BMMMoveDownToolButton: TToolButton;
@@ -88,18 +79,38 @@ type
procedure GridShowHint(Sender: TObject; HintInfo: PHintInfo);
private
FGrid: TGroupedMatrixControl;
+ FGroupIDE: TGroupedMatrixGroup;
+ FGroupProject: TGroupedMatrixGroup;
+ FGroupSession: TGroupedMatrixGroup;
FIDEColor: TColor;
+ FProject: TProject;
FProjectColor: TColor;
FSessionColor: TColor;
+ fOldIDEOptions: TBuildMatrixOptions;
+ fOldSharedOptions: TBuildMatrixOptions;
+ fOldSessionOptions: TBuildMatrixOptions;
procedure MoveRow(Direction: integer);
procedure UpdateButtons;
function AddTarget(StorageGroup: TGroupedMatrixGroup): TGroupedMatrixGroup;
+ procedure UpdateModes(UpdateGrid: boolean);
public
constructor Create(TheOwner: TComponent); override;
+ destructor Destroy; override;
+ function GetTitle: String; override;
+ procedure Setup(ADialog: TAbstractOptionsEditorDialog); override;
+ class function SupportedOptionsClass: TAbstractIDEOptionsClass; override;
+ procedure ReadSettings(AOptions: TAbstractIDEOptions); override;
+ procedure WriteSettings(AOptions: TAbstractIDEOptions); override;
+ procedure RestoreSettings(AOptions: TAbstractIDEOptions); override;
+ public
property Grid: TGroupedMatrixControl read FGrid;
+ property GroupIDE: TGroupedMatrixGroup read FGroupIDE;
+ property GroupProject: TGroupedMatrixGroup read FGroupProject;
+ property GroupSession: TGroupedMatrixGroup read FGroupSession;
property IDEColor: TColor read FIDEColor write FIDEColor;
property ProjectColor: TColor read FProjectColor write FProjectColor;
property SessionColor: TColor read FSessionColor write FSessionColor;
+ property LazProject: TProject read FProject;
end;
function BuildMatrixOptionTypeCaption(Typ: TBuildMatrixOptionType): string;
@@ -137,9 +148,9 @@ end;
function BuildMatrixOptionTypeHint(Typ: TBuildMatrixOptionType): string;
begin
case Typ of
- bmotCustom: Result:='Append arbitrary fpc options, e.g. -O1 -ghtl -dFlag';
- bmotOutDir: Result:='Override output directory -FU of target';
- bmotIDEMacro: Result:='Set an IDE macro, e.g.: LCLWidgetType:=win32';
+ bmotCustom: Result:=lisMMAppendArbitraryFpcOptionsEGO1GhtlDFlag;
+ bmotOutDir: Result:=lisMMOverrideOutputDirectoryFUOfTarget;
+ bmotIDEMacro: Result:=lisMMSetAnIDEMacroEGLCLWidgetTypeWin32;
else Result:='?';
end;
end;
@@ -281,13 +292,13 @@ begin
MacroValue:='';
if MacroAssignment='' then begin
if ExceptionOnError then
- E('missing macro name');
+ E(lisMMMissingMacroName);
exit;
end;
p:=PChar(MacroAssignment);
if not IsIdentStartChar[p^] then begin
if ExceptionOnError then
- E('expected macro name, but found '+dbgstr(p^));
+ E(Format(lisMMExpectedMacroNameButFound, [dbgstr(p^)]));
exit;
end;
StartP:=p;
@@ -297,20 +308,20 @@ begin
MacroName:=copy(MacroAssignment,1,p-StartP);
if p^<>':' then begin
if ExceptionOnError then
- E('expected :, but found '+dbgstr(p^));
+ E(Format(lisMMExpectedButFound, [dbgstr(p^)]));
exit;
end;
inc(p);
if p^<>'=' then begin
if ExceptionOnError then
- E('expected =, but found '+dbgstr(p^));
+ E(Format(lisMMExpectedButFound2, [dbgstr(p^)]));
exit;
end;
repeat
if (p^=#0) and (p-PChar(MacroAssignment)=length(MacroAssignment)) then break;
if p^ in [#0..#31,#127] then begin
if ExceptionOnError then
- E('invalid character in macro value '+dbgstr(p^));
+ E(Format(lisMMInvalidCharacterInMacroValue, [dbgstr(p^)]));
exit;
end;
until false;
@@ -320,14 +331,14 @@ end;
{$R *.lfm}
-{ TFrame1 }
+{ TCompOptModeMatrix }
-procedure TFrame1.GridSelection(Sender: TObject; aCol, aRow: Integer);
+procedure TCompOptModeMatrix.GridSelection(Sender: TObject; aCol, aRow: Integer);
begin
UpdateButtons;
end;
-procedure TFrame1.GridShowHint(Sender: TObject; HintInfo: PHintInfo);
+procedure TCompOptModeMatrix.GridShowHint(Sender: TObject; HintInfo: PHintInfo);
var
aCol: Longint;
aRow: Longint;
@@ -393,47 +404,47 @@ begin
IncludeProject:=false;
if All then begin
if ExcludeProject then
- h+='Apply to all packages.'+LineEnding
+ h+=lisMMApplyToAllPackages+LineEnding
else
- h+='Apply to all packages and projects.'+LineEnding;
+ h+=lisMMApplyToAllPackagesAndProjects+LineEnding;
end
else begin
if IncludeProject then
- h+='Apply to project.'+LineEnding;
+ h+=lisMMApplyToProject+LineEnding;
if Includes<>'' then
- h+='Apply to all packages matching '+Includes+LineEnding;
+ h+=Format(lisMMApplyToAllPackagesMatching, [Includes])+LineEnding;
end;
if Excludes<>'' then
- h+='Exclude all packages matching '+Excludes+LineEnding;
+ h+=Format(lisMMExcludeAllPackagesMatching, [Excludes])+LineEnding;
end;
end;
HintInfo^.HintStr:=h;
end;
-procedure TFrame1.BMMUndoToolButtonClick(Sender: TObject);
+procedure TCompOptModeMatrix.BMMUndoToolButtonClick(Sender: TObject);
begin
Grid.Undo;
UpdateButtons;
end;
-procedure TFrame1.GridEditingDone(Sender: TObject);
+procedure TCompOptModeMatrix.GridEditingDone(Sender: TObject);
begin
//DebugLn(['TFrame1.GridEditingDone ']);
UpdateButtons;
end;
-procedure TFrame1.BMMRedoToolButtonClick(Sender: TObject);
+procedure TCompOptModeMatrix.BMMRedoToolButtonClick(Sender: TObject);
begin
Grid.Redo;
UpdateButtons;
end;
-procedure TFrame1.BMMMoveUpToolButtonClick(Sender: TObject);
+procedure TCompOptModeMatrix.BMMMoveUpToolButtonClick(Sender: TObject);
begin
MoveRow(-1);
end;
-procedure TFrame1.BMMNewOptionToolButtonClick(Sender: TObject);
+procedure TCompOptModeMatrix.BMMNewOptionToolButtonClick(Sender: TObject);
var
aRow: Integer;
MatRow: TGroupedMatrixRow;
@@ -478,7 +489,7 @@ begin
UpdateButtons;
end;
-procedure TFrame1.BMMNewTargetToolButtonClick(Sender: TObject);
+procedure TCompOptModeMatrix.BMMNewTargetToolButtonClick(Sender: TObject);
var
aRow: Integer;
MatRow: TGroupedMatrixRow;
@@ -516,12 +527,12 @@ begin
UpdateButtons;
end;
-procedure TFrame1.BMMMoveDownToolButtonClick(Sender: TObject);
+procedure TCompOptModeMatrix.BMMMoveDownToolButtonClick(Sender: TObject);
begin
MoveRow(1);
end;
-procedure TFrame1.BMMDeleteToolButtonClick(Sender: TObject);
+procedure TCompOptModeMatrix.BMMDeleteToolButtonClick(Sender: TObject);
var
aRow: Integer;
MatRow: TGroupedMatrixRow;
@@ -537,7 +548,7 @@ begin
UpdateButtons;
end;
-procedure TFrame1.UpdateButtons;
+procedure TCompOptModeMatrix.UpdateButtons;
var
aRow: Integer;
MatRow: TGroupedMatrixRow;
@@ -561,13 +572,50 @@ begin
and (MatRow.GetNextSkipChildren<>nil);
end;
-function TFrame1.AddTarget(StorageGroup: TGroupedMatrixGroup
+function TCompOptModeMatrix.AddTarget(StorageGroup: TGroupedMatrixGroup
): TGroupedMatrixGroup;
begin
Result:=AddMatrixTarget(Grid.Matrix,StorageGroup);
end;
-procedure TFrame1.MoveRow(Direction: integer);
+procedure TCompOptModeMatrix.UpdateModes(UpdateGrid: boolean);
+var
+ i: Integer;
+ BuildMode: TProjectBuildMode;
+ aColor: TColor;
+ GridHasChanged: Boolean;
+ aMode: TGroupedMatrixMode;
+ BuildModes: TProjectBuildModes;
+begin
+ GridHasChanged:=false;
+ // add/update build modes
+ BuildModes:=LazProject.BuildModes;
+ for i:=0 to BuildModes.Count-1 do begin
+ BuildMode:=BuildModes[i];
+ aColor:=clDefault;
+ if BuildMode.InSession then aColor:=SessionColor;
+ if i=Grid.Modes.Count then begin
+ Grid.Modes.Add(BuildMode.Identifier,aColor);
+ GridHasChanged:=true;
+ end
+ else begin
+ aMode:=Grid.Modes[i];
+ if aMode.Caption<>BuildMode.Identifier then begin
+ aMode.Caption:=BuildMode.Identifier;
+ GridHasChanged:=true;
+ end;
+ aMode.Color:=aColor;
+ end;
+ end;
+
+ // set active mode
+ Grid.ActiveMode:=BuildModes.IndexOf(LazProject.ActiveBuildMode);
+
+ if UpdateGrid and GridHasChanged then
+ Grid.MatrixChanged;
+end;
+
+procedure TCompOptModeMatrix.MoveRow(Direction: integer);
var
MatRow: TGroupedMatrixRow;
aRow: Integer;
@@ -665,12 +713,16 @@ begin
UpdateButtons;
end;
-constructor TFrame1.Create(TheOwner: TComponent);
+constructor TCompOptModeMatrix.Create(TheOwner: TComponent);
var
t: TBuildMatrixOptionType;
begin
inherited Create(TheOwner);
+ fOldIDEOptions:=TBuildMatrixOptions.Create;
+ fOldSharedOptions:=TBuildMatrixOptions.Create;
+ fOldSessionOptions:=TBuildMatrixOptions.Create;
+
IDEColor:=RGBToColor(200,255,255);
ProjectColor:=RGBToColor(255,255,255);
SessionColor:=RGBToColor(255,255,200);
@@ -688,8 +740,136 @@ begin
OnShowHint:=@GridShowHint;
end;
+ fGroupIDE:=Grid.Matrix.AddGroup(nil, lisMMStoredInIDEEnvironmentoptionsXml);
+ GroupIDE.Color:=IDEColor;
+
+ fGroupProject:=Grid.Matrix.AddGroup(nil, lisMMStoredInProjectLpi);
+ GroupProject.Color:=ProjectColor;
+
+ fGroupSession:=Grid.Matrix.AddGroup(nil, lisMMStoredInSessionOfProjectLps);
+ GroupSession.Color:=SessionColor;
+
+ BMMatrixToolBar.Images:=IDEImages.Images_16;
+
+ BMMMoveUpToolButton.ShowCaption:=false;
+ BMMMoveUpToolButton.ImageIndex:=IDEImages.LoadImage(16,'arrow_up');
+ BMMMoveUpToolButton.Hint:=lisMMMoveSelectedItemUp;
+
+ BMMMoveDownToolButton.ShowCaption:=false;
+ BMMMoveDownToolButton.ImageIndex:=IDEImages.LoadImage(16,'arrow_down');
+ BMMMoveDownToolButton.Hint:=lisMMMoveSelectedItemDown;
+
+ BMMUndoToolButton.Caption:=lisUndo;
+ BMMUndoToolButton.Hint:=lisMMUndoLastChangeToThisGrid;
+
+ BMMRedoToolButton.Caption:=lisRedo;
+ BMMRedoToolButton.Hint:=lisMMRedoLastUndoToThisGrid;
+
+ BMMNewTargetToolButton.Caption:=lisMMNewTarget;
+ BMMNewTargetToolButton.Hint:=lisMMCreateANewGroupOfOptions;
+
+ BMMNewOptionToolButton.Caption:=lisMMNewOption;
+ BMMNewOptionToolButton.Hint:=lisMMCreateANewOption;
+
+ BMMDeleteToolButton.Caption:=lisDelete;
+ BMMDeleteToolButton.Hint:=lisMMDeleteTheSelectedTargetOrOption;
+
UpdateButtons;
end;
+destructor TCompOptModeMatrix.Destroy;
+begin
+ FreeAndNil(fOldIDEOptions);
+ FreeAndNil(fOldSharedOptions);
+ FreeAndNil(fOldSessionOptions);
+ inherited Destroy;
+end;
+
+function TCompOptModeMatrix.GetTitle: String;
+begin
+ Result:=lisMMModeMatrix;
+end;
+
+procedure TCompOptModeMatrix.Setup(ADialog: TAbstractOptionsEditorDialog);
+begin
+ //debugln(['TCompOptModeMatrix.Setup ',DbgSName(ADialog)]);
+
+end;
+
+class function TCompOptModeMatrix.SupportedOptionsClass: TAbstractIDEOptionsClass;
+begin
+ Result := TProjectCompilerOptions;
+end;
+
+procedure TCompOptModeMatrix.ReadSettings(AOptions: TAbstractIDEOptions);
+var
+ CompOptions: TProjectCompilerOptions;
+begin
+ //debugln(['TCompOptModeMatrix.ReadSettings ',DbgSName(AOptions)]);
+ if not (AOptions is TProjectCompilerOptions) then exit;
+ CompOptions:=TProjectCompilerOptions(AOptions);
+ fProject:=CompOptions.LazProject;
+
+ UpdateModes(false);
+
+ // read IDE options
+ AssignBuildMatrixOptionsToGroup(EnvironmentOptions.BuildMatrixOptions,
+ Grid.Matrix,GroupIDE);
+ fOldIDEOptions.Assign(EnvironmentOptions.BuildMatrixOptions);
+ // read Project options
+ AssignBuildMatrixOptionsToGroup(LazProject.BuildModes.SharedMatrixOptions,
+ Grid.Matrix,GroupProject);
+ fOldSharedOptions.Assign(LazProject.BuildModes.SharedMatrixOptions);
+ // read Session options
+ AssignBuildMatrixOptionsToGroup(LazProject.BuildModes.SessionMatrixOptions,
+ Grid.Matrix,GroupSession);
+ fOldSessionOptions.Assign(LazProject.BuildModes.SessionMatrixOptions);
+
+ // update Grid
+ Grid.MatrixChanged;
+
+ // select project
+ Grid.Row:=Grid.Matrix.IndexOfRow(GroupProject)+1;
+ Grid.Col:=Grid.FixedCols;
+end;
+
+procedure TCompOptModeMatrix.WriteSettings(AOptions: TAbstractIDEOptions);
+var
+ CompOptions: TProjectCompilerOptions;
+begin
+ if not (AOptions is TProjectCompilerOptions) then exit;
+ 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);
+end;
+
+procedure TCompOptModeMatrix.RestoreSettings(AOptions: TAbstractIDEOptions);
+var
+ CompOptions: TProjectCompilerOptions;
+begin
+ if not (AOptions is TProjectCompilerOptions) then exit;
+ CompOptions:=TProjectCompilerOptions(AOptions);
+ fProject:=CompOptions.LazProject;
+
+ // write IDE options
+ EnvironmentOptions.BuildMatrixOptions.Assign(fOldIDEOptions);
+ // write Project options
+ LazProject.BuildModes.SharedMatrixOptions.Assign(fOldSharedOptions);
+ // write Session options
+ LazProject.BuildModes.SessionMatrixOptions.Assign(fOldSessionOptions);
+end;
+
+initialization
+ {$IFDEF EnableModeMatrix}
+ RegisterIDEOptionsEditor(GroupCompiler, TCompOptModeMatrix,
+ CompilerOptionsModeMatrix);
+ {$ENDIF}
+
end.
diff --git a/ide/lazarus.lpi b/ide/lazarus.lpi
index fb53d1d2da..23a6f8a143 100644
--- a/ide/lazarus.lpi
+++ b/ide/lazarus.lpi
@@ -759,7 +759,7 @@
-
+
diff --git a/ide/lazarusidestrconsts.pas b/ide/lazarusidestrconsts.pas
index 360c68c0c0..96f61e1964 100644
--- a/ide/lazarusidestrconsts.pas
+++ b/ide/lazarusidestrconsts.pas
@@ -5677,6 +5677,36 @@ resourcestring
lisPkgDeleteDependencies = 'Delete dependencies';
lisPkgClearSelection = 'Clear Selection';
lisAlpha = 'Alpha';
+ lisMMAppendArbitraryFpcOptionsEGO1GhtlDFlag = 'Append arbitrary fpc options,'
+ +' e.g. -O1 -ghtl -dFlag';
+ lisMMOverrideOutputDirectoryFUOfTarget = 'Override output directory -FU of '
+ +'target';
+ lisMMSetAnIDEMacroEGLCLWidgetTypeWin32 = 'Set an IDE macro, e.g.: '
+ +'LCLWidgetType:=win32';
+ lisMMMissingMacroName = 'missing macro name';
+ lisMMExpectedMacroNameButFound = 'expected macro name, but found %s';
+ lisMMExpectedButFound = 'expected :, but found %s';
+ lisMMExpectedButFound2 = 'expected =, but found %s';
+ lisMMInvalidCharacterInMacroValue = 'invalid character in macro value %s';
+ lisMMApplyToAllPackages = 'Apply to all packages.';
+ lisMMApplyToAllPackagesAndProjects = 'Apply to all packages and projects.';
+ lisMMApplyToProject = 'Apply to project.';
+ lisMMApplyToAllPackagesMatching = 'Apply to all packages matching %s';
+ lisMMExcludeAllPackagesMatching = 'Exclude all packages matching %s';
+ lisMMStoredInIDEEnvironmentoptionsXml = 'Stored in IDE (environmentoptions.'
+ +'xml)';
+ lisMMStoredInProjectLpi = 'Stored in project (.lpi)';
+ lisMMStoredInSessionOfProjectLps = 'Stored in session of project (.lps)';
+ lisMMModeMatrix = 'Mode Matrix';
+ lisMMMoveSelectedItemUp = 'Move selected item up';
+ lisMMMoveSelectedItemDown = 'Move selected item down';
+ lisMMNewTarget = 'New Target';
+ lisMMNewOption = 'New Option';
+ lisMMUndoLastChangeToThisGrid = 'Undo last change to this grid';
+ lisMMRedoLastUndoToThisGrid = 'Redo last undo to this grid';
+ lisMMCreateANewGroupOfOptions = 'Create a new group of options';
+ lisMMCreateANewOption = 'Create a new option';
+ lisMMDeleteTheSelectedTargetOrOption = 'Delete the selected target or option';
implementation
diff --git a/ide/main.pp b/ide/main.pp
index 9f29effd3d..b6fb4d18da 100644
--- a/ide/main.pp
+++ b/ide/main.pp
@@ -136,6 +136,9 @@ uses
{$IFnDEF NewBuildModeWindow}
BuildModesEditor,
{$ENDIF}
+ {$IFDEF EnableModeMatrix}
+ Compiler_ModeMatrix,
+ {$ENDIF}
// package option frames
package_usage_options, package_description_options, package_integration_options,
package_provides_options, package_i18n_options,