forked from aniani/vim
updated for version 7.0001
This commit is contained in:
160
src/VisVim/DSAddIn.cpp
Normal file
160
src/VisVim/DSAddIn.cpp
Normal file
@@ -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 methode 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);
|
||||
}
|
||||
|
Reference in New Issue
Block a user