diff --git a/src/ce_compilers.pas b/src/ce_compilers.pas index 5c896ead..8a8919ed 100644 --- a/src/ce_compilers.pas +++ b/src/ce_compilers.pas @@ -12,8 +12,6 @@ uses type - //TODO-cCompilerPaths: add a way to relaunch DCD after compiler change - TCompilersPaths = class(TWritableLfmTextComponent) strict private fDefaultCompiler: DCompiler; @@ -75,7 +73,7 @@ type procedure assign(source: TPersistent); override; end; - TForm1 = class(TForm, ICEEditableOptions, ICECompilerSelector) + TForm1 = class(TForm, ICEEditableOptions, ICECompilerSelector, ICEProjectObserver) selDefault: TComboBox; selDMDrt: TDirectoryEdit; selUSER2std: TDirectoryEdit; @@ -118,6 +116,7 @@ type strict private fPaths: TCompilersPaths; fPathsBackup: TCompilersPaths; + fProj: ICECommonProject; procedure selectedExe(sender: TObject; var value: string); procedure selectedRt(sender: TObject; var value: string); procedure selectedStd(sender: TObject; var value: string); @@ -137,6 +136,14 @@ type function isCompilerValid(value: DCompiler): boolean; function getCompilerPath(value: DCompiler): string; procedure getCompilerImports(value: DCompiler; paths: TStrings); + // + procedure projNew(project: ICECommonProject); + procedure projChanged(project: ICECommonProject); + procedure projClosing(project: ICECommonProject); + procedure projFocused(project: ICECommonProject); + procedure projCompiling(project: ICECommonProject); + procedure projCompiled(project: ICECommonProject; success: boolean); + procedure updateDCD; public constructor create(aOwner: TComponent); override; destructor destroy; override; @@ -145,6 +152,9 @@ type implementation {$R *.lfm} +uses + ce_libman; + var Form1: TForm1; @@ -155,7 +165,6 @@ const constructor TForm1.create(aOwner: TComponent); var fname: string; - imprt: TStringList; begin inherited; fPaths:= TCompilersPaths.Create(self); @@ -173,13 +182,7 @@ begin fPathsBackup.Assign(fPaths); dataToGui; - imprt := TStringList.Create; - try - getCompilerImports(fPaths.defaultCompiler, imprt); - DcdWrapper.addImportFolders(imprt); - finally - imprt.free; - end; + updateDCD; selDMDexe.OnAcceptFileName:= @selectedExe; selGDCexe.OnAcceptFileName:= @selectedExe; @@ -396,6 +399,35 @@ begin end; {$ENDREGION} +{$REGION ICEProjectObserver ----------------------------------------------------} +procedure TForm1.projNew(project: ICECommonProject); +begin +end; + +procedure TForm1.projChanged(project: ICECommonProject); +begin +end; + +procedure TForm1.projClosing(project: ICECommonProject); +begin + if fProj = project then + fProj := nil; +end; + +procedure TForm1.projFocused(project: ICECommonProject); +begin + fProj := project; +end; + +procedure TForm1.projCompiling(project: ICECommonProject); +begin +end; + +procedure TForm1.projCompiled(project: ICECommonProject; success: boolean); +begin +end; +{$ENDREGION} + {$REGION ICEEditableOptions ----------------------------------------------------} function TForm1.optionedWantCategory(): string; begin @@ -420,8 +452,19 @@ begin begin fPathsBackup.assign(fPaths); if fPaths.wouldNeedRestart and fPaths.modified then - dlgOkInfo('A restart might be necessary so that DCD caches a different version' - + 'of the runtime and the standard library.'); + begin + if not DCDWrapper.launchedByCe then + dlgOkInfo('Coedit and DCD must be restarted manually in order to cache' + + ' the right runtime and the standard library versions.') + else + begin + DCDWrapper.relaunch; + updateDCD; + LibMan.updateDCD; + if assigned(fProj) then + fProj.activate; + end; + end; fPaths.modified:=false; fPaths.wouldNeedRestart:=false; end; @@ -496,6 +539,19 @@ end; {$ENDREGION} {$REGION Compilers paths things ------------------------------------------------} +procedure TForm1.updateDCD; +var + imprt: TStringList; +begin + imprt := TStringList.Create; + try + getCompilerImports(fPaths.defaultCompiler, imprt); + DcdWrapper.addImportFolders(imprt); + finally + imprt.free; + end; +end; + procedure TForm1.dataToGui; begin with fPaths do diff --git a/src/ce_dcd.pas b/src/ce_dcd.pas index dc610d05..a383f055 100644 --- a/src/ce_dcd.pas +++ b/src/ce_dcd.pas @@ -41,6 +41,7 @@ type procedure updateServerlistening; procedure writeSourceToInput; inline; function checkDcdSocket: boolean; + function getIfLaunched: boolean; // procedure projNew(project: ICECommonProject); procedure projChanged(project: ICECommonProject); @@ -59,6 +60,8 @@ type constructor create(aOwner: TComponent); override; destructor destroy; override; // + class procedure relaunch; static; + // procedure addImportFolders(const folders: TStrings); procedure addImportFolder(const folder: string); procedure getComplAtCursor(list: TStringList); @@ -68,6 +71,7 @@ type procedure getLocalSymbolUsageFromCursor(var locs: TIntOpenArray); // property available: boolean read fAvailable; + property launchedByCe: boolean read getIfLaunched; end; function DCDWrapper: TCEDcdWrapper; @@ -105,7 +109,8 @@ begin fClient.ShowWindow := swoHIDE; // fServerWasRunning := AppIsRunning((serverName)); - if not fServerWasRunning then begin + if not fServerWasRunning then + begin fServer := TProcess.Create(self); fServer.Executable := exeFullName(serverName); fServer.Options := [{$IFDEF WINDOWS} poNewConsole{$ENDIF}]; @@ -133,6 +138,17 @@ begin EntitiesConnector.addObserver(self); end; +class procedure TCEDcdWrapper.relaunch; +begin + fDcdWrapper.Free; + fDcdWrapper := TCEDcdWrapper.create(nil); +end; + +function TCEDcdWrapper.getIfLaunched: boolean; +begin + result := fServer.isNotNil; +end; + procedure TCEDcdWrapper.updateServerlistening; begin fServerListening := AppIsRunning((serverName)); @@ -159,6 +175,7 @@ begin i +=1; end; end; + fServer.Terminate(0); fServer.Free; end; fClient.Free; @@ -320,7 +337,8 @@ begin fClient.Parameters.Clear; fClient.Parameters.Add('--shutdown'); fClient.Execute; - sleep(500); + while fServer.Running or fClient.Running do + sleep(50); end; procedure TCEDcdWrapper.waitClient;