2004-06-13 20:20:40 +00:00
|
|
|
#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.
|
2007-05-10 17:44:18 +00:00
|
|
|
// 'MethodName' is the name of the method specified in the .odl file
|
2004-06-13 20:20:40 +00:00
|
|
|
// '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);
|
|
|
|
}
|
|
|
|
|