blob: b16361b9039ead4c77252b92d8ed7684f2e9203e [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001#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
9static 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
15STDMETHODIMP 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
83STDMETHODIMP 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.
Bram Moolenaar3d27a452007-05-10 17:44:18 +000096// 'MethodName' is the name of the method specified in the .odl file
Bram Moolenaar071d4272004-06-13 20:20:40 +000097// 'StrResId' the resource id of the descriptive string
98// 'GlyphIndex' the image index into the command buttons bitmap
99// Return true on success
100//
101bool 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
137void 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
153void 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