From 422e68c742cce74ecf2e805932b6973db33d72b0 Mon Sep 17 00:00:00 2001 From: mattias Date: Thu, 30 May 2013 14:29:43 +0000 Subject: [PATCH] IDE: mode matrix: save enabled options in session modes git-svn-id: trunk@41461 - --- ide/frames/compiler_modematrix.pas | 7 +-- ide/mainbase.pas | 2 +- ide/modematrixopts.pas | 70 ++++++++++++++++++++++++++- ide/project.pp | 77 ++++++++++++++++++++++++++---- ide/sourcefilemanager.pas | 2 +- 5 files changed, 141 insertions(+), 17 deletions(-) diff --git a/ide/frames/compiler_modematrix.pas b/ide/frames/compiler_modematrix.pas index 31ae3b26ff..136c285eb8 100644 --- a/ide/frames/compiler_modematrix.pas +++ b/ide/frames/compiler_modematrix.pas @@ -19,14 +19,9 @@ *************************************************************************** ToDo: - - save session modes in session - - project - - IDE - - load session modes - - project - - IDE - save matrix options for old build macro values - load old build macro values into matrix + - when rename build mode, update option modes - ifdef old frame - ifdef old macro value classes - wiki diff --git a/ide/mainbase.pas b/ide/mainbase.pas index dcbfdfe90f..df5207c298 100644 --- a/ide/mainbase.pas +++ b/ide/mainbase.pas @@ -416,7 +416,7 @@ begin if not FileExistsUTF8(AFilename) then CopySecondaryConfigFile(DefaultProjectOptionsFilename); if FileExistsUTF8(AFilename) then begin - if AProject.ReadProject(AFilename,[prfLoadParts,prfLoadPartBuildModes])<>mrOk then + if AProject.ReadProject(AFilename,nil,[prfLoadParts,prfLoadPartBuildModes])<>mrOk then DebugLn(['TMainIDEBase.DoLoadDefaultCompilerOptions failed']); end else begin // old way (<0.9.31) diff --git a/ide/modematrixopts.pas b/ide/modematrixopts.pas index 484c961639..b290a28757 100644 --- a/ide/modematrixopts.pas +++ b/ide/modematrixopts.pas @@ -57,6 +57,8 @@ const bmgtAll = [low(TBuildMatrixGroupType)..high(TBuildMatrixGroupType)]; type + TIsModeEvent = function(const ModeIdentifier: string): boolean of object; + TBuildMatrixOptions = class; TBMModesType = ( @@ -98,10 +100,13 @@ type function Equals(Obj: TObject): boolean; override; function GetModesSeparatedByComma(aTyp: TBMModesType): string; procedure SetModesFromCommaSeparatedList(aList: string; aTyp: TBMModesType); + procedure DisableModes(const DisableModeEvent: TIsModeEvent; aTyp: TBMModesType); + procedure EnableMode(const aMode: string; aTyp: TBMModesType); procedure LoadFromConfig(Cfg: TConfigStorage); procedure SaveToConfig(Cfg: TConfigStorage); procedure LoadFromXMLConfig(Cfg: TXMLConfig; const aPath: string); procedure SaveToXMLConfig(Cfg: TXMLConfig; const aPath: string); + function AsString: string; end; { TBuildMatrixOptions } @@ -122,6 +127,7 @@ type constructor Create; destructor Destroy; override; procedure Clear; + procedure DisableModes(const IsModeEvent: TIsModeEvent; aTyp: TBMModesType); function Count: integer; property Items[Index: integer]: TBuildMatrixOption read GetItems; default; function IndexOf(Option: TBuildMatrixOption): integer; @@ -144,6 +150,7 @@ type // queries procedure AppendCustomOptions(Target, ActiveMode: string; var Options: string); procedure GetOutputDirectory(Target, ActiveMode: string; var OutDir: string); + function FindOption(const ID: string): TBuildMatrixOption; end; EMMMacroSyntaxException = class(Exception) @@ -458,6 +465,15 @@ begin IncreaseChangeStep; end; +procedure TBuildMatrixOptions.DisableModes(const IsModeEvent: TIsModeEvent; + aTyp: TBMModesType); +var + i: Integer; +begin + for i:=0 to Count-1 do + Items[i].DisableModes(IsModeEvent,aTyp); +end; + function TBuildMatrixOptions.Count: integer; begin Result:=fItems.Count; @@ -539,11 +555,13 @@ var Option: TBuildMatrixOption; begin Clear; - Cnt:=Cfg.GetValue('Count',0); + Cnt:=Cfg.GetValue(aPath+'Count',0); + //debugln(['TBuildMatrixOptions.LoadFromXMLConfig Cnt=',Cnt]); for i:=1 to Cnt do begin Option:=TBuildMatrixOption.Create(Self); Option.LoadFromXMLConfig(Cfg,aPath+'item'+IntToStr(i)+'/'); end; + //debugln(['TBuildMatrixOptions.LoadFromXMLConfig Count=',Count]); end; procedure TBuildMatrixOptions.SaveToXMLConfig(Cfg: TXMLConfig; @@ -551,6 +569,7 @@ procedure TBuildMatrixOptions.SaveToXMLConfig(Cfg: TXMLConfig; var i: Integer; begin + //debugln(['TBuildMatrixOptions.SaveToXMLConfig ',aPath]); Cfg.SetDeleteValue(aPath+'Count',Count,0); for i:=0 to Count-1 do Items[i].SaveToXMLConfig(Cfg,aPath+'item'+IntToStr(i+1)+'/'); @@ -590,6 +609,17 @@ begin end; end; +function TBuildMatrixOptions.FindOption(const ID: string): TBuildMatrixOption; +var + i: Integer; +begin + for i:=0 to Count-1 do begin + Result:=Items[i]; + if Result.ID=ID then exit; + end; + Result:=nil; +end; + { TBuildMatrixOption } procedure TBuildMatrixOption.SetMacroName(AValue: string); @@ -740,6 +770,38 @@ begin Modes[aTyp]:=aList; end; +procedure TBuildMatrixOption.DisableModes(const DisableModeEvent: TIsModeEvent; + aTyp: TBMModesType); +var + CurModes: String; + p: PChar; + StartP: PChar; + CurMode: String; + StartPos: integer; +begin + CurModes:=Modes[aTyp]; + p:=PChar(CurModes); + while p^<>#0 do begin + StartP:=p; + while not (p^ in [#0,#10,#13]) do inc(p); + StartPos:=StartP-PChar(CurModes)+1; + CurMode:=copy(CurModes,StartPos,p-StartP); + while p^ in [#10,#13] do inc(p); + if DisableModeEvent(CurMode) then begin + System.Delete(CurModes,StartPos,p-StartP); + p:=Pointer(CurModes)+StartPos-1; + end; + end; + Modes[aTyp]:=CurModes; +end; + +procedure TBuildMatrixOption.EnableMode(const aMode: string; aTyp: TBMModesType + ); +begin + if FitsMode(aMode,aTyp) then exit; + Modes[aTyp]:=Modes[aTyp]+aMode+LineEnding; +end; + procedure TBuildMatrixOption.LoadFromConfig(Cfg: TConfigStorage); begin ID:=Cfg.GetValue('ID',''); @@ -766,6 +828,7 @@ begin ID:=Cfg.GetValue(aPath+'ID',''); Targets:=Cfg.GetValue(aPath+'Targets','*'); SetModesFromCommaSeparatedList(Cfg.GetValue(aPath+'Modes','*'),bmmtStored); + Modes[bmmtActive]:=Modes[bmmtStored]; Typ:=Str2BuildMatrixOptionType(Cfg.GetValue(aPath+'Type','')); MacroName:=Cfg.GetValue(aPath+'MacroName',''); Value:=Cfg.GetValue(aPath+'Value',''); @@ -782,5 +845,10 @@ begin Cfg.SetDeleteValue(aPath+'Value',Value,''); end; +function TBuildMatrixOption.AsString: string; +begin + Result:='ID="'+ID+'" '+BuildMatrixOptionTypeNames[Typ]+' Value="'+Value+'" ActiveModes="'+dbgstr(Modes[bmmtActive])+'"'; +end; + end. diff --git a/ide/project.pp b/ide/project.pp index 1cb5e8f042..9ef3bf6891 100644 --- a/ide/project.pp +++ b/ide/project.pp @@ -736,6 +736,7 @@ type procedure RemoveOnChangedHandler(const Handler: TNotifyEvent); function IsModified(InSession: boolean): boolean; function GetSessionModes: TStringList; + function IsSessionMode(const ModeIdentifier: string): boolean; public property Items[Index: integer]: TProjectBuildMode read GetItems; default; property ChangeStamp: integer read FChangeStamp; @@ -912,6 +913,7 @@ type function HasProjectInfoFileChangedOnDisk: boolean; procedure IgnoreProjectInfoFileOnDisk; function ReadProject(const NewProjectInfoFile: string; + GlobalMatrixOptions: TBuildMatrixOptions; ReadFlags: TProjectReadFlags = []): TModalResult; function WriteProject(ProjectWriteFlags: TProjectWriteFlags; const OverrideProjectInfoFile: string; @@ -2723,6 +2725,7 @@ function TProject.WriteProject(ProjectWriteFlags: TProjectWriteFlags; if not MatrixOption.FitsMode(CurMode.Identifier,bmmtActive) then continue; inc(Cnt); SubPath:=Path+'Item'+IntToStr(Cnt)+'/'; + //debugln(['SaveSessionEnabledNonSessionMatrixOptions ModeID="',CurMode.Identifier,'" OptionID="',MatrixOption.ID,'"']); XMLConfig.SetDeleteValue(SubPath+'Mode',CurMode.Identifier,''); XMLConfig.SetDeleteValue(SubPath+'Option',MatrixOption.ID,''); end; @@ -3183,7 +3186,8 @@ end; TProject ReadProject ------------------------------------------------------------------------------} function TProject.ReadProject(const NewProjectInfoFile: string; - ReadFlags: TProjectReadFlags): TModalResult; + GlobalMatrixOptions: TBuildMatrixOptions; ReadFlags: TProjectReadFlags + ): TModalResult; type TOldProjectType = (ptApplication, ptProgram, ptCustomProgram); const @@ -3195,6 +3199,50 @@ var FileVersion: Integer; NewMainUnitID: LongInt; + procedure EnableMatrixMode(MatrixOptions: TBuildMatrixOptions; + OptionID, ModeID: string); + var + MatrixOption: TBuildMatrixOption; + begin + if MatrixOptions=nil then exit; + MatrixOption:=MatrixOptions.FindOption(OptionID); + if MatrixOption=nil then exit; + //debugln(['EnableMatrixMode OptionID=',OptionID,' ModeID=',ModeID]); + MatrixOption.EnableMode(ModeID,bmmtActive); + end; + + procedure LoadSessionEnabledNonSessionMatrixOptions(XMLConfig: TXMLConfig; + const Path: string); + var + Cnt: integer; + i: Integer; + SubPath: String; + ModeID: String; + OptionID: String; + begin + // disable all matrix options in session modes + if GlobalMatrixOptions<>nil then + GlobalMatrixOptions.DisableModes(@BuildModes.IsSessionMode,bmmtActive); + BuildModes.SharedMatrixOptions.DisableModes(@BuildModes.IsSessionMode,bmmtActive); + // load + Cnt:=XMLConfig.GetValue(Path+'Count',0); + for i:=1 to Cnt do begin + SubPath:=Path+'Item'+IntToStr(i)+'/'; + ModeID:=XMLConfig.GetValue(SubPath+'Mode',''); + if (ModeID='') or (not BuildModes.IsSessionMode(ModeID)) then begin + debugln(['LoadSessionEnabledNonSessionMatrixOptions not a session Mode="',dbgstr(ModeID),'" at ',SubPath]); + continue; + end; + OptionID:=XMLConfig.GetValue(SubPath+'Option',''); + if OptionID='' then begin + debugln(['LoadSessionEnabledNonSessionMatrixOptions invalid option at ',SubPath]); + continue; + end; + EnableMatrixMode(GlobalMatrixOptions,OptionID,ModeID); + EnableMatrixMode(BuildModes.SharedMatrixOptions,OptionID,ModeID); + end; + end; + procedure LoadBuildModes(XMLConfig: TXMLConfig; const Path: string; LoadData: boolean); var @@ -3249,7 +3297,7 @@ var end else if LoadData then begin // no build modes => an old file format CompOptsPath:='CompilerOptions/'; - // due to an old bug, the XML path can be 'CompilerOptions/' or '' + // due to a bug in an old version, the XML path can be 'CompilerOptions/' or '' if (FileVersion<3) and (XMLConfig.GetValue('SearchPaths/CompilerPath/Value','')<>'') then CompOptsPath:=''; @@ -3262,18 +3310,17 @@ var if LoadData then begin // load matrix options of project (not session) BuildModes.SharedMatrixOptions.LoadFromXMLConfig(XMLConfig,Path+'BuildModes/SharedMatrixOptions/'); + //debugln(['LoadBuildModes BuildModes.SharedMatrixOptions.Count=',BuildModes.SharedMatrixOptions.Count]); + //for i:=0 to BuildModes.SharedMatrixOptions.Count-1 do + // debugln([' ',BuildModes.SharedMatrixOptions[i].AsString]); end; if (not LoadData) and (not LoadParts) then begin // load matrix options of session BuildModes.SessionMatrixOptions.LoadFromXMLConfig(XMLConfig,Path+'BuildModes/SessionMatrixOptions/'); - // disable matrix options in session build modes - // ToDo: - // load what matrix options are enabled in session build modes - // ToDo: - //Cnt:=0; - //SubPath:=Path+'BuildModes/SessionMatrixOptions/'; + SubPath:=Path+'BuildModes/SessionMatrixOptions/'; + LoadSessionEnabledNonSessionMatrixOptions(XMLConfig,SubPath); end; // set active mode @@ -7324,6 +7371,20 @@ begin end; end; +function TProjectBuildModes.IsSessionMode(const ModeIdentifier: string + ): boolean; +var + i: Integer; + BuildMode: TProjectBuildMode; +begin + for i:=0 to Count-1 do begin + BuildMode:=Items[i]; + if SysUtils.CompareText(BuildMode.Identifier,ModeIdentifier)=0 then + exit(BuildMode.InSession); + end; + Result:=false; +end; + initialization RegisterIDEOptionsGroup(GroupProject, TProject); RegisterIDEOptionsGroup(GroupCompiler, TProjectCompilerOptions); diff --git a/ide/sourcefilemanager.pas b/ide/sourcefilemanager.pas index d7cc2fe52e..180c534902 100644 --- a/ide/sourcefilemanager.pas +++ b/ide/sourcefilemanager.pas @@ -1935,7 +1935,7 @@ begin // read project info file {$IFDEF IDE_MEM_CHECK}CheckHeapWrtMemCnt('TLazSourceFileManager.OpenProjectFile B3');{$ENDIF} - Project1.ReadProject(AFilename); + Project1.ReadProject(AFilename,EnvironmentOptions.BuildMatrixOptions); {$IFDEF IDE_MEM_CHECK}CheckHeapWrtMemCnt('TLazSourceFileManager.OpenProjectFile B4');{$ENDIF} Result:=CompleteLoadingProjectInfo; finally