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

📄 renumwizengine.cpp

📁 ResOrg 图形化管理Vc项目的资源ID的工具的源代码。 ResOrg - Manage and Renumber Resource Symbol IDs Introduction The
💻 CPP
字号:
/************************************************************************
 *
 *                  Resource ID Organiser Core Library
 *
 * (c) Copyright 2000-2005 by Riverblade Limited (UK). All rights reserved.
 *
 ************************************************************************
 *                                                                       
 *  Description : CRenumWizEngine - Settings and operations for the
 *                Symbol Renumbering Wizard
 *
 *  Compiler    : Microsoft Visual C++ 6.0, Service Pack 3 or later
 *                Microsoft Visual C++ .NET 2003
 *                                                                       
 *  Target                                                               
 *  Environment : Windows 98/NT/2000/XP
 *
 *  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/ResOrgCore/RenumWizEngine.cpp $
 *   $Revision: 15 $
 *       $Date: 31/12/04 16:26 $
 *     $Author: Anna $
 *
 *    $History: RenumWizEngine.cpp $
 * 
 * *****************  Version 15  *****************
 * User: Anna         Date: 31/12/04   Time: 16:26
 * Updated in $/Projects/AddIns/ResOrg/ResOrgCore
 * 1.  Added IDP_WARN_CONFIG_LOAD_FAILED and IDP_WARN_CONFIG_SAVE_FAILED
 * string table prompts for use when loading/saving config files (debug
 * builds only)
 * 2.  Updated file banners
 * 
 * *****************  Version 14  *****************
 * User: Anna         Date: 23/08/04   Time: 21:43
 * Updated in $/Projects/AddIns/ResOrg/ResOrgCore
 * Added support for out of range symbols
 * 
 * *****************  Version 13  *****************
 * User: Anna         Date: 11/05/04   Time: 0:22
 * Updated in $/Projects/AddIns/ResOrg/ResOrgCore
 * By popular request...added support for "Fixed" symbols
 * 
 * *****************  Version 12  *****************
 * User: Anna         Date: 20/04/03   Time: 15:35
 * Updated in $/Projects/AddIns/ResOrg/ResOrgCore
 * The default base values for renumbering are now read from the
 * appropriate CResourceSymbolManager object
 * 
 * *****************  Version 11  *****************
 * User: Anna         Date: 15/02/03   Time: 20:42
 * Updated in $/Projects/AddIns/ResOrg/ResOrgCore
 * Changed big BOOLs into little bools
 * 
 * *****************  Version 10  *****************
 * User: Anna         Date: 25/11/02   Time: 15:10
 * Updated in $/Projects/AddIns/ResOrg/ResOrgCore
 * Changed website address in banner
 * 
 * *****************  Version 9  *****************
 * User: Anna         Date: 22/10/02   Time: 13:24
 * Updated in $/Projects/AddIns/ResOrg/ResOrgCore
 * Changed name/mail address (at last!)
 * 
 * *****************  Version 8  *****************
 * User: Andy         Date: 7/06/02    Time: 17:04
 * Updated in $/Projects/AddIns/ResOrg/ResOrgCore
 * Renamed the ResOrgUtils module to ResOrgCore. Updated file banners
 * accordingly
 * 
 * *****************  Version 7  *****************
 * User: Andy         Date: 27/05/02   Time: 16:47
 * Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
 * Knock on changes from CResourceSymbolBuffer (now
 * CResourceSymbolManager)
 * 
 * *****************  Version 6  *****************
 * User: Andy         Date: 12/28/01   Time: 12:54a
 * Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
 * New functionality to support the new wizard page
 * 
 * *****************  Version 5  *****************
 * User: Andy         Date: 2/07/01    Time: 22:06
 * Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
 * CRenumWizEngine::Renumber() now shows a waitcursor while renumbering
 * symbols
 * 
 * *****************  Version 4  *****************
 * User: Andy         Date: 23/05/01   Time: 16:11
 * Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
 * Changed default options
 * 
 * *****************  Version 3  *****************
 * User: Andy         Date: 5/05/01    Time: 20:51
 * Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
 * Filter out read-only symbols from the list of symbols available for
 * renumbering
 * 
 * *****************  Version 2  *****************
 * User: Andy         Date: 4/05/01    Time: 22:37
 * Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
 * Renumber() no longer requires the editable symbols base value
 * 
 * *****************  Version 1  *****************
 * User: Andy         Date: 21/04/01   Time: 7:12
 * Created in $/Projects/AddIns/ResOrg/ResOrgUtils
 * 
 * $Nokeywords: $
 *
 ************************************************************************/

