📄 addincommandmanager.cpp
字号:
/************************************************************************
*
* Resource ID Organiser Add-In for Visual C++
*
* (c) Copyright 2000-2005 by Riverblade Limited (UK). All rights reserved.
*
************************************************************************
*
* Description : AddInCommandManager - Manages commands on behalf of the add-in
*
* Compiler : Microsoft Visual C++ .NET 2003
*
* Target
* Environment : Windows 2000/XP/Vista;
* Visual Studio 2002, 2003 or 2005
*
* NOTE:
*
* This software is provided "as is". All title and copyrights in and
* to the software, including but not limited to any images, text etc.
* etc. incorporated into it, are the property of Anna-Jayne Metcalfe
* and Riverblade Limited, except where acknowledged otherwise.
*
* Your may freely use this code in your own products, PROVIDED
* this notice is not removed or modified.
*
* Please visit http://www.riverblade.co.uk/products/resorg or email
* support@riverblade.co.uk for latest updates and product support
*
************************************************************************
* MODIFICATION HISTORY:
*
* This is a controlled document. See project configuration
* control tool for latest version and full version history.
*
* $Archive: /Projects/AddIns/ResOrg/ResOrgNETAddIn/AddInCommandManager.cpp $
* $Revision: 1 $
* $Date: 22/10/05 11:08 $
* $Author: Anna $
*
* $History: AddInCommandManager.cpp $
*
* ***************** Version 1 *****************
* User: Anna Date: 22/10/05 Time: 11:08
* Created in $/Projects/AddIns/ResOrg/ResOrgNETAddIn
*
* $Nokeywords: $
*
************************************************************************/
#include "stdafx.h"
#include <atlapp.h>
#include <atlgdi.h> // For WTL::CBitmap
#include "OpenMainWindowCommandHandler.h"
#include "ViewToolWindowCommandHandler.h"
#include "OptionsCommandHandler.h"
#include "AboutBoxCommandHandler.h"
#include "AddInCommandManager.h"
/////////////////////////////////////////////////////////////////////////////
// CAddInCommandManager construction/destruction
CAddInCommandManager::CAddInCommandManager(void)
{
}
CAddInCommandManager::~CAddInCommandManager(void)
{
}
/////////////////////////////////////////////////////////////////////////////
// CAddInCommandManager DTE event handlers
/// OnConnection() is called when the add-in is loaded by Visual Studio .NET
///
/// \param pApplication
/// \param eConnectMode An enumerated value indicating how the add-in was loaded
/// \param pAddInInst An IDispatch pointer to the addin instance
/// \param custom An array of Variant type values that provides additional data.
/// This is not used by Visual Studio .NET.
///
/// In addition to calling CAnalysisScheduler::OnConnection(), this handler is responsible
/// for configuring the addin's commands, command handlers and UI.
///
/// \b Notes:
///
/// eConnectMode can take any of the following values:
///
/// - ext_cm_AfterStartup (0)
/// - ext_cm_Startup (1)
/// - ext_cm_External (2)
/// - ext_cm_CommandLine (3)
/// - ext_cm_UISetup (5)
///
/// At a later time, if the Add-in becomes unavailable for reasons such as:
/// - You moved this project to a computer other than which is was originally created on.
/// - You chose 'Yes' when presented with a message asking if you wish to remove the Add-in.
/// - Registry corruption.
///
/// you will need to re-register the Add-in by building the MyAddin21Setup project
/// by right clicking the project in the Solution Explorer, then choosing install.
/// Alternatively, you could execute the ReCreateCommands.reg file the Add-in Wizard generated
/// in the project directory, or run 'devenv /setup' from a command prompt.
///
HRESULT CAddInCommandManager::OnConnection( const CComPtr<EnvDTE::_DTE>& pDTE,
const CComPtr<EnvDTE::AddIn>& pAddInInstance,
HWND hwndResOrg /*= NULL*/,
const EnvDTE::WindowPtr &ptrToolWindow /*= NULL*/)
{
m_pDTE = pDTE;
m_pAddInInstance = pAddInInstance;
m_hwndResOrg = hwndResOrg;
m_ptrToolWindow = ptrToolWindow;
return S_OK;
}
/// This method is called when the add-in is unloaded.
///
HRESULT CAddInCommandManager::OnDisconnection(void)
{
// Delete our command handler objects
for (CAddInCommandHandlerMap::const_iterator itMapCmds = m_mapCmdHandlers.begin();
itMapCmds != m_mapCmdHandlers.end();
itMapCmds++)
{
CAddInCommandHandler* pHandler = itMapCmds->second;
delete pHandler;
}
m_mapCmdHandlers.empty();
return S_OK;
}
/////////////////////////////////////////////////////////////////////////////
// CAddInCommandManager command handlers
HRESULT CAddInCommandManager::QueryStatus(BSTR bstrCmdName,
EnvDTE::vsCommandStatusTextWanted NeededText,
EnvDTE::vsCommandStatus* pStatusOption,
VARIANT* CommandText)
{
if (NeededText == EnvDTE::vsCommandStatusTextWantedNone)
{
CAddInCommandHandlerMap::const_iterator it = m_mapCmdHandlers.find(bstrCmdName);
if (it != m_mapCmdHandlers.end() )
{
CAddInCommandHandler* pHandler = it->second;
if (NULL != pHandler)
{
return pHandler->QueryStatus(bstrCmdName, NeededText, pStatusOption, CommandText);
}
}
}
return S_OK;
}
HRESULT CAddInCommandManager::Exec( BSTR bstrCmdName,
EnvDTE::vsCommandExecOption ExecuteOption,
VARIANT* pvarVariantIn,
VARIANT* pvarVariantOut,
VARIANT_BOOL *pvbHandled)
{
*pvbHandled = VARIANT_FALSE;
if (ExecuteOption == EnvDTE::vsCommandExecOptionDoDefault)
{
CAddInCommandHandlerMap::const_iterator it = m_mapCmdHandlers.find(bstrCmdName);
if (it != m_mapCmdHandlers.end() )
{
CAddInCommandHandler* pHandler = it->second;
if (NULL != pHandler)
{
return pHandler->Exec(bstrCmdName, ExecuteOption, pvarVariantIn, pvarVariantOut, pvbHandled);
}
}
}
return S_OK;
}
/////////////////////////////////////////////////////////////////////////////
// CAddInCommandManager implementation
void CAddInCommandManager::CreateCommandHandlers(void)
{
AddCommandHandler( new COpenMainWindowCommandHandler( m_pDTE,
L"ResOrgNETAddIn.Open",
m_hwndResOrg) );
AddCommandHandler( new CViewToolWindowCommandHandler(
m_pDTE,
L"ResOrgNETAddIn.ViewToolWin",
m_ptrToolWindow) );
AddCommandHandler( new COptionsCommandHandler(
m_pDTE,
L"ResOrgNETAddIn.Options") );
AddCommandHandler( new CAboutBoxCommandHandler( m_pDTE,
L"ResOrgNETAddIn.AboutBox") );
}
bool CAddInCommandManager::AddCommandHandler(CAddInCommandHandler* pHandler)
{
if (NULL != pHandler)
{
m_mapCmdHandlers.insert( CAddInCommandHandlerMapPair( pHandler->GetCommandName(), pHandler) );
return true;
}
return false;
}
bool CAddInCommandManager::CommandsExist(void) const
{
try
{
EnvDTE::CommandsPtr ptrCommands = m_pDTE->GetCommands();
EnvDTE::CommandPtr ptrCommand = ptrCommands->Item( CComVariant(L"ResOrgNETAddIn.AboutBox"), 0);
//IfNullIssueError(ptrCommand);
}
catch (const _com_error& e)
{
UNREFERENCED_PARAMETER(e);
return false;
}
return true;
}
HRESULT CAddInCommandManager::ConfigureCommands(CString* psErrorMsg /*= NULL*/)
{
HRESULT hr = S_OK;
RemoveCommands();
try
{
// Add the commands
EnvDTE::CommandPtr ptrOpenCommand = AddCommand(IDR_OPEN_RESORG_CMD, true);
EnvDTE::CommandPtr ptrViewToolWindowCommand = AddCommand(IDR_VIEW_MAIN_TOOLWIN_CMD, true);
EnvDTE::CommandPtr ptrOptionsCommand = AddCommand(IDR_OPTIONS_CMD, true);
EnvDTE::CommandPtr ptrAboutBoxCommand = AddCommand(IDR_ABOUTBOX_CMD, true);
// Add a submenu to the "Tools" menu
CString sTitle;
ATLVERIFY(sTitle.LoadString(IDS_PROJNAME) );
IDispatchPtr ptrToolsMenu = GetCommandBar( _T("Tools") );
IDispatchPtr ptrAddInSubmenu = GetCommandBar(sTitle);
if (ptrAddInSubmenu == NULL)
{
ptrAddInSubmenu = AddCommandBar(sTitle,
EnvDTE::vsCommandBarTypeMenu,
ptrToolsMenu,
1);
}
ATLASSERT(ptrAddInSubmenu != NULL);
if (ptrAddInSubmenu != NULL)
{
int nMenuPos = 1;
/////////////////////////////////////////////////////////////////////////////
AddCommandToCommandBar( ptrAddInSubmenu, ptrOpenCommand, nMenuPos++);
AddCommandToCommandBar( ptrAddInSubmenu, ptrViewToolWindowCommand, nMenuPos++);
AddCommandToCommandBar( ptrAddInSubmenu, ptrOptionsCommand, nMenuPos++);
AddCommandToCommandBar( ptrAddInSubmenu, ptrAboutBoxCommand, nMenuPos++);
}
/////////////////////////////////////////////////////////////////////////////
// Create the toolbar and add our commands to it
IDispatchPtr ptrAddInToolbar = AddCommandBar( sTitle,
EnvDTE::vsCommandBarTypeToolbar,
NULL,
0);
ATLASSERT(ptrAddInToolbar != NULL);
if (ptrAddInToolbar != NULL)
{
int nToolbarPos = 1;
AddCommandToCommandBar( ptrAddInToolbar, ptrOpenCommand, nToolbarPos++);
AddCommandToCommandBar( ptrAddInToolbar, ptrViewToolWindowCommand, nToolbarPos++);
AddCommandToCommandBar( ptrAddInToolbar, ptrOptionsCommand, nToolbarPos++);
AddCommandToCommandBar( ptrAddInToolbar, ptrAboutBoxCommand, nToolbarPos++);
}
// Position and show the toolbar
//EnvDTE80::Commands2Ptr ptrCommands2 = m_pDTE->GetCommands();
//if (ptrCommands2 != NULL)
//{
// // VS 2005
// Microsoft_VisualStudio_CommandBars::CommandBarPtr ptrVsAddInToolbar = ptrAddInToolbar;
// if (ptrVsAddInToolbar != NULL)
// {
// ptrVsAddInToolbar->PutTop(150);
// ptrVsAddInToolbar->PutLeft(100);
// ptrVsAddInToolbar->PutVisible(VARIANT_TRUE);
// }
//}
//else
//{
// VS2002 and 2003
Office::CommandBarPtr ptrMsoAddInToolbar = ptrAddInToolbar;
if (ptrMsoAddInToolbar != NULL)
{
ptrMsoAddInToolbar->PutTop(150);
ptrMsoAddInToolbar->PutLeft(100);
ptrMsoAddInToolbar->PutVisible(VARIANT_TRUE);
}
//}
}
catch (const _com_error& e)
{
hr = e.Error();
}
if (FAILED(hr) )
{
if (NULL != psErrorMsg)
{
psErrorMsg->Format( _T("ERROR: Failed to configure add-in commands (error code 0x%x).\r\nPlease report this fault to Riverblade Product Support (support@riverblade.co.uk)"), hr);
}
}
return hr;
}
EnvDTE::CommandPtr CAddInCommandManager::AddCommand(UINT uCmdSpecID, bool bEnabled)
{
EnvDTE::CommandPtr ptrCommand;
CString sCmd, sButtonText, sToolTip, sKeyBinding;
bool bHasBitmap = false;
if (!LoadCommandSpec( uCmdSpecID,
sCmd,
sButtonText,
sToolTip,
sKeyBinding,
bHasBitmap) )
{
return E_FAIL;
}
//lint -save -e655 (Warning -- bit-wise operation uses (compatible) enum's)
LONG lStatus = bEnabled ? EnvDTE::vsCommandStatusSupported | EnvDTE::vsCommandStatusEnabled :
EnvDTE::vsCommandStatusSupported;
//lint -restore
try
{
EnvDTE::CommandsPtr ptrCommands = m_pDTE->GetCommands();
//EnvDTE80::Commands2Ptr ptrCommands2 = ptrCommands;
//if (ptrCommands2 != NULL)
//{
// // Try to add commands to VS2005 using EnvDTE80
// ptrCommand = ptrCommands2->AddNamedCommand2(m_pAddInInstance,
// _bstr_t(sCmd),
// _bstr_t(sButtonText),
// _bstr_t(sToolTip),
// bHasBitmap ? VARIANT_FALSE : VARIANT_TRUE,
// static_cast<long>(bHasBitmap ? uCmdSpecID : 0),
// NULL,
// lStatus,
// EnvDTE80::vsCommandStylePictAndText,
// EnvDTE80::vsCommandControlTypeButton);
//}
if (ptrCommand == NULL)
{
// Try to add the command
ptrCommand = ptrCommands->AddNamedCommand( m_pAddInInstance,
_bstr_t(sCmd),
_bstr_t(sButtonText),
_bstr_t(sToolTip),
bHasBitmap ? VARIANT_FALSE : VARIANT_TRUE,
static_cast<long>(bHasBitmap ? uCmdSpecID : 0),
NULL,
lStatus);
}
if (ptrCommand == NULL)
{
// If the command failed to add, it could be down to our satellite DLL.
// Try again without a custom bitmap just in case.
// Note that this should only be an issue when debugging.
ptrCommand = ptrCommands->AddNamedCommand( m_pAddInInstance,
_bstr_t(sCmd),
_bstr_t(sButtonText),
_bstr_t(sToolTip),
VARIANT_TRUE,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -