[commit] r2780 - in trunk: GME/Gme GME/Interfaces GME/MgaUtil Install

GMESRC Repository Notifications gme-commit at list.isis.vanderbilt.edu
Tue Apr 7 10:44:15 CDT 2020


Author: ksmyth
Date: Tue Apr  7 10:44:15 2020
New Revision: 2780

Log:
Help Menu Functionality for Components and Paradigms

Modified:
   trunk/GME/Gme/GME.rc
   trunk/GME/Gme/GMEApp.cpp
   trunk/GME/Gme/GMEApp.h
   trunk/GME/Gme/GuiMeta.cpp
   trunk/GME/Gme/GuiMeta.h
   trunk/GME/Gme/MainFrm.cpp
   trunk/GME/Gme/MainFrm.h
   trunk/GME/Gme/resource.h
   trunk/GME/Interfaces/MgaUtil.idl
   trunk/GME/MgaUtil/MgaRegistrar.cpp
   trunk/GME/MgaUtil/MgaRegistrar.h
   trunk/GME/MgaUtil/MgaUtil.vcxproj
   trunk/GME/MgaUtil/MgaUtilLib.idl
   trunk/GME/MgaUtil/StdAfx.h
   trunk/Install/GME_bin.wxs

Modified: trunk/GME/Gme/GME.rc
==============================================================================
--- trunk/GME/Gme/GME.rc	Thu Sep 26 13:26:13 2019	(r2779)
+++ trunk/GME/Gme/GME.rc	Tue Apr  7 10:44:15 2020	(r2780)
@@ -255,6 +255,8 @@
     END
     POPUP "&Help"
     BEGIN
+        MENUITEM "&Paradigm Help",              ID_HELP_PARADIGMHELP
+        MENUITEM "C&omponent Help",             ID_HELP_COMPONENTHELP
         MENUITEM "&Contents",                   ID_HELP_CONTENTS
         MENUITEM "&About GME...",               ID_APP_ABOUT
     END
@@ -396,6 +398,8 @@
     END
     POPUP "&Help"
     BEGIN
+        MENUITEM "&Paradigm Help",              ID_HELP_PARADIGMHELP
+        MENUITEM "C&omponent Help",             ID_HELP_COMPONENTHELP
         MENUITEM "&Contents",                   ID_HELP_CONTENTS
         MENUITEM "&Help",                       ID_HELP_HELP
         MENUITEM "&About GME...",               ID_APP_ABOUT
@@ -1789,4 +1793,3 @@
 1 TYPELIB "GmeLib.tlb"
 /////////////////////////////////////////////////////////////////////////////
 #endif    // not APSTUDIO_INVOKED
-

Modified: trunk/GME/Gme/GMEApp.cpp
==============================================================================
--- trunk/GME/Gme/GMEApp.cpp	Thu Sep 26 13:26:13 2019	(r2779)
+++ trunk/GME/Gme/GMEApp.cpp	Tue Apr  7 10:44:15 2020	(r2780)
@@ -124,6 +124,8 @@
 	ON_COMMAND_EX_RANGE(ID_FILE_MRU_PRJ1, ID_FILE_MRU_PRJ16, OnOpenRecentProject)
 	ON_COMMAND_RANGE(ID_FILE_RUNPLUGIN1, ID_FILE_RUNPLUGIN_LAST, OnRunPlugin)
 	ON_COMMAND_RANGE(ID_FILE_INTERPRET1, ID_FILE_INTERPRET_LAST, OnRunInterpreter)
+	ON_COMMAND_RANGE(ID_HELP_PARADIGMHELP_FIRST, ID_HELP_PARADIGMHELP_LAST, OnRunParadigmHelp)
+	ON_COMMAND_RANGE(ID_HELP_COMPONENTHELP_FIRST, ID_HELP_COMPONENTHELP_LAST, OnRunComponentHelp)
 	ON_UPDATE_COMMAND_UI_RANGE( ID_FILE_RUNPLUGIN1, ID_FILE_RUNPLUGIN_LAST, OnUpdateFilePluginX)
 	ON_UPDATE_COMMAND_UI_RANGE( ID_FILE_INTERPRET1, ID_FILE_INTERPRET_LAST, OnUpdateFileInterpretX)
 	ON_COMMAND(ID_FOCUS_BROWSER, OnFocusBrowser)
@@ -141,7 +143,7 @@
 
 /*static*/ const TCHAR * CGMEApp::m_no_model_open_string = _T("_NO_MODEL_IS_OPEN_");
 
