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 9 static 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 15 STDMETHODIMP 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 83 STDMETHODIMP 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 methode 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 // 101 bool 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 137 void 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 153 void 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