#include "StdAfx.h"

#include "ResOrgCore_Priv.h"
#include "ResOrgCore_Globals.h"
#include "ResOrgXmlWriter.h"

#include "RenumWizEngine.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


/////////////////////////////////////////////////////////////////////////////
// CRenumWizEngine

CRenumWizEngine::CRenumWizEngine(void)
{
	m_pSymbolManager				= NULL;

	m_eSymbolSelection				= RENUMWIZ_PROBLEM_SYMBOLS;
	m_eSymbolOrder					= RENUMWIZ_PRESERVE_ORDER;
	m_bSelectConflictingSymbols		= true;
	m_bSelectOutOfRangeSymbols		= false;
	m_bIgnoreFixedStatus			= FALSE;
	m_uBaseCommand					= 0;
	m_uBaseControl					= 0;
	m_uBaseResource					= 0;
	m_uBaseSymed					= 0;
}


CRenumWizEngine::~CRenumWizEngine(void)
{
}


/////////////////////////////////////////////////////////////////////////////
// Virtual Overrides

/////////////////////////////////////////////////////////////////////////////
// Operations

void CRenumWizEngine::Initialise(CResourceSymbolManager* pSymbolManager)
{
	m_pSymbolManager	= pSymbolManager;
	ASSERT_VALID(m_pSymbolManager);

	if (NULL != m_pSymbolManager)
	{
		if (Options.AutoSaveSymbolFileConfig() && !m_pSymbolManager->GetPathName().IsEmpty() )
		{
			CString sConfigFilePathName = CResOrgXmlWriter::GetConfigFilePathName(m_pSymbolManager->GetPathName() );

			if (::FileExists(sConfigFilePathName) )
			{
				CString sErrorMsg;
			
				if (!CResOrgXmlWriter::LoadSymbolFileConfig(m_pSymbolManager,
															sConfigFilePathName,
															&sErrorMsg) )
				{
#ifdef _DEBUG
					CNGSplitPath split(sConfigFilePathName);

					CString sMsg;
					sMsg.Format(IDP_WARN_CONFIG_LOAD_FAILED,
								split.GetFileName() + split.GetExtension(),
								sErrorMsg);

					::AfxMessageBox( sMsg, MB_OK | MB_ICONEXCLAMATION);
#endif
				}
			}
		}
		m_uBaseCommand					= m_pSymbolManager->GetBaseCommandValue();
		m_uBaseControl					= m_pSymbolManager->GetBaseControlValue();
		m_uBaseResource					= m_pSymbolManager->GetBaseResourceValue();
		m_uBaseSymed					= 0;

		m_pSymbolManager->GetSymbols(m_listAvailableSymbols);

		// Filter out read-only symbols
		POSITION pos = m_listAvailableSymbols.GetHeadPosition();
		while (NULL != pos)
		{
			POSITION posPrev = pos;
			CResourceSymbol* pSymbol = m_listAvailableSymbols.GetNext(pos);
			if ( (NULL == pSymbol) || pSymbol->IsReadOnly() )
			{
				m_listAvailableSymbols.RemoveAt(posPrev);
			}
		}
	}
}


int CRenumWizEngine::GetAvailableSymbols(CResourceSymbolList& rlistSymbols) const
{
	rlistSymbols.RemoveAll();

	rlistSymbols.AddTail( (CResourceSymbolList*)&m_listAvailableSymbols);

	return rlistSymbols.GetCount();
}