-static CComBSTR StringFromGUID2(const CComVariant& guid)
+CComBSTR StringFromGUID2(const CComVariant& guid)
 {
 	ASSERT(guid.vt == (VT_UI1 | VT_ARRAY));
 	GUID guid2;
@@ -1137,12 +1139,13 @@
 
 void CGMEApp::UpdateComponentLists(bool restart_addons)
 {
-	ClearDisabledComps();	
-	plugins .RemoveAll();
+	ClearDisabledComps();
+	plugins.RemoveAll();
 	pluginTooltips.RemoveAll();
 	interpreters.RemoveAll();
 	interpreterTooltips.RemoveAll();
-	CStringArray tempaddons; tempaddons.Copy(addons);
+	CStringArray tempaddons;
+	tempaddons.Copy(addons);
 	addons.RemoveAll();
 	mgaConstMgr = NULL;
 	if(mgaMetaProject) {
@@ -1182,6 +1185,48 @@
 				}
 			}
 		}
+
+		this->addonOnlineHelp.RemoveAll(); this->addonOfflineHelp.RemoveAll();
+		this->pluginOnlineHelp.RemoveAll(); this->pluginOfflineHelp.RemoveAll();
+		this->interpreterOnlineHelp.RemoveAll(); this->interpreterOfflineHelp.RemoveAll();
+		for (INT i = 0; i < this->plugins.GetSize() + this->interpreters.GetSize() + this->addons.GetSize(); ++i) {
+			HRESULT errCode;
+			CString onlineHelp;
+			CString offlineHelp;
+			CComBSTR componentName =
+				(i < plugins.GetSize()
+					? plugins[i]
+					: (i < plugins.GetSize() + interpreters.GetSize()
+						? interpreters[i - plugins.GetSize()]
+						: addons[i - plugins.GetSize() - interpreters.GetSize()]));
+
+			errCode = reg->get_ComponentExtraInfo(REGACCESS_PRIORITY, componentName, CComBSTR(L"OnlineHelp"), PutOut(onlineHelp));
+			if (errCode != S_OK || onlineHelp.IsEmpty())
+			{
+				onlineHelp = L"";
+			}
+			errCode = reg->get_ComponentExtraInfo(REGACCESS_PRIORITY, componentName, CComBSTR(L"OfflineHelp"), PutOut(offlineHelp));
+			if (errCode != S_OK || offlineHelp.IsEmpty())
+			{
+				offlineHelp = L"";
+			}
+			if (i < this->plugins.GetSize())
+			{
+				this->pluginOnlineHelp.Add(onlineHelp);
+				this->pluginOfflineHelp.Add(offlineHelp);
+			}
+			else if (i < this->plugins.GetSize() + this->interpreters.GetSize())
+			{
+				this->interpreterOnlineHelp.Add(onlineHelp);
+				this->interpreterOfflineHelp.Add(offlineHelp);
+			}
+			else
+			{
+				this->addonOnlineHelp.Add(onlineHelp);
+				this->addonOfflineHelp.Add(offlineHelp);
+			}
+		}
+
 		// access constraint mgr
 		FindConstraintManager();
 
