IDE: mode matrix: read/write/restore

git-svn-id: trunk@41229 -
This commit is contained in:
mattias 2013-05-17 06:10:35 +00:00
parent b7b8d3c067
commit 8b9514f7a2
6 changed files with 276 additions and 47 deletions

View File

@ -302,6 +302,7 @@ const
CompilerOptionsMacroValues = 1000;
CompilerOptionsInherited = 1100;
CompilerOptionsCompilation = 1200;
CompilerOptionsModeMatrix = 1300;
GroupPkgCompiler = 200200;

View File

@ -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

View File

@ -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.

View File

@ -759,7 +759,7 @@
</Target>
<SearchPaths>
<IncludeFiles Value="include"/>
<OtherUnitFiles Value="frames;../converter;../debugger;../debugger/frames;../packager;../designer;../packager/frames;../ide"/>
<OtherUnitFiles Value="frames;../converter;../debugger;../debugger/frames;../packager;../designer;../packager/frames;../ide;frames;frames"/>
<UnitOutputDirectory Value="$(LazarusDir)/units/$(TargetCPU)-$(TargetOS)/$(LCLWidgetType)"/>
</SearchPaths>
<Other>

View File

@ -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

View File

@ -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,