#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
STDMETHODIMP CDSAddIn::OnConnection (IApplication * pApp, VARIANT_BOOL bFirstTime,
long dwCookie, VARIANT_BOOL * OnConnection)
{
AFX_MANAGE_STATE (AfxGetStaticModuleState ());
*OnConnection = VARIANT_FALSE;
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;
CCommandsObj::CreateInstance (&m_pCommands);
if (! m_pCommands)
{
ReportInternalError ("CCommandsObj::CreateInstance");
return E_UNEXPECTED;
}
m_pCommands->AddRef ();
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;
}
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;
}
STDMETHODIMP CDSAddIn::OnDisconnection (VARIANT_BOOL bLastTime)
{
AFX_MANAGE_STATE (AfxGetStaticModuleState ());
m_pCommands->UnadviseFromEvents ();
m_pCommands->Release ();
m_pCommands = NULL;
return S_OK;
}
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);
VARIANT_BOOL bRet;
VERIFY_OK (pApp->AddCommand (bszCmdString, bszMethod, GlyphIndex,
m_dwCookie, &bRet));
if (bRet == VARIANT_FALSE)
{
ReportInternalError ("IApplication::AddCommand");
return FALSE;
}
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);
}