@@ -1194,6 +1239,8 @@
 {
 	CString runPluginLabel = _T("R&un Plug-In");
 	CString runInterpreterLabel = _T("Run In&terpreter");
+	CString helpParadigmLabel = _T("&Paradigm Help");
+	CString helpComponentLabel = _T("C&omponent Help");
 	CString label;
 	// [ Begin workaround
 	// If you just go left to the Window menu next to the Tools menu, and back to the Tools menu (so not even abandoming the menubar)
@@ -1222,7 +1269,7 @@
 		for(UINT idx = 0; idx < toolmenu->GetMenuItemCount(); idx++) {
 			toolmenu->GetMenuString(idx, label, MF_BYPOSITION);
 			UINT menuID = toolmenu->GetMenuItemID(idx);
-			if (menuID == ID_TOOLS_RUNPLUG || menuID == ID_FILE_RUNINTERPRETER) {
+			if (menuID == ID_TOOLS_RUNPLUG || menuID == ID_FILE_RUNINTERPRETER || menuID == ID_HELP_COMPONENTHELP || menuID == ID_HELP_PARADIGMHELP) {
 				dynmenus_need_refresh = true;
 				break;
 			}
@@ -1244,7 +1291,8 @@
 				if (plugins.GetSize() == 1) {
 					toolmenu->InsertMenu(idx, MF_BYPOSITION | MF_ENABLED,
 										ID_FILE_RUNPLUGIN1, pluginTooltips[0]);
-				} else {
+				}
+				else {
 					CMenu pluginmenu;
 					pluginmenu.CreatePopupMenu();
 					for(int i = 0; i < min(plugins.GetSize(), ID_FILE_RUNPLUGIN_LAST - ID_FILE_RUNPLUGIN1); ++i) {
@@ -1256,7 +1304,8 @@
 				}
 				found = true;
 			}
-		} else if (!label.CompareNoCase(runInterpreterLabel) ||
+		}
+		else if (!label.CompareNoCase(runInterpreterLabel) ||
 					menuID == ID_FILE_RUNINTERPRETER || menuID == ID_FILE_INTERPRET1)
 		{
 			if (dynmenus_need_refresh) {
@@ -1264,7 +1313,8 @@
 				if (interpreters.GetSize() == 1) {
 					toolmenu->InsertMenu(idx, MF_BYPOSITION | MF_ENABLED,
 										ID_FILE_INTERPRET1, interpreterTooltips[0]);
-				} else {
+				}
+				else {
 					CMenu pluginmenu;
 					pluginmenu.CreatePopupMenu();
 
@@ -1293,12 +1343,93 @@
 				found = true;
 			}
 		}
+		else if (!label.CompareNoCase(helpComponentLabel) ||
+			menuID == ID_HELP_COMPONENTHELP || menuID == ID_HELP_COMPONENTHELP_FIRST)
+		{
+			if (dynmenus_need_refresh) {
+				toolmenu->DeleteMenu(idx, MF_BYPOSITION);
+				CMenu helpComponent;
+				helpComponent.CreatePopupMenu();
+				for (int i = 0; i < min(plugins.GetSize() + interpreters.GetSize() + addons.GetSize(), ID_HELP_COMPONENTHELP_LAST - ID_HELP_COMPONENTHELP_FIRST);) {
+					int index = i / 2;
+					CString componentName = (index < plugins.GetSize() ?
+						pluginTooltips[index] : (index < plugins.GetSize() + interpreters.GetSize() ?
+						interpreterTooltips[index - plugins.GetSize()] : addons[index - plugins.GetSize() - interpreters.GetSize()]));
+					CString onlineHelpLocation = (index < plugins.GetSize() ?
+							pluginOnlineHelp[index] : (index < plugins.GetSize() + interpreters.GetSize() ?
+								interpreterOnlineHelp[index - plugins.GetSize()] : addonOnlineHelp[index - plugins.GetSize() - interpreters.GetSize()]));
+					CString offlineHelpLocation = (index < plugins.GetSize() ?
+							pluginOfflineHelp[index] : (index < plugins.GetSize() + interpreters.GetSize() ?
+								interpreterOfflineHelp[index - plugins.GetSize()] : addonOfflineHelp[index - plugins.GetSize() - interpreters.GetSize()]));
+
+					CMenu help;
+					help.CreatePopupMenu();
+					if (!onlineHelpLocation.IsEmpty())
+					{
+						help.AppendMenu(MF_ENABLED, ID_HELP_COMPONENTHELP_FIRST + i++, L"Online Help");
+					}
+					else
+					{
+						++i;
+					}
+
+					if (!offlineHelpLocation.IsEmpty())
+					{
+						help.AppendMenu(MF_ENABLED, ID_HELP_COMPONENTHELP_FIRST + i++, L"Offline Help");
+					}
+					else
+					{
+						++i;
+					}
+
+					if (help.GetMenuItemCount() != 0)
+					{
+						helpComponent.InsertMenu(index, MF_BYPOSITION | MF_POPUP | MF_ENABLED, (UINT_PTR)help.Detach(), componentName);
+					}
+				}
+				toolmenu->InsertMenu(idx,
+					helpComponent.GetMenuItemCount() ? MF_BYPOSITION | MF_POPUP | MF_ENABLED : MF_BYPOSITION | MF_POPUP | MF_GRAYED,
+					(UINT_PTR)helpComponent.Detach(), helpComponentLabel);
+				found = true;
+			}
+		}
+		else if (!label.CompareNoCase(helpParadigmLabel) ||
+			menuID == ID_HELP_PARADIGMHELP || menuID == ID_HELP_PARADIGMHELP_FIRST)
+		{
+			if (dynmenus_need_refresh && mgaProject) {
+				toolmenu->DeleteMenu(idx, MF_BYPOSITION);
+				CComBSTR pname = guiMetaProject->name;
+				CComBSTR pguidstr = guiMetaProject->guid;
+
+				CMenu help;
+				help.CreatePopupMenu();
+				CComPtr<IMgaRegistrar2> reg;
+				HRESULT hr = reg.CoCreateInstance(CComBSTR(L"Mga.MgaRegistrar"));
+				if (SUCCEEDED(hr))
+				{
+					reg->GetParadigmExtraInfoDisp(pname, pguidstr, CComBSTR(L"OnlineHelp"), PutOut(this->paradigmOnlineHelp));
+					reg->GetParadigmExtraInfoDisp(pname, pguidstr, CComBSTR(L"OfflineHelp"), PutOut(this->paradigmOfflineHelp));
+				}
+
+				if (!this->paradigmOnlineHelp.IsEmpty())
+				{
+					help.AppendMenu(MF_ENABLED, ID_HELP_PARADIGMHELP_FIRST, L"Online Help");
+				}
+				if (!this->paradigmOfflineHelp.IsEmpty())
+				{
+					help.AppendMenu(MF_ENABLED, ID_HELP_PARADIGMHELP_LAST, L"Offline Help");
+				}
+				toolmenu->InsertMenu(idx,
+					help.GetMenuItemCount() != 0 ? MF_BYPOSITION | MF_POPUP | MF_ENABLED : MF_BYPOSITION | MF_POPUP | MF_GRAYED,
+					(UINT_PTR)help.Detach(), pname);
+				found = true;
+			}
+		}
 	}
 	if (found)
 		dynmenus_need_refresh = false;
 }
 
-
 // throws exceptions!!
 void CGMEApp::AfterOpenOrCreateProject(const CString &conn)
 {
@@ -2972,7 +3103,38 @@
 	RunComponent(interpreters[nID - ID_FILE_INTERPRET1]);
 }
 
+void CGMEApp::OnRunComponentHelp(UINT nID) {
+	UINT id = (nID - ID_HELP_COMPONENTHELP_FIRST) / 2;
+	bool isEven = (nID - ID_HELP_COMPONENTHELP_FIRST) % 2 == 0;
+	CGMEEventLogger::LogGMEEvent(_T("CGMEApp::OnRunComponentHelp ") +
+		(id < plugins.GetSize() ?
+			plugins[id] : (id < plugins.GetSize() + interpreters.GetSize() ?
+				interpreters[id - plugins.GetSize()] : addons[id - plugins.GetSize() - interpreters.GetSize()])) +
+		_T("\r\n"));
+
+	CString onlineHelpLocation = (id < plugins.GetSize() ?
+			pluginOnlineHelp[id] : (id < plugins.GetSize() + interpreters.GetSize() ?
+				interpreterOnlineHelp[id - plugins.GetSize()] : addonOnlineHelp[id - plugins.GetSize() - interpreters.GetSize()]));
+	CString offlineHelpLocation = (id < plugins.GetSize() ?
+			pluginOfflineHelp[id] : (id < plugins.GetSize() + interpreters.GetSize() ?
+				interpreterOfflineHelp[id - plugins.GetSize()] : addonOfflineHelp[id - plugins.GetSize() - interpreters.GetSize()]));
+
+	ShellExecute(NULL, L"open", (isEven ? onlineHelpLocation : offlineHelpLocation), NULL, NULL, SW_SHOWNORMAL);
+}
+
+void CGMEApp::OnRunParadigmHelp(UINT nID)
+{
+	CComBSTR pname = guiMetaProject->name;
+
+	CGMEEventLogger::LogGMEEvent((_T("CGMEApp::OnRunParadigmHelp ") +
+		std::wstring(static_cast<const wchar_t*>(pname)) + _T("\r\n")).c_str());
 
+	CString help = (nID == ID_HELP_PARADIGMHELP_FIRST ? this->paradigmOnlineHelp : this->paradigmOfflineHelp);
+	if (!help.IsEmpty())
+	{
+		ShellExecute(NULL, L"open", help, NULL, NULL, SW_SHOWNORMAL);
+	}
+}
 
 void CGMEApp::RunComponent(const CString &compname)
 {

Modified: trunk/GME/Gme/GMEApp.h
==============================================================================
--- trunk/GME/Gme/GMEApp.h	Thu Sep 26 13:26:13 2019	(r2779)
+++ trunk/GME/Gme/GMEApp.h	Tue Apr  7 10:44:15 2020	(r2780)
@@ -50,7 +50,10 @@
 	CComPtr<IMgaMetaProject> mgaMetaProject;
 //  dynamic menus
 	CStringArray plugins, interpreters, addons;
-    CStringArray pluginTooltips, interpreterTooltips, addonToolTips;
+	CStringArray pluginTooltips, interpreterTooltips;
+	CStringArray pluginOnlineHelp, interpreterOnlineHelp, addonOnlineHelp;
+	CStringArray pluginOfflineHelp, interpreterOfflineHelp, addonOfflineHelp;
+	CString paradigmOnlineHelp, paradigmOfflineHelp;
 	bool dynmenus_need_refresh;
 
 	// Application look
@@ -233,6 +236,8 @@
 	afx_msg void OnFileXMLUpdate();
 	afx_msg void OnRunPlugin(UINT nID);
 	afx_msg void OnRunInterpreter(UINT nID);
+	afx_msg void OnRunComponentHelp(UINT nID);
+	afx_msg void OnRunParadigmHelp(UINT nID);
 	afx_msg void OnUpdateFilePluginX(CCmdUI* pCmdUI);
 	afx_msg void OnUpdateFileInterpretX(CCmdUI* pCmdUI);
 	afx_msg void OnFileDisplayConstraints();

Modified: trunk/GME/Gme/GuiMeta.cpp
==============================================================================
--- trunk/GME/Gme/GuiMeta.cpp	Thu Sep 26 13:26:13 2019	(r2779)
+++ trunk/GME/Gme/GuiMeta.cpp	Tue Apr  7 10:44:15 2020	(r2780)
@@ -5,6 +5,7 @@
 #include "GuiMeta.h"
 #include "GuiObject.h"
 
+CComBSTR StringFromGUID2(const CComVariant& guid);
 
 // helper functions
 
@@ -66,6 +67,11 @@
 			COMTHROW(mgaMeta->get_DisplayedName(&bstr));
 			CopyTo(bstr,displayedName);
 		}
+		{
+			CComVariant pguid;
+			COMTHROW(mgaMeta->get_GUID(&pguid));
+			guid = StringFromGUID2(pguid);
+		}
 
 		CComPtr<IMgaMetaFolder> mmFolder;
 		COMTHROW(mgaMeta->get_RootFolder(&mmFolder));

Modified: trunk/GME/Gme/GuiMeta.h
==============================================================================
--- trunk/GME/Gme/GuiMeta.h	Thu Sep 26 13:26:13 2019	(r2779)
+++ trunk/GME/Gme/GuiMeta.h	Tue Apr  7 10:44:15 2020	(r2780)
@@ -15,6 +15,7 @@
 	~CGuiMetaProject();
 public:
 	CString name;
+	CString guid;
 	CString displayedName;
 	CGuiMetaFolder *rootFolder;
 	CGuiMetaBaseTable metaTable;

Modified: trunk/GME/Gme/MainFrm.cpp
==============================================================================
--- trunk/GME/Gme/MainFrm.cpp	Thu Sep 26 13:26:13 2019	(r2779)
+++ trunk/GME/Gme/MainFrm.cpp	Tue Apr  7 10:44:15 2020	(r2780)
@@ -94,6 +94,7 @@
 	ON_UPDATE_COMMAND_UI(ID_MULTIUSER_ACTIVEUSERS, OnUpdateViewMultiUserActiveUsers)
 	ON_COMMAND(ID_VIEW_CLEARCONSOLE, OnViewClearConsole)
 	ON_UPDATE_COMMAND_UI(ID_VIEW_CLEARCONSOLE, OnUpdateViewClearConsole)
+	ON_UPDATE_COMMAND_UI(ID_HELP_CONTENTS, OnUpdateFileSettings)
 
 #define MSG_MAP_VIEW_PANE(ID, class_, member) \
 	ON_COMMAND(ID, (&CMainFrame::OnViewPane<class_, &CMainFrame::member>)) \
@@ -457,7 +458,7 @@
 	mdiTabParams.m_tabLocation = CMFCTabCtrl::LOCATION_TOP;	// Specifies that the tabs labels are located at the top of the page
 	EnableMDITabbedGroups(TRUE, mdiTabParams);
 
-	CMFCToolBar::EnableQuickCustomization();
+ 	CMFCToolBar::EnableQuickCustomization();
 
 	// Set the visual manager and style based on persisted value
 	OnApplicationLook(theApp.m_nAppLook);
@@ -1268,6 +1269,13 @@
 	pCmdUI->Enable();
 }
 
