#99, restart DCD when possible

This commit is contained in:
Basile Burg 2016-11-10 14:30:26 +01:00
parent d7de93a500
commit e5551d4612
No known key found for this signature in database
GPG Key ID: 1868039F415CB8CF
2 changed files with 89 additions and 15 deletions

View File

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

View File

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