⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 addincommandmanager.cpp

📁 ResOrg 图形化管理Vc项目的资源ID的工具的源代码。 ResOrg - Manage and Renumber Resource Symbol IDs Introduction The
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/************************************************************************
 *
 *            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 + -