xref: /vim-8.2.3635/src/VisVim/DSAddIn.cpp (revision 3d27a45f)
1071d4279SBram Moolenaar #include "stdafx.h"
2071d4279SBram Moolenaar #include "VisVim.h"
3071d4279SBram Moolenaar #include "DSAddIn.h"
4071d4279SBram Moolenaar #include "Commands.h"
5071d4279SBram Moolenaar 
6071d4279SBram Moolenaar #ifdef _DEBUG
7071d4279SBram Moolenaar #define new DEBUG_NEW
8071d4279SBram Moolenaar #undef THIS_FILE
9071d4279SBram Moolenaar static char THIS_FILE[] = __FILE__;
10071d4279SBram Moolenaar 
11071d4279SBram Moolenaar #endif
12071d4279SBram Moolenaar 
13071d4279SBram Moolenaar // This is called when the user first loads the add-in, and on start-up
14071d4279SBram Moolenaar //  of each subsequent Developer Studio session
OnConnection(IApplication * pApp,VARIANT_BOOL bFirstTime,long dwCookie,VARIANT_BOOL * OnConnection)15071d4279SBram Moolenaar STDMETHODIMP CDSAddIn::OnConnection (IApplication * pApp, VARIANT_BOOL bFirstTime,
16071d4279SBram Moolenaar 				     long dwCookie, VARIANT_BOOL * OnConnection)
17071d4279SBram Moolenaar {
18071d4279SBram Moolenaar 	AFX_MANAGE_STATE (AfxGetStaticModuleState ());
19071d4279SBram Moolenaar 	*OnConnection = VARIANT_FALSE;
20071d4279SBram Moolenaar 
21071d4279SBram Moolenaar 	// Store info passed to us
22071d4279SBram Moolenaar 	IApplication *pApplication = NULL;
23071d4279SBram Moolenaar 	HRESULT hr;
24071d4279SBram Moolenaar 
25071d4279SBram Moolenaar 	hr = pApp->QueryInterface (IID_IApplication, (void **) &pApplication);
26071d4279SBram Moolenaar 	if (FAILED (hr))
27071d4279SBram Moolenaar 	{
28071d4279SBram Moolenaar 		ReportLastError (hr);
29071d4279SBram Moolenaar 		return E_UNEXPECTED;
30071d4279SBram Moolenaar 	}
31071d4279SBram Moolenaar 	if (pApplication == NULL)
32071d4279SBram Moolenaar 	{
33071d4279SBram Moolenaar 		ReportInternalError ("IApplication::QueryInterface");
34071d4279SBram Moolenaar 		return E_UNEXPECTED;
35071d4279SBram Moolenaar 	}
36071d4279SBram Moolenaar 
37071d4279SBram Moolenaar 	m_dwCookie = dwCookie;
38071d4279SBram Moolenaar 
39071d4279SBram Moolenaar 	// Create command dispatch, send info back to DevStudio
40071d4279SBram Moolenaar 	CCommandsObj::CreateInstance (&m_pCommands);
41071d4279SBram Moolenaar 	if (! m_pCommands)
42071d4279SBram Moolenaar 	{
43071d4279SBram Moolenaar 		ReportInternalError ("CCommandsObj::CreateInstance");
44071d4279SBram Moolenaar 		return E_UNEXPECTED;
45071d4279SBram Moolenaar 	}
46071d4279SBram Moolenaar 	m_pCommands->AddRef ();
47071d4279SBram Moolenaar 
48071d4279SBram Moolenaar 	// The QueryInterface above AddRef'd the Application object.  It will
49071d4279SBram Moolenaar 	// be Release'd in CCommand's destructor.
50071d4279SBram Moolenaar 	m_pCommands->SetApplicationObject (pApplication);
51071d4279SBram Moolenaar 
52071d4279SBram Moolenaar 	hr = pApplication->SetAddInInfo ((long) AfxGetInstanceHandle (),
53071d4279SBram Moolenaar 		(LPDISPATCH) m_pCommands, IDR_TOOLBAR_MEDIUM, IDR_TOOLBAR_LARGE,
54071d4279SBram Moolenaar 		m_dwCookie);
55071d4279SBram Moolenaar 	if (FAILED (hr))
56071d4279SBram Moolenaar 	{
57071d4279SBram Moolenaar 		ReportLastError (hr);
58071d4279SBram Moolenaar 		return E_UNEXPECTED;
59071d4279SBram Moolenaar 	}
60071d4279SBram Moolenaar 
61071d4279SBram Moolenaar 	// Inform DevStudio of the commands we implement
62071d4279SBram Moolenaar 	if (! AddCommand (pApplication, "VisVimDialog", "VisVimDialogCmd",
63071d4279SBram Moolenaar 			  IDS_CMD_DIALOG, 0, bFirstTime))
64071d4279SBram Moolenaar 		return E_UNEXPECTED;
65071d4279SBram Moolenaar 	if (! AddCommand (pApplication, "VisVimEnable", "VisVimEnableCmd",
66071d4279SBram Moolenaar 			  IDS_CMD_ENABLE, 1, bFirstTime))
67071d4279SBram Moolenaar 		return E_UNEXPECTED;
68071d4279SBram Moolenaar 	if (! AddCommand (pApplication, "VisVimDisable", "VisVimDisableCmd",
69071d4279SBram Moolenaar 			  IDS_CMD_DISABLE, 2, bFirstTime))
70071d4279SBram Moolenaar 		return E_UNEXPECTED;
71071d4279SBram Moolenaar 	if (! AddCommand (pApplication, "VisVimToggle", "VisVimToggleCmd",
72071d4279SBram Moolenaar 			  IDS_CMD_TOGGLE, 3, bFirstTime))
73071d4279SBram Moolenaar 		return E_UNEXPECTED;
74071d4279SBram Moolenaar 	if (! AddCommand (pApplication, "VisVimLoad", "VisVimLoadCmd",
75071d4279SBram Moolenaar 			  IDS_CMD_LOAD, 4, bFirstTime))
76071d4279SBram Moolenaar 		return E_UNEXPECTED;
77071d4279SBram Moolenaar 
78071d4279SBram Moolenaar 	*OnConnection = VARIANT_TRUE;
79071d4279SBram Moolenaar 	return S_OK;
80071d4279SBram Moolenaar }
81071d4279SBram Moolenaar 
82071d4279SBram Moolenaar // This is called on shut-down, and also when the user unloads the add-in
OnDisconnection(VARIANT_BOOL bLastTime)83071d4279SBram Moolenaar STDMETHODIMP CDSAddIn::OnDisconnection (VARIANT_BOOL bLastTime)
84071d4279SBram Moolenaar {
85071d4279SBram Moolenaar 	AFX_MANAGE_STATE (AfxGetStaticModuleState ());
86071d4279SBram Moolenaar 
87071d4279SBram Moolenaar 	m_pCommands->UnadviseFromEvents ();
88071d4279SBram Moolenaar 	m_pCommands->Release ();
89071d4279SBram Moolenaar 	m_pCommands = NULL;
90071d4279SBram Moolenaar 
91071d4279SBram Moolenaar 	return S_OK;
92071d4279SBram Moolenaar }
93071d4279SBram Moolenaar 
94071d4279SBram Moolenaar // Add a command to DevStudio
95071d4279SBram Moolenaar // Creates a toolbar button for the command also.
96*3d27a45fSBram Moolenaar // 'MethodName' is the name of the method specified in the .odl file
97071d4279SBram Moolenaar // 'StrResId' the resource id of the descriptive string
98071d4279SBram Moolenaar // 'GlyphIndex' the image index into the command buttons bitmap
99071d4279SBram Moolenaar // Return true on success
100071d4279SBram Moolenaar //
AddCommand(IApplication * pApp,char * MethodName,char * CmdName,UINT StrResId,UINT GlyphIndex,VARIANT_BOOL bFirstTime)101071d4279SBram Moolenaar bool CDSAddIn::AddCommand (IApplication* pApp, char* MethodName, char* CmdName,
102071d4279SBram Moolenaar 			   UINT StrResId, UINT GlyphIndex, VARIANT_BOOL bFirstTime)
103071d4279SBram Moolenaar {
104071d4279SBram Moolenaar 	CString CmdString;
105071d4279SBram Moolenaar 	CString CmdText;
106071d4279SBram Moolenaar 
107071d4279SBram Moolenaar 	CmdText.LoadString (StrResId);
108071d4279SBram Moolenaar 	CmdString = CmdName;
109071d4279SBram Moolenaar 	CmdString += CmdText;
110071d4279SBram Moolenaar 
111071d4279SBram Moolenaar 	CComBSTR bszCmdString (CmdString);
112071d4279SBram Moolenaar 	CComBSTR bszMethod (MethodName);
113071d4279SBram Moolenaar 	CComBSTR bszCmdName (CmdName);
114071d4279SBram Moolenaar 
115071d4279SBram Moolenaar 	// (see stdafx.h for the definition of VERIFY_OK)
116071d4279SBram Moolenaar 
117071d4279SBram Moolenaar 	VARIANT_BOOL bRet;
118071d4279SBram Moolenaar 	VERIFY_OK (pApp->AddCommand (bszCmdString, bszMethod, GlyphIndex,
119071d4279SBram Moolenaar 				     m_dwCookie, &bRet));
120071d4279SBram Moolenaar 	if (bRet == VARIANT_FALSE)
121071d4279SBram Moolenaar 	{
122071d4279SBram Moolenaar 		// AddCommand failed because a command with this name already exists.
123071d4279SBram Moolenaar 		ReportInternalError ("IApplication::AddCommand");
124071d4279SBram Moolenaar 		return FALSE;
125071d4279SBram Moolenaar 	}
126071d4279SBram Moolenaar 
127071d4279SBram Moolenaar 	// Add toolbar buttons only if this is the first time the add-in
128071d4279SBram Moolenaar 	// is being loaded.  Toolbar buttons are automatically remembered
129071d4279SBram Moolenaar 	// by Developer Studio from session to session, so we should only
130071d4279SBram Moolenaar 	// add the toolbar buttons once.
131071d4279SBram Moolenaar 	if (bFirstTime == VARIANT_TRUE)
132071d4279SBram Moolenaar 		VERIFY_OK (pApp->AddCommandBarButton (dsGlyph, bszCmdName, m_dwCookie));
133071d4279SBram Moolenaar 
134071d4279SBram Moolenaar 	return TRUE;
135071d4279SBram Moolenaar }
136071d4279SBram Moolenaar 
ReportLastError(HRESULT Err)137071d4279SBram Moolenaar void ReportLastError (HRESULT Err)
138071d4279SBram Moolenaar {
139071d4279SBram Moolenaar 	char *Buf = NULL;
140071d4279SBram Moolenaar 	char Msg[512];
141071d4279SBram Moolenaar 
142071d4279SBram Moolenaar 	FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
143071d4279SBram Moolenaar 		       NULL, Err,
144071d4279SBram Moolenaar 		       MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
145071d4279SBram Moolenaar 		       Buf, 400, NULL);
146071d4279SBram Moolenaar 	sprintf (Msg, "Unexpected error (Error code: %lx)\n%s", Err, Buf);
147071d4279SBram Moolenaar 
148071d4279SBram Moolenaar 	::MessageBox (NULL, Msg, "VisVim", MB_OK | MB_ICONSTOP);
149071d4279SBram Moolenaar 	if (Buf)
150071d4279SBram Moolenaar 		LocalFree (Buf);
151071d4279SBram Moolenaar }
152071d4279SBram Moolenaar 
ReportInternalError(char * Fct)153071d4279SBram Moolenaar void ReportInternalError (char* Fct)
154071d4279SBram Moolenaar {
155071d4279SBram Moolenaar 	char Msg[512];
156071d4279SBram Moolenaar 
157071d4279SBram Moolenaar 	sprintf (Msg, "Unexpected error\n%s failed", Fct);
158071d4279SBram Moolenaar 	::MessageBox (NULL, Msg, "VisVim", MB_OK | MB_ICONSTOP);
159071d4279SBram Moolenaar }
160071d4279SBram Moolenaar 
161