+void CMainFrame::OnUpdateFileSettings(CCmdUI* pCmdUI)
+{
+	// This is an update message for Tools/Options menu
+	// This triggers the refresh of plugins/interpreters menus
+	theApp.UpdateDynMenus(pCmdUI->m_pMenu);
+}
+
 void CMainFrame::OnDropFiles(HDROP p_hDropInfo)
 {
 	CGMEEventLogger::LogGMEEvent(_T("MainFrame:OnDropFiles\r\n"));

Modified: trunk/GME/Gme/MainFrm.h
==============================================================================
--- trunk/GME/Gme/MainFrm.h	Thu Sep 26 13:26:13 2019	(r2779)
+++ trunk/GME/Gme/MainFrm.h	Tue Apr  7 10:44:15 2020	(r2780)
@@ -165,6 +165,7 @@
 	afx_msg void OnUpdateViewMultiUserSubversion(CCmdUI* pCmdUI);
 	afx_msg void OnViewClearConsole();
 	afx_msg void OnUpdateViewClearConsole( CCmdUI* pCmdUI);
+	afx_msg void OnUpdateFileSettings(CCmdUI* pCmdUI);
 
 	template<class paneclass, typename paneclass CMainFrame::* const m_pane> afx_msg void OnViewPane() 
 	{

Modified: trunk/GME/Gme/resource.h
==============================================================================
--- trunk/GME/Gme/resource.h	Thu Sep 26 13:26:13 2019	(r2779)
+++ trunk/GME/Gme/resource.h	Tue Apr  7 10:44:15 2020	(r2780)
@@ -520,16 +520,22 @@
 #define ID_CONNCNTX_REVERSE             33270
 #define ID_VIEW_SHOWCONNECTEDPORTSONLY  33271
 #define ID_PORTCNTX_DELETE              33272
+#pragma region Help IDs
+#define ID_HELP_PARADIGMHELP            0x9000
+#define ID_HELP_PARADIGMHELP_FIRST      0x9001
+#define ID_HELP_PARADIGMHELP_LAST       0x900F
+#define ID_HELP_COMPONENTHELP           0x9010
+#define ID_HELP_COMPONENTHELP_FIRST     0x9011
+#define ID_HELP_COMPONENTHELP_LAST      0x908F
+#pragma endregion
 #define IDW_TOOLBAR_MAIN                0xE820
 #define IDW_TOOLBAR_WINS                0xE821
 #define IDW_TOOLBAR_COMPONENT           0xE822
 #define IDW_TOOLBAR_MODE                0xE823
 #define IDW_TOOLBAR_NAVIG               0xE824
 #define IDW_TOOLBAR_MODELING            0xE825
-
-
-#define ID_FILE_INTERPRET_LAST ID_FILE_INTERPRET49
 #define ID_FILE_RUNPLUGIN_LAST ID_FILE_RUNPLUGIN8
+#define ID_FILE_INTERPRET_LAST ID_FILE_INTERPRET49
 
 // Next default values for new objects
 // 

Modified: trunk/GME/Interfaces/MgaUtil.idl
==============================================================================
--- trunk/GME/Interfaces/MgaUtil.idl	Thu Sep 26 13:26:13 2019	(r2779)
+++ trunk/GME/Interfaces/MgaUtil.idl	Tue Apr  7 10:44:15 2020	(r2780)
@@ -517,6 +517,28 @@
 	HRESULT UnregisterComponentLibrary([in] BSTR path, [in] regaccessmode_enum mode);
 };
 
+[
+	object,
+	uuid(0E3C2752-6173-4050-BD47-AE54DA1C373A),
+	dual,
+	helpstring("IMgaRegistrar2 Interface"),
+	pointer_default(unique)
+]
+interface IMgaRegistrar2 : IMgaRegistrar
+{
+	[propput, helpstring("property ParadigmExtraInfo")]
+	HRESULT ParadigmExtraInfo([in] regaccessmode_enum mode, [in] BSTR ParadigmName, [in] BSTR ParadigmVersionGUID, [in] BSTR name, [in] BSTR newVal);
+
+	[propget, helpstring("property ParadigmExtraInfo")]
+	HRESULT ParadigmExtraInfo([in] regaccessmode_enum mode, [in] BSTR ParadigmName, [in] BSTR ParadigmVersionGUID, [in] BSTR name, [out, retval] BSTR *pVal);
+
+	[helpstring("setter for property ParadigmExtraInfo")]
+	HRESULT SetParadigmExtraInfoDisp([in] BSTR ParadigmName, [in] BSTR ParadigmVersionGUID, [in] BSTR name, [in] BSTR newVal, [in, defaultvalue(REGACCESS_SYSTEM)] regaccessmode_enum mode);
+
+	[helpstring("getter for property ParadigmExtraInfo")]
+	HRESULT GetParadigmExtraInfoDisp([in] BSTR ParadigmName, [in] BSTR ParadigmVersionGUID, [in] BSTR name, [out, retval] BSTR *pVal);
+};
+
 typedef enum metadlg_enum
 {
 	METADLG_NONE =		0x0000,

Modified: trunk/GME/MgaUtil/MgaRegistrar.cpp
==============================================================================
--- trunk/GME/MgaUtil/MgaRegistrar.cpp	Thu Sep 26 13:26:13 2019	(r2779)
+++ trunk/GME/MgaUtil/MgaRegistrar.cpp	Tue Apr  7 10:44:15 2020	(r2780)
@@ -2423,7 +2423,7 @@
 		{
 			--index;
 			CComObjPtr<ITypeInfo> typeinfo;
-			COMTHROW( typelib->GetTypeInfo(index, PutOut(typeinfo)) );// index parameter with the range of 0 to GetTypeInfoCount() –1.
+			COMTHROW( typelib->GetTypeInfo(index, PutOut(typeinfo)) );// index parameter with the range of 0 to GetTypeInfoCount() –1.
 
 			TYPEATTR *typeattr = NULL;
 			COMTHROW( typeinfo->GetTypeAttr(&typeattr) );
@@ -2454,3 +2454,91 @@
 	}
 	COMCATCH(;)
 }
+
+STDMETHODIMP CMgaRegistrar::put_ParadigmExtraInfo(regaccessmode_enum mode, BSTR paradigmName, BSTR paradigmVersionGuid, BSTR name, BSTR newVal)
+{
+	CString paradigmNameStr = PutInCString(paradigmName);
+	CString paradigmGuidStr = PutInCString(paradigmVersionGuid);
+	CString nameStr = PutInCString(name);
+
+	COMTRY
+	{
+		if (mode & RM_SYS) {
+			CRegKey para;
+			LPCTSTR regpath = rootreg + _T("\\Paradigms\\") + paradigmNameStr + _T("\\") + paradigmGuidStr;
+			LONG res = para.Open(HKEY_LOCAL_MACHINE, regpath, KEY_WRITE);
+			if (res != ERROR_SUCCESS && res != ERROR_ACCESS_DENIED && res != ERROR_FILE_NOT_FOUND) {
+				ERRTHROW(res);
+			}
+			if (res == ERROR_SUCCESS) {
+				if (!newVal) {
+					para.DeleteValue(nameStr);
+				}
+				else {
+					para.SetStringValue(nameStr, PutInCString(newVal));
+				}
+			}
+		}
+		if (mode & RM_USER) {
+			CRegKey para;
+			LPCTSTR regpath = rootreg + _T("\\Paradigms\\") + paradigmNameStr + _T("\\") + paradigmGuidStr;
+			LONG res = para.Open(HKEY_CURRENT_USER, regpath, KEY_WRITE);
+			if (res != ERROR_SUCCESS && res != ERROR_ACCESS_DENIED && res != ERROR_FILE_NOT_FOUND) {
+				ERRTHROW(res);
+			}
+			if (res == ERROR_SUCCESS) {
+				if (!newVal) {
+					para.DeleteValue(nameStr);
+				}
+				else {
+					para.SetStringValue(nameStr, PutInCString(newVal));
+				}
+			}
+		}
+	} COMCATCH(;)
+}
+
+STDMETHODIMP CMgaRegistrar::get_ParadigmExtraInfo(regaccessmode_enum mode, BSTR paradigmName, BSTR paradigmVersionGuid, BSTR name, BSTR * pVal)
+{
+	CHECK_OUT(pVal);
+
+	if ((mode & RM_BOTH) == RM_BOTH) {
+		HRESULT res;
+		res = this->get_ParadigmExtraInfo(REGACCESS_USER, paradigmName, paradigmVersionGuid, name, pVal);
+		CString val = PutInCString(*pVal);
+		if (val.IsEmpty()) {
+			res = this->get_ParadigmExtraInfo(REGACCESS_SYSTEM, paradigmName, paradigmVersionGuid, name, pVal);
+		}
+		return res;
+	}
+
+	CString paradigmNameStr = PutInCString(paradigmName);
+	CString paradigmGuidStr = PutInCString(paradigmVersionGuid);
+	CString nameStr = PutInCString(name);
+
+	COMTRY
+	{
+		HKEY hive = (mode & RM_SYS ? HKEY_LOCAL_MACHINE : (mode & RM_USER ? HKEY_CURRENT_USER : NULL));
+		if (hive != NULL)
+		{
+			CRegKey para;
+			LPCTSTR regpath = rootreg + _T("\\Paradigms\\") + paradigmNameStr + _T("\\") + paradigmGuidStr;
+			LONG res = para.Open(hive, regpath, KEY_READ);
+
+			if (res != ERROR_SUCCESS && res != ERROR_ACCESS_DENIED && res != ERROR_FILE_NOT_FOUND) ERRTHROW(res);
+			if (res == ERROR_SUCCESS) {
+				ULONG count = 0;
+				if (para.QueryStringValue(nameStr, NULL, &count) == ERROR_SUCCESS) {
+					CString retVal;
+					if (para.QueryStringValue(nameStr, retVal.GetBufferSetLength(count), &count) == ERROR_SUCCESS) {
+						retVal.ReleaseBuffer();
+						CopyTo(retVal, pVal);
+						return S_OK;
+					}
+				}
+			}
+		}
+		return E_NOTFOUND;
+	}
+	COMCATCH(;)
+}

Modified: trunk/GME/MgaUtil/MgaRegistrar.h
==============================================================================
--- trunk/GME/MgaUtil/MgaRegistrar.h	Thu Sep 26 13:26:13 2019	(r2779)
+++ trunk/GME/MgaUtil/MgaRegistrar.h	Tue Apr  7 10:44:15 2020	(r2780)
@@ -8,8 +8,8 @@
 class ATL_NO_VTABLE CMgaRegistrar : 
 	public CComObjectRootEx<CComSingleThreadModel>,
 	public CComCoClass<CMgaRegistrar, &__uuidof(MgaRegistrar)>,
-	public IDispatchImpl<IMgaRegistrar, &__uuidof(IMgaRegistrar), &__uuidof(__MGAUtilLib)>,
-	public ISupportErrorInfoImpl<&__uuidof(IMgaRegistrar)>,
+	public IDispatchImpl<IMgaRegistrar2, &__uuidof(IMgaRegistrar2), &__uuidof(__MGAUtilLib)>,
+	public ISupportErrorInfoImpl2<&__uuidof(IMgaRegistrar), &__uuidof(IMgaRegistrar2)>,
 	public IGMEVersionInfoImpl
 {
 public:
@@ -20,7 +20,8 @@
 
 BEGIN_COM_MAP(CMgaRegistrar)
 	COM_INTERFACE_ENTRY(IMgaRegistrar)
-	COM_INTERFACE_ENTRY(IDispatch)
+	COM_INTERFACE_ENTRY(IMgaRegistrar2)
+	COM_INTERFACE_ENTRY2(IDispatch, IMgaRegistrar2)
 	COM_INTERFACE_ENTRY(ISupportErrorInfo)
 	COM_INTERFACE_ENTRY_IID(__uuidof(IGMEVersionInfo), IGMEVersionInfoImpl)
 END_COM_MAP()
@@ -141,6 +142,13 @@
 
 	STDMETHOD(RegisterComponentLibrary)(BSTR path, regaccessmode_enum mode);
 	STDMETHOD(UnregisterComponentLibrary)(BSTR path, regaccessmode_enum mode);
+
+	// --- IMgaRegistrar2
+
+	STDMETHOD(put_ParadigmExtraInfo)(regaccessmode_enum mode, BSTR paradigmName, BSTR paradigmVersionGuid, BSTR name, BSTR newVal);
+	STDMETHOD(get_ParadigmExtraInfo)(regaccessmode_enum mode, BSTR paradigmName, BSTR paradigmVersionGuid, BSTR name, BSTR* pVal);
+	STDMETHOD(SetParadigmExtraInfoDisp)(BSTR paradigmName, BSTR paradigmVersionGuid, BSTR name, BSTR newVal, regaccessmode_enum mode = REGACCESS_SYSTEM) { return this->put_ParadigmExtraInfo(mode, paradigmName, paradigmVersionGuid, name, newVal); }
+	STDMETHOD(GetParadigmExtraInfoDisp)(BSTR paradigmName, BSTR paradigmVersionGuid, BSTR name, BSTR* pVal) { return this->get_ParadigmExtraInfo(REGACCESS_BOTH, paradigmName, paradigmVersionGuid, name, pVal); }
 };
 
 #endif//MGA_MGAREGISTRAR_H

Modified: trunk/GME/MgaUtil/MgaUtil.vcxproj
==============================================================================
--- trunk/GME/MgaUtil/MgaUtil.vcxproj	Thu Sep 26 13:26:13 2019	(r2779)
+++ trunk/GME/MgaUtil/MgaUtil.vcxproj	Tue Apr  7 10:44:15 2020	(r2780)
@@ -115,6 +115,7 @@
       <PrecompiledHeader>Use</PrecompiledHeader>
       <WarningLevel>Level3</WarningLevel>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+      <AdditionalOptions>/w34189 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>

Modified: trunk/GME/MgaUtil/MgaUtilLib.idl
==============================================================================
--- trunk/GME/MgaUtil/MgaUtilLib.idl	Thu Sep 26 13:26:13 2019	(r2779)
+++ trunk/GME/MgaUtil/MgaUtilLib.idl	Tue Apr  7 10:44:15 2020	(r2780)
@@ -38,7 +38,8 @@
 	]
 	coclass MgaRegistrar
 	{
-		[default] interface IMgaRegistrar;
+		[default] interface IMgaRegistrar2;
+		interface IMgaRegistrar;
 		interface IGMEVersionInfo;
 	};
 