int CRenumWizEngine::GetSelectedSymbols(CResourceSymbolList& rlistSymbols) const
{
	rlistSymbols.RemoveAll();

	rlistSymbols.AddTail( (CResourceSymbolList*)&m_listSelectedSymbols);

	return rlistSymbols.GetCount();
}


bool CRenumWizEngine::Select(CResourceSymbol* pSymbol)
{
	bool bResult = false;

	POSITION pos = m_listAvailableSymbols.Find(pSymbol);
	if (NULL != pos)
	{
		m_listAvailableSymbols.RemoveAt(pos);
		m_listSelectedSymbols.AddTail(pSymbol);

		bResult = true;
	}
	return bResult;
}
 

bool CRenumWizEngine::IsSelected(CResourceSymbol* pSymbol) const
{
	bool bResult = false;

	POSITION pos = m_listSelectedSymbols.Find(pSymbol);
	if (NULL != pos)
	{
		bResult = true;
	}
	return bResult;
}


bool CRenumWizEngine::Deselect(CResourceSymbol* pSymbol)
{
	bool bResult = false;

	POSITION pos = m_listSelectedSymbols.Find(pSymbol);
	if (NULL != pos)
	{
		m_listSelectedSymbols.RemoveAt(pos);
		m_listAvailableSymbols.AddTail(pSymbol);

		bResult = true;
	}
	return bResult;
}


bool CRenumWizEngine::Renumber(void)
{
	bool bResult = false;

	CWaitCursor wait;

	// Copy the main buffer - that way all renumbering operations take place in a COPY
	// and the user can review them before committing to them
	m_LocalSymbolManager = *m_pSymbolManager;

	bool bSortByName = (RENUMWIZ_SORT_BY_NAME == m_eSymbolOrder);

	switch (m_eSymbolSelection)
	{
		case RENUMWIZ_ALL_SYMBOLS:						// All symbols
			bResult = m_LocalSymbolManager.Renumber(		m_uBaseResource,
															m_uBaseCommand,
															m_uBaseControl,
															m_bIgnoreFixedStatus,
															bSortByName);
			break;
			

		case RENUMWIZ_SELECTED_SYMBOLS:					// Selected symbols only
			{
				CResourceSymbolList listSymbolsToRenumber;
				GetLocalSelectedSymbols(listSymbolsToRenumber);

				bResult = m_LocalSymbolManager.Renumber(		&listSymbolsToRenumber,
																m_uBaseResource,
																m_uBaseCommand,
																m_uBaseControl,
																m_bIgnoreFixedStatus,
																bSortByName);
			}
			break;
			
		case RENUMWIZ_PROBLEM_SYMBOLS:					// Conflicting symbols only
			{
				CResourceSymbolList listSymbolsToRenumber;
				GetLocalSelectedSymbols(listSymbolsToRenumber);

				bResult = m_LocalSymbolManager.Renumber(		&listSymbolsToRenumber,
																m_uBaseResource,
																m_uBaseCommand,
																m_uBaseControl,
																m_bIgnoreFixedStatus,
																bSortByName);
			}
			break;
			
		default:
			ASSERT(false);
			break;
	}
	return bResult;
}


bool CRenumWizEngine::Renumber(CResourceSymbolList* plistSymbolsToRenumber)
{
	CWaitCursor wait;

	bool bSortByName = (RENUMWIZ_SORT_BY_NAME == m_eSymbolOrder);

	return m_LocalSymbolManager.Renumber(	plistSymbolsToRenumber,
											m_uBaseResource,
											m_uBaseCommand,
											m_uBaseControl,
											bSortByName);
}


