unit cfgcompoptreg; {$mode delphi}{$H+} interface uses Classes, SysUtils, Forms, Dialogs , LazIDEIntf, MenuIntf , cmdlinecfg, cmdlinecfgutils , cmdlinecfgjson, cmdlinecfgui, cmdlinecfguijson , optviewform , XMLConf; procedure Register; var listOfOpt : TList; listOfLayout : TList; CompOptVers : string; // the version of fpc compiler used CompOptCfg : TCmdLineCfg; // fpc compiler options CfgLayout : TCmdLineLayoutInfo; // compiler options layout hints implementation resourcestring mnuViewCfgCompilerOpt = 'Review Compiler Options'; function GetCompilerPath: string; var path : string; xml : TXMLConfig; begin //appears to be a hack, but is there a better way to do that? path := LazarusIDE.GetPrimaryConfigPath; xml := TXMLConfig.Create(nil); try xml.RootName:='CONFIG'; xml.Filename:=IncludeTrailingPathDelimiter(path)+'environmentoptions.xml'; Result:=xml.GetValue('EnvironmentOptions/CompilerFilename/Value', ''); finally xml.Free; end; end; procedure ReviewCompOpt(Sender: TObject); var cmp : string; begin if not Assigned(CompOptCfg) then begin cmp:=GetCompilerPath; if cmp<>'' then CompOptCfg:=CmdLineCfgDetect(listOfOpt, ExtractFileDir(cmp), cmp); end; //todo: better selection of default options if not Assigned(CompOptCfg) and (listOfOpt.Count>0) then CompOptCfg:=TCmdLineCfg(listOfOpt[0]); if not Assigned(CompOptCfg) then begin ShowMessage('Unable to detect the compiler version.'); Exit; end; if Assigned(LazarusIDE.ActiveProject) then begin if not Assigned(OptView) then OptView:=TOptView.Create(Application); ReviewOpts(CompOptCfg, CfgLayout); end; end; procedure DoRegister; var cmd : TIDEMenuCommand; begin cmd := RegisterIDEMenuCommand(itmProjectWindowSection, 'showCfgCompOpt', mnuViewCfgCompilerOpt, nil, ReviewCompOpt, nil, ''); end; procedure ReadConfig; var path : string; begin path:=ExcludeTrailingPathDelimiter(LazarusIDE.GetPrimaryConfigPath); if not DirectoryExists( path ) then path:=ExcludeTrailingPathDelimiter(LazarusIDE.GetSecondaryConfigPath ); CmdLineCfgJSONLoadFilesFromDir( path , listOfOpt ); CmdLineCfgUIJSONLoadFilesFromDir( path , listOfLayout ); //todo: make a smarter layout selection if listOfLayout.Count>0 then CfgLayout:=TCmdLineLayoutInfo(listOfLayout[0]); end; procedure Register; begin try DoRegister; ReadConfig; except end; end; procedure Init; begin listOfOpt := TList.Create; listOfLayout := TList.Create; end; procedure Release; var i : integer; begin for i:=0 to listOfOpt.Count-1 do TObject(listOfOpt[i]).Free; listOfOpt.Free; for i:=0 to listOfLayout.Count-1 do TObject(listOfLayout[i]).Free; listOfLayout.Free; end; initialization Init; finalization Release; end.