diff options
Diffstat (limited to 'src/VisVim/DSAddIn.cpp')
-rw-r--r-- | src/VisVim/DSAddIn.cpp | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/src/VisVim/DSAddIn.cpp b/src/VisVim/DSAddIn.cpp new file mode 100644 index 0000000..b16361b --- /dev/null +++ b/src/VisVim/DSAddIn.cpp @@ -0,0 +1,160 @@ +#include "stdafx.h" +#include "VisVim.h" +#include "DSAddIn.h" +#include "Commands.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; + +#endif + +// This is called when the user first loads the add-in, and on start-up +// of each subsequent Developer Studio session +STDMETHODIMP CDSAddIn::OnConnection (IApplication * pApp, VARIANT_BOOL bFirstTime, + long dwCookie, VARIANT_BOOL * OnConnection) +{ + AFX_MANAGE_STATE (AfxGetStaticModuleState ()); + *OnConnection = VARIANT_FALSE; + + // Store info passed to us + IApplication *pApplication = NULL; + HRESULT hr; + + hr = pApp->QueryInterface (IID_IApplication, (void **) &pApplication); + if (FAILED (hr)) + { + ReportLastError (hr); + return E_UNEXPECTED; + } + if (pApplication == NULL) + { + ReportInternalError ("IApplication::QueryInterface"); + return E_UNEXPECTED; + } + + m_dwCookie = dwCookie; + + // Create command dispatch, send info back to DevStudio + CCommandsObj::CreateInstance (&m_pCommands); + if (! m_pCommands) + { + ReportInternalError ("CCommandsObj::CreateInstance"); + return E_UNEXPECTED; + } + m_pCommands->AddRef (); + + // The QueryInterface above AddRef'd the Application object. It will + // be Release'd in CCommand's destructor. + m_pCommands->SetApplicationObject (pApplication); + + hr = pApplication->SetAddInInfo ((long) AfxGetInstanceHandle (), + (LPDISPATCH) m_pCommands, IDR_TOOLBAR_MEDIUM, IDR_TOOLBAR_LARGE, + m_dwCookie); + if (FAILED (hr)) + { + ReportLastError (hr); + return E_UNEXPECTED; + } + + // Inform DevStudio of the commands we implement + if (! AddCommand (pApplication, "VisVimDialog", "VisVimDialogCmd", + IDS_CMD_DIALOG, 0, bFirstTime)) + return E_UNEXPECTED; + if (! AddCommand (pApplication, "VisVimEnable", "VisVimEnableCmd", + IDS_CMD_ENABLE, 1, bFirstTime)) + return E_UNEXPECTED; + if (! AddCommand (pApplication, "VisVimDisable", "VisVimDisableCmd", + IDS_CMD_DISABLE, 2, bFirstTime)) + return E_UNEXPECTED; + if (! AddCommand (pApplication, "VisVimToggle", "VisVimToggleCmd", + IDS_CMD_TOGGLE, 3, bFirstTime)) + return E_UNEXPECTED; + if (! AddCommand (pApplication, "VisVimLoad", "VisVimLoadCmd", + IDS_CMD_LOAD, 4, bFirstTime)) + return E_UNEXPECTED; + + *OnConnection = VARIANT_TRUE; + return S_OK; +} + +// This is called on shut-down, and also when the user unloads the add-in +STDMETHODIMP CDSAddIn::OnDisconnection (VARIANT_BOOL bLastTime) +{ + AFX_MANAGE_STATE (AfxGetStaticModuleState ()); + + m_pCommands->UnadviseFromEvents (); + m_pCommands->Release (); + m_pCommands = NULL; + + return S_OK; +} + +// Add a command to DevStudio +// Creates a toolbar button for the command also. +// 'MethodName' is the name of the method specified in the .odl file +// 'StrResId' the resource id of the descriptive string +// 'GlyphIndex' the image index into the command buttons bitmap +// Return true on success +// +bool CDSAddIn::AddCommand (IApplication* pApp, char* MethodName, char* CmdName, + UINT StrResId, UINT GlyphIndex, VARIANT_BOOL bFirstTime) +{ + CString CmdString; + CString CmdText; + + CmdText.LoadString (StrResId); + CmdString = CmdName; + CmdString += CmdText; + + CComBSTR bszCmdString (CmdString); + CComBSTR bszMethod (MethodName); + CComBSTR bszCmdName (CmdName); + + // (see stdafx.h for the definition of VERIFY_OK) + + VARIANT_BOOL bRet; + VERIFY_OK (pApp->AddCommand (bszCmdString, bszMethod, GlyphIndex, + m_dwCookie, &bRet)); + if (bRet == VARIANT_FALSE) + { + // AddCommand failed because a command with this name already exists. + ReportInternalError ("IApplication::AddCommand"); + return FALSE; + } + + // Add toolbar buttons only if this is the first time the add-in + // is being loaded. Toolbar buttons are automatically remembered + // by Developer Studio from session to session, so we should only + // add the toolbar buttons once. + if (bFirstTime == VARIANT_TRUE) + VERIFY_OK (pApp->AddCommandBarButton (dsGlyph, bszCmdName, m_dwCookie)); + + return TRUE; +} + +void ReportLastError (HRESULT Err) +{ + char *Buf = NULL; + char Msg[512]; + + FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, + NULL, Err, + MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), + Buf, 400, NULL); + sprintf (Msg, "Unexpected error (Error code: %lx)\n%s", Err, Buf); + + ::MessageBox (NULL, Msg, "VisVim", MB_OK | MB_ICONSTOP); + if (Buf) + LocalFree (Buf); +} + +void ReportInternalError (char* Fct) +{ + char Msg[512]; + + sprintf (Msg, "Unexpected error\n%s failed", Fct); + ::MessageBox (NULL, Msg, "VisVim", MB_OK | MB_ICONSTOP); +} + |