int CRenumWizEngine::CommitChanges(void)
{
	int nCount = 0;

	if (NULL != m_pSymbolManager)
	{
		POSITION pos = m_LocalSymbolManager.GetFirstSymbolPosition();
		while (NULL != pos)
		{
			CResourceSymbol* pLocalSymbol = m_LocalSymbolManager.GetNextSymbol(pos);

			if ( (NULL != pLocalSymbol) && pLocalSymbol->IsModified() )
			{
				CResourceSymbolList listSymbols;
				m_pSymbolManager->GetSymbols(pLocalSymbol->GetName(), listSymbols);

				POSITION pos = listSymbols.GetHeadPosition();
				while (NULL != pos)
				{
					CResourceSymbol* pSymbol = listSymbols.GetNext(pos);

					if (NULL != pSymbol)
					{
						if (pSymbol->GetValue() == pLocalSymbol->GetOriginalValue() )
						{
							m_pSymbolManager->Set(	pSymbol,
													pLocalSymbol->GetName(),
													pLocalSymbol->GetValue(),
													pLocalSymbol->IsReadOnly() );
							nCount++;
						}
					}
				}
			}
		}
		m_pSymbolManager->SetBaseCommandValue(m_LocalSymbolManager.GetBaseCommandValue());
		m_pSymbolManager->SetBaseControlValue(m_LocalSymbolManager.GetBaseControlValue());
		m_pSymbolManager->SetBaseResourceValue(m_LocalSymbolManager.GetBaseResourceValue());

		m_pSymbolManager->SetNextCommandValue(m_LocalSymbolManager.GetNextCommandValue());
		m_pSymbolManager->SetNextControlValue(m_LocalSymbolManager.GetNextControlValue());
		m_pSymbolManager->SetNextResourceValue(m_LocalSymbolManager.GetNextResourceValue());
		m_pSymbolManager->SetNextSymedValue(m_LocalSymbolManager.GetNextSymedValue());

		if (Options.AutoSaveSymbolFileConfig() && !m_pSymbolManager->GetPathName().IsEmpty())
		{
			CString sConfigFilePathName = CResOrgXmlWriter::GetConfigFilePathName(m_pSymbolManager->GetPathName() );

			// Determine whether the file exists and is read-only.
			// If so, ask if the read only file should be overwritten.
			DWORD dwAttrib = ::GetFileAttributes(sConfigFilePathName);
			if (::FileExists(sConfigFilePathName) && (dwAttrib & FILE_ATTRIBUTE_READONLY) )
			{
				switch ( ::DoOverwritePrompt(sConfigFilePathName, false) )
				{
					case IDYES:
						if (!::SetFileAttributes(sConfigFilePathName, dwAttrib & ~FILE_ATTRIBUTE_READONLY) )
						{
							::AfxMessageBox(IDP_SYM_FILE_ERR_FILE_ATTRIBUTES, MB_OK | MB_ICONSTOP);
							return nCount;
						}
						break;

					case IDNO:
					case IDCANCEL:
						return nCount;

					default:
						ASSERT(false);
						break;
				}
			}
			CString sErrorMsg;
			
			if (!CResOrgXmlWriter::SaveSymbolFileConfig(m_pSymbolManager,
														sConfigFilePathName,
														&sErrorMsg) )
			{
#ifdef _DEBUG
				CNGSplitPath split(sConfigFilePathName);

				CString sMsg;
				sMsg.Format(IDP_WARN_CONFIG_SAVE_FAILED,
							split.GetFileName() + split.GetExtension(),
							sErrorMsg);

				::AfxMessageBox(sMsg, MB_OK | MB_ICONEXCLAMATION);
#endif
			}
		}
	}
	return nCount;
}


/////////////////////////////////////////////////////////////////////////////
// Implementation

int CRenumWizEngine::GetLocalSelectedSymbols(CResourceSymbolList& rlistSymbolsToRenumber) const
{
	rlistSymbolsToRenumber.RemoveAll();

	POSITION pos = m_listSelectedSymbols.GetHeadPosition();
	while (NULL != pos)
	{
		CResourceSymbol* pSymbol = m_listSelectedSymbols.GetNext(pos);
		if (NULL != pSymbol)
		{
			CResourceSymbolList listSymbols;
			m_LocalSymbolManager.GetSymbols(pSymbol->GetName(), listSymbols);

			rlistSymbolsToRenumber.AddTail(&listSymbols);
		}
	}
	return rlistSymbolsToRenumber.GetCount();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -