@@ -285,6 +285,7 @@ class Package : DisposingComObject,
285285 mLangsvc = addref(newCom! LanguageService(this ));
286286 mProjFactory = addref(newCom! ProjectFactory(this ));
287287 mLibInfos = new LibraryInfos();
288+ mCheckMessages = new UpdateMessages();
288289 }
289290
290291 ~this ()
@@ -675,7 +676,7 @@ version(none)
675676 }
676677 if (nCmdID == CmdShowLangPage)
677678 {
678- openSettingsPage(" 002A2DE9-8BB6-484D-9823-7E4AD4084715 " );
679+ openSettingsPage(g_IntellisensePropertyPage );
679680 return S_OK ;
680681 }
681682 if (nCmdID == CmdShowWebsite)
@@ -699,6 +700,48 @@ version(none)
699700 {
700701 auto opts = GetGlobalOptions();
701702
703+ enum Result { kNotSet, kBinaryExists, kBinaryMissing }
704+ Result checkInstalledBinary (CheckProduct prod)
705+ {
706+ string exe;
707+ switch (prod)
708+ {
709+ case CheckProduct.DMD :
710+ exe = opts.DMD .getCompilerPath(opts.DMD .InstallDir);
711+ break ;
712+ case CheckProduct.GDC :
713+ exe = opts.GDC .getCompilerPath(opts.GDC .InstallDir);
714+ break ;
715+ case CheckProduct.LDC :
716+ exe = opts.LDC .getCompilerPath(opts.LDC .InstallDir);
717+ break ;
718+ default :
719+ return Result.kNotSet;
720+ }
721+ if (exe.empty)
722+ return Result.kNotSet;
723+ if (std.file.exists (exe))
724+ return Result.kBinaryExists;
725+ return Result.kBinaryMissing;
726+ }
727+
728+ void showMissingBinaryInfo (CheckProduct prod)
729+ {
730+ switch (prod)
731+ {
732+ case CheckProduct.DMD :
733+ mCheckMessages.addMessage(" Visual D: DMD installation directory invalid" , " Goto DMD Setup Page" ,
734+ (int ) { openSettingsPage(g_DmdDirPropertyPage); return true ; });
735+ break ;
736+ case CheckProduct.LDC :
737+ mCheckMessages.addMessage(" Visual D: LDC installation directory invalid" , " Goto LDC Setup Page" ,
738+ (int ) { openSettingsPage(g_LdcDirPropertyPage); return true ; });
739+ break ;
740+ default :
741+ break ;
742+ }
743+ }
744+
702745 string getInstalledVersion (CheckProduct prod)
703746 {
704747 switch (prod)
@@ -716,17 +759,31 @@ version(none)
716759
717760 string checkProduct (CheckProduct prod, ubyte freq)
718761 {
762+ if (prod != CheckProduct.VisualD)
763+ {
764+ auto res = checkInstalledBinary(prod);
765+ if (res == Result.kNotSet)
766+ return null ;
767+
768+ if (res == Result.kBinaryMissing)
769+ {
770+ showMissingBinaryInfo(prod);
771+ return null ;
772+ }
773+ }
774+
719775 CheckFrequency frequency = cast (CheckFrequency)freq;
720- if (frequency != CheckFrequency.Never)
721- if (auto info = checkForUpdate(prod, toDuration(frequency), frequency))
722- if (info.updated)
723- {
724- string ver = getInstalledVersion(prod);
725- if (extractVersion(ver) >= extractVersion(info.name))
726- return null ;
727- return info.name;
728- }
729- return null ;
776+ if (frequency == CheckFrequency.Never)
777+ return null ;
778+
779+ auto info = checkForUpdate(prod, toDuration(frequency), frequency);
780+ if (! info || ! info.updated)
781+ return null ;
782+
783+ string ver = getInstalledVersion(prod);
784+ if (extractVersion(ver) >= extractVersion(info.name))
785+ return null ;
786+ return info.name;
730787 }
731788
732789 string [3 ] msgs;
@@ -745,30 +802,27 @@ version(none)
745802 cnt++ ;
746803 }
747804
748- if (cnt == 1 )
749- mUpdateCheckMessage = " New update available: " ~ message;
805+ if (cnt > 1 )
806+ message = " Visual D: New update available: " ~ message;
750807 else if (cnt > 1 )
751- mUpdateCheckMessage = " New updates available: " ~ message;
752- else
753- mUpdateCheckMessage = null ;
808+ message = " Visual D: New updates available: " ~ message;
809+
810+ if (message)
811+ mCheckMessages.addMessage(message, " Goto Update Page" ,
812+ (int ) { openSettingsPage(g_UpdatePropertyPage); return true ; });
754813 }
755814
756815 void idleCheckUpdates ()
757816 {
758- if (! mHasMadeUpdateCheck &&
759- (GetGlobalOptions().checkUpdatesVisualD != CheckFrequency.Never ||
760- GetGlobalOptions().checkUpdatesDMD != CheckFrequency.Never ||
761- GetGlobalOptions().checkUpdatesLDC != CheckFrequency.Never))
817+ if (! mHasMadeUpdateCheck)
762818 {
763819 import core.thread ;
764820 mHasMadeUpdateCheck = true ;
765821 new Thread (&checkUpdates).start();
766822 }
767- else if (mUpdateCheckMessage )
823+ else if (mCheckMessages.hasMessages() )
768824 {
769- showInfoBar(mUpdateCheckMessage, " Goto Update Page" ,
770- (int ) { openSettingsPage(" 002A2DE9-8BB6-484D-9829-7E4AD4084715" ); return true ; });
771- mUpdateCheckMessage = null ;
825+ mCheckMessages.showMessages();
772826 }
773827
774828 if (mSaveOptionsInIdle)
@@ -1295,9 +1349,42 @@ private:
12951349 Library mLibrary;
12961350 bool mWantsUpdateLibInfos;
12971351
1352+ bool mHasMadePatchCheck;
12981353 bool mHasMadeUpdateCheck;
12991354 bool mSaveOptionsInIdle;
1300- string mUpdateCheckMessage;
1355+ UpdateMessages mCheckMessages;
1356+ }
1357+
1358+ class UpdateMessages
1359+ {
1360+ static struct UpdateMessage
1361+ {
1362+ string message;
1363+ string action;
1364+ bool delegate (int ) callback;
1365+ }
1366+
1367+ UpdateMessage[] messages;
1368+
1369+ void addMessage (string msg, string action, bool delegate (int ) callback)
1370+ {
1371+ synchronized (this )
1372+ messages ~= UpdateMessage(msg, action, callback);
1373+ }
1374+ bool hasMessages () const
1375+ {
1376+ return messages.length > 0 ;
1377+ }
1378+
1379+ void showMessages ()
1380+ {
1381+ synchronized (this )
1382+ {
1383+ foreach (m; messages)
1384+ showInfoBar(m.message, m.action, m.callback);
1385+ messages = null ;
1386+ }
1387+ }
13011388}
13021389
13031390struct CompilerDirectories
@@ -1346,6 +1433,8 @@ struct CompilerDirectories
13461433 }
13471434 string getCompilerPath (string instdir)
13481435 {
1436+ if (instdir.empty)
1437+ return null ;
13491438 string exe;
13501439 if (compiler == Compiler.DMD )
13511440 {
0 commit comments