Modified: trunk/GME/MgaUtil/StdAfx.h
==============================================================================
--- trunk/GME/MgaUtil/StdAfx.h	Thu Sep 26 13:26:13 2019	(r2779)
+++ trunk/GME/MgaUtil/StdAfx.h	Tue Apr  7 10:44:15 2020	(r2780)
@@ -109,6 +109,18 @@
 #include "Resource.h"
 
 regaccessmode_enum regacc_translate(int x);
+
+template <const IID* piid1, const IID* piid2>
+class ATL_NO_VTABLE ISupportErrorInfoImpl2 :
+	public ISupportErrorInfo
+{
+public:
+	STDMETHOD(InterfaceSupportsErrorInfo)(_In_ REFIID riid)
+	{
+		return (InlineIsEqualGUID(riid, *piid1) || InlineIsEqualGUID(riid, *piid2)) ? S_OK : S_FALSE;
+	}
+};
+
 //{{AFX_INSERT_LOCATION}}
 // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
 

Modified: trunk/Install/GME_bin.wxs
==============================================================================
--- trunk/Install/GME_bin.wxs	Thu Sep 26 13:26:13 2019	(r2779)
+++ trunk/Install/GME_bin.wxs	Tue Apr  7 10:44:15 2020	(r2780)
@@ -511,6 +511,7 @@
                   <ProgId Id="Mga.MgaRegistrar" Description="MgaRegistrar Class" />
                 </ProgId>
                 <Interface Id="{F1D6BB05-42EE-11D4-B3F4-005004D38590}" Name="IMgaRegistrar"  ProxyStubClassId="{00020424-0000-0000-C000-000000000046}" ProxyStubClassId32="{00020424-0000-0000-C000-000000000046}" />
+                <Interface Id="{0E3C2752-6173-4050-BD47-AE54DA1C373A}" Name="IMgaRegistrar2"  ProxyStubClassId="{00020424-0000-0000-C000-000000000046}" ProxyStubClassId32="{00020424-0000-0000-C000-000000000046}" />
               </Class>
               <Class Id="{D03EC327-447B-11D4-B3F6-005004D38590}" Context="InprocServer32" Description="MgaLauncher Class" ThreadingModel="apartment" Programmable="yes">
                 <ProgId Id="Mga.MgaLauncher.1" Description="MgaLauncher Class">


More information about the gme-commit mailing list