1#include "stdafx.h" 2#include "VisVim.h" 3#include "DSAddIn.h" 4#include "Commands.h" 5 6#ifdef _DEBUG 7#define new DEBUG_NEW 8#undef THIS_FILE 9static char THIS_FILE[] = __FILE__; 10 11#endif 12 13// This is called when the user first loads the add-in, and on start-up 14// of each subsequent Developer Studio session 15STDMETHODIMP CDSAddIn::OnConnection (IApplication * pApp, VARIANT_BOOL bFirstTime, 16 long dwCookie, VARIANT_BOOL * OnConnection) 17{ 18 AFX_MANAGE_STATE (AfxGetStaticModuleState ()); 19 *OnConnection = VARIANT_FALSE; 20 21 // Store info passed to us 22 IApplication *pApplication = NULL; 23 HRESULT hr; 24 25 hr = pApp->QueryInterface (IID_IApplication, (void **) &pApplication); 26 if (FAILED (hr)) 27 { 28 ReportLastError (hr); 29 return E_UNEXPECTED; 30 } 31 if (pApplication == NULL) 32 { 33 ReportInternalError ("IApplication::QueryInterface"); 34 return E_UNEXPECTED; 35 } 36 37 m_dwCookie = dwCookie; 38 39 // Create command dispatch, send info back to DevStudio 40 CCommandsObj::CreateInstance (&m_pCommands); 41 if (! m_pCommands) 42 { 43 ReportInternalError ("CCommandsObj::CreateInstance"); 44 return E_UNEXPECTED; 45 } 46 m_pCommands->AddRef (); 47 48 // The QueryInterface above AddRef'd the Application object. It will 49 // be Release'd in CCommand's destructor. 50 m_pCommands->SetApplicationObject (pApplication); 51 52 hr = pApplication->SetAddInInfo ((long) AfxGetInstanceHandle (), 53 (LPDISPATCH) m_pCommands, IDR_TOOLBAR_MEDIUM, IDR_TOOLBAR_LARGE, 54 m_dwCookie); 55 if (FAILED (hr)) 56 { 57 ReportLastError (hr); 58 return E_UNEXPECTED; 59 } 60 61 // Inform DevStudio of the commands we implement 62 if (! AddCommand (pApplication, "VisVimDialog", "VisVimDialogCmd", 63 IDS_CMD_DIALOG, 0, bFirstTime)) 64 return E_UNEXPECTED; 65 if (! AddCommand (pApplication, "VisVimEnable", "VisVimEnableCmd", 66 IDS_CMD_ENABLE, 1, bFirstTime)) 67 return E_UNEXPECTED; 68 if (! AddCommand (pApplication, "VisVimDisable", "VisVimDisableCmd", 69 IDS_CMD_DISABLE, 2, bFirstTime)) 70 return E_UNEXPECTED; 71 if (! AddCommand (pApplication, "VisVimToggle", "VisVimToggleCmd", 72 IDS_CMD_TOGGLE, 3, bFirstTime)) 73 return E_UNEXPECTED; 74 if (! AddCommand (pApplication, "VisVimLoad", "VisVimLoadCmd", 75 IDS_CMD_LOAD, 4, bFirstTime)) 76 return E_UNEXPECTED; 77 78 *OnConnection = VARIANT_TRUE; 79 return S_OK; 80} 81 82// This is called on shut-down, and also when the user unloads the add-in 83STDMETHODIMP CDSAddIn::OnDisconnection (VARIANT_BOOL bLastTime) 84{ 85 AFX_MANAGE_STATE (AfxGetStaticModuleState ()); 86 87 m_pCommands->UnadviseFromEvents (); 88 m_pCommands->Release (); 89 m_pCommands = NULL; 90 91 return S_OK; 92} 93 94// Add a command to DevStudio 95// Creates a toolbar button for the command also. 96// 'MethodName' is the name of the method specified in the .odl file 97// 'StrResId' the resource id of the descriptive string 98// 'GlyphIndex' the image index into the command buttons bitmap 99// Return true on success 100// 101bool CDSAddIn::AddCommand (IApplication* pApp, char* MethodName, char* CmdName, 102 UINT StrResId, UINT GlyphIndex, VARIANT_BOOL bFirstTime) 103{ 104 CString CmdString; 105 CString CmdText; 106 107 CmdText.LoadString (StrResId); 108 CmdString = CmdName; 109 CmdString += CmdText; 110 111 CComBSTR bszCmdString (CmdString); 112 CComBSTR bszMethod (MethodName); 113 CComBSTR bszCmdName (CmdName); 114 115 // (see stdafx.h for the definition of VERIFY_OK) 116 117 VARIANT_BOOL bRet; 118 VERIFY_OK (pApp->AddCommand (bszCmdString, bszMethod, GlyphIndex, 119 m_dwCookie, &bRet)); 120 if (bRet == VARIANT_FALSE) 121 { 122 // AddCommand failed because a command with this name already exists. 123 ReportInternalError ("IApplication::AddCommand"); 124 return FALSE; 125 } 126 127 // Add toolbar buttons only if this is the first time the add-in 128 // is being loaded. Toolbar buttons are automatically remembered 129 // by Developer Studio from session to session, so we should only 130 // add the toolbar buttons once. 131 if (bFirstTime == VARIANT_TRUE) 132 VERIFY_OK (pApp->AddCommandBarButton (dsGlyph, bszCmdName, m_dwCookie)); 133 134 return TRUE; 135} 136 137void ReportLastError (HRESULT Err) 138{ 139 char *Buf = NULL; 140 char Msg[512]; 141 142 FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, 143 NULL, Err, 144 MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), 145 Buf, 400, NULL); 146 sprintf (Msg, "Unexpected error (Error code: %lx)\n%s", Err, Buf); 147 148 ::MessageBox (NULL, Msg, "VisVim", MB_OK | MB_ICONSTOP); 149 if (Buf) 150 LocalFree (Buf); 151} 152 153void ReportInternalError (char* Fct) 154{ 155 char Msg[512]; 156 157 sprintf (Msg, "Unexpected error\n%s failed", Fct); 158 ::MessageBox (NULL, Msg, "VisVim", MB_OK | MB_ICONSTOP); 159} 160 161