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

📄 resourcesymbolbuffer.cpp

📁 一个vc中管理资源文件ID的插件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/************************************************************************
 *
 *                 Resource ID Organiser Utility Library
 *
 *       (c) Copyright 2000 by Andy Metcalfe (andy.metcalfe@lineone.net)
 *                         All rights reserved.
 *
 ************************************************************************
 *                                                                       
 *  Filename    : ResourceSymbolBuffer.cpp
 *
 *  Description : CResourceSymbolBuffer - string buffer class for parsing
 *                manipulating and writing a resource symbol file
 *                
 *  Compiler    : Microsoft Visual C++ 6.0, Service Pack 3 or 4
 *                                                                       
 *  Target                                                               
 *  Environment : Windows 98/NT
 *
 *  NOTE:
 *
 *    This software is provided "as is" free for personal use. All
 *    title and copyrights in and to the software, including but not
 *    limited to any images, text, etc. incorporated into it, are
 *    owned by Andy Metcalfe, except where acknowledged otherwise.
 *
 *    Your may freely to use this code in your own products, PROVIDED
 *    this notice is not removed or modified.
 *
 *
 *    Visit http://www.resorg.co.uk for latest updates
 *
 ************************************************************************
 *
 *   MODIFICATION HISTORY:
 *
 *           This is a controlled document. See project configuration
 *           control tool for latest version and full version history.
 *
 *    $Archive: /Projects/AddIns/ResOrg/ResOrgUtils/ResourceSymbolBuffer.cpp $
 *   $Revision: 12 $
 *       $Date: 2/07/01 22:05 $
 *     $Author: Andy $
 *
 *    $History: ResourceSymbolBuffer.cpp $
 * 
 * *****************  Version 12  *****************
 * User: Andy         Date: 2/07/01    Time: 22:05
 * Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
 * CResourceSymbolBuffer::Renumber() is now updates "next symbol" values
 * correctly
 * 
 * *****************  Version 11  *****************
 * User: Andy         Date: 22/06/01   Time: 9:58
 * Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
 * CResourceSymbolBuffer::Serialize() now marks itself as "not modified"
 * after loading a file
 * 
 * *****************  Version 10  *****************
 * User: Andy         Date: 4/05/01    Time: 22:34
 * Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
 * Renumber() no longer takes the "editable symbol" base value as a
 * parameter (it was never used anyway)
 * 
 * *****************  Version 9  *****************
 * User: Andy         Date: 23/04/01   Time: 21:17
 * Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
 * 1.  Consolidated Renumber() methods
 * 2.  Speeded up symbol loading
 * 
 * *****************  Version 8  *****************
 * User: Andy         Date: 21/04/01   Time: 7:29
 * Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
 * Added new exported methods
 * 
 * *****************  Version 7  *****************
 * User: Andy         Date: 2/04/01    Time: 17:32
 * Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
 * 1.  Check for name conflicts as well as value conflicts
 * 2.  Added IsUnique(Name/Value) methods
 * 3.  Added	GetUnusedName() metho
 * 
 * *****************  Version 6  *****************
 * User: Andy         Date: 27/03/01   Time: 15:39
 * Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
 * 1.  Added the capability to check resource symbol names for conflicts
 * 2.  Removed unused (and stubbed) Lookup() methods
 * 
 * *****************  Version 5  *****************
 * User: Andy         Date: 2/03/01    Time: 17:03
 * Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
 * 1.  Replaced literal strings with string table entries
 * 2.  Added a CResourceSymbolValuesMap object to manage symbol values
 * 3.  Removed CResourceSymbolBuffer::EditReservedSymbols() [this is now
 * the responsibility of CResOrgSymbolsDoc]
 * 
 * *****************  Version 4  *****************
 * User: Andy         Date: 19/02/01   Time: 8:30
 * Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
 * Added better tracking of values (alongside the existing method for
 * now..)
 * 
 * *****************  Version 3  *****************
 * User: Andy         Date: 17/02/01   Time: 6:54
 * Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
 * 1.  Added CResourceSymbolBuffer::GetDisplayedStatus() and GetSymbols()
 * 2.  Added support for read only symbols (the values of which saved in
 * hexadecimal)
 * 
 * *****************  Version 2  *****************
 * User: Andy         Date: 29/11/00   Time: 18:38
 * Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
 *  Added file banners
 *
 * $Nokeywords: $
 *
 ************************************************************************/


// ResourceSymbolBuffer.cpp : implementation file
//

#include "StdAfx.h"
#include <math.h>
#include "ResOrgUtils_Priv.h"

#include "ResourceSymbol.h"
#include "ReservedSymbolsDlg.h"

#include "ResourceSymbolBuffer.h"


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


/////////////////////////////////////////////////////////////////////////////
// CResourceSymbolBuffer

#define BUFFER_GROWBY 100			// Grow file buffer by 100 lines at a time

#define	BUF_SIZE	1024

#define WHITE_SPACE	_T(" \t")


IMPLEMENT_DYNCREATE(CResourceSymbolBuffer, CResourceSymbolBuffer_BASE)

CResourceSymbolBuffer::CResourceSymbolBuffer(void)
{
	m_sResourceFileName		= _T("");

	m_b3dControls			= TRUE;
	m_uNextResourceValue	= 100;
	m_uNextControlValue		= 1000;
	m_uNextSymedValue		= 200;
	m_uNextCommandValue		= 32771;

	m_bModified				= FALSE;
	m_nConflicts			= 0;
}


CResourceSymbolBuffer::~CResourceSymbolBuffer(void)
{
	RemoveAll();
}


/////////////////////////////////////////////////////////////////////////////
// CResourceSymbolBuffer message handlers

void CResourceSymbolBuffer::Serialize(CArchive& ar) 
{
	ASSERT_VALID(this);
	
	CResourceSymbolBuffer_BASE::Serialize(ar);

	if (ar.IsLoading())
	{
		SortByValue();

		CountConflicts();

		SetModifiedFlag(FALSE);
	}
}


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


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

CString CResourceSymbolBuffer::GetDisplayedStatus(CResourceSymbol* pSymbol) const
{
	CString sStatus;

	if (!IsUnique( pSymbol->GetName() ) )
	{
		sStatus.LoadString(IDS_SYM_NAME_CONFLICT);
	}
	else if (!IsUnique( pSymbol->GetValue() ) )
	{
		CString sConflictList;

		CResourceSymbolList listSymbols;
		GetConflicts(pSymbol, listSymbols);

		POSITION pos = listSymbols.GetHeadPosition();
		while (pos != NULL)
		{
			CResourceSymbol* pConflictSymbol = listSymbols.GetNext(pos);
			if ( (NULL != pConflictSymbol) && (pConflictSymbol != pSymbol) )
			{
				sConflictList += pConflictSymbol->GetName() + _T(", ");
			}
		}
		sConflictList.TrimRight( _T(", ") );

		sStatus.Format(IDS_SYM_CONFLICTS, sConflictList);
	}
	else if (pSymbol->IsModified())
	{
		sStatus.LoadString(IDS_SYM_MODIFIED);
	}
	else if (pSymbol->IsReadOnly())
	{
		sStatus.LoadString(IDS_SYM_READONLY);
	}
	else
	{
		sStatus.LoadString(IDS_SYM_OK);
	}
	return sStatus;
}


BOOL CResourceSymbolBuffer::IsUnique(const CString& sName) const
{
	int nCount = m_mapNames.GetCount(sName);

	return (nCount <= 1);
}


BOOL CResourceSymbolBuffer::IsUnique(UINT uValue) const
{
	int nCount = m_mapValues.GetCount(uValue);

	return (nCount <= 1);
}


BOOL CResourceSymbolBuffer::IsInUse(const CString& sName) const
{
	int nCount = m_mapNames.GetCount(sName);

	return (nCount > 0);
}


BOOL CResourceSymbolBuffer::IsInUse(UINT uValue) const
{
	int nCount = m_mapValues.GetCount(uValue);

	return (nCount > 0);
}


int CResourceSymbolBuffer::GetSymbols(CResourceSymbolList& rlistSymbols) const
{
	rlistSymbols.RemoveAll();

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

	return rlistSymbols.GetCount();
}


int CResourceSymbolBuffer::GetSymbols(UINT uValue, CResourceSymbolList& rlistSymbols) const
{
	rlistSymbols.RemoveAll();

	m_mapValues.GetSymbols(uValue, rlistSymbols);

	return rlistSymbols.GetCount();
}


int CResourceSymbolBuffer::GetSymbols(const CString& sName, CResourceSymbolList& rlistSymbols) const
{
	rlistSymbols.RemoveAll();

	m_mapNames.GetSymbols(sName, rlistSymbols);

	return rlistSymbols.GetCount();
}


CResourceSymbol* CResourceSymbolBuffer::Add(const CString& sSymbolName,
											UINT uSymbolValue,
											int nLineNo,
											BOOL bUpdateMetrics /*= TRUE*/)
{
	if (sSymbolName == _T("_APS_3D_CONTROLS") )
	{
		m_b3dControls			= uSymbolValue;
	}
	else if (sSymbolName == _T("_APS_NEXT_RESOURCE_VALUE") )
	{
		m_uNextResourceValue	= uSymbolValue;
	}
	else if (sSymbolName == _T("_APS_NEXT_CONTROL_VALUE") )
	{
		m_uNextControlValue		= uSymbolValue;
	}
	else if (sSymbolName == _T("_APS_NEXT_SYMED_VALUE") )
	{
		m_uNextSymedValue		= uSymbolValue;
	}
	else if (sSymbolName == _T("_APS_NEXT_COMMAND_VALUE") )
	{
		m_uNextCommandValue		= uSymbolValue;
	}
	else
	{
		CResourceSymbol* pSymbol = new CResourceSymbol;

		pSymbol->SetName(sSymbolName);
		pSymbol->SetValue(uSymbolValue);
		pSymbol->SetFileName(m_sFileName);
		pSymbol->SetLineNo(nLineNo);
		pSymbol->SetModifiedFlag(FALSE);

		if (Add(pSymbol, bUpdateMetrics) )
		{
			return pSymbol;
		}
		delete pSymbol;
	}
	return NULL;
}


BOOL CResourceSymbolBuffer::Set(CResourceSymbol* pSymbol,
								const CString& sName,
								UINT uValue,
								BOOL bReadOnly /*= FALSE*/)
{
	if (uValue != pSymbol->GetValue() )
	{
		m_mapValues.Remove(pSymbol);

		if (pSymbol->SetValue(uValue))
		{
			m_mapValues.Add(pSymbol);
		}
		m_bModified = TRUE;
	}
	if (sName != pSymbol->GetName())
	{
		m_mapNames.Remove(pSymbol);

		if (pSymbol->SetName(sName))
		{
			m_mapNames.Add(pSymbol);
		}
		m_bModified = TRUE;
	}
	if (bReadOnly != pSymbol->IsReadOnly())
	{
		pSymbol->SetReadOnly(bReadOnly);
		m_bModified = TRUE;
	}
	CountConflicts();

	return m_bModified;
}


BOOL CResourceSymbolBuffer::Add(CResourceSymbol* pSymbol,
								BOOL bUpdateMetrics /*= TRUE*/)
{
	m_listSymbols.AddTail(pSymbol);

	m_mapNames.Add(pSymbol);
	m_mapValues.Add(pSymbol);

	if (bUpdateMetrics)
	{
		SortByValue();

		CountConflicts();
	}
	return TRUE;
}


BOOL CResourceSymbolBuffer::Remove(CResourceSymbol* pSymbol,
								   BOOL bUpdateMetrics /*= TRUE */)
{
	POSITION pos = m_listSymbols.Find(pSymbol);
	if (pos != NULL)
	{
		m_listSymbols.RemoveAt(pos);

		m_mapNames.Remove(pSymbol);
		m_mapValues.Remove(pSymbol);

		if (bUpdateMetrics)
		{
			CountConflicts();

			m_bModified = TRUE;
		}
		return TRUE;
	}
	return FALSE;
}


void CResourceSymbolBuffer::RemoveAll(void)
{
	POSITION pos = m_listSymbols.GetHeadPosition();
	while (pos != NULL)
	{
		CResourceSymbol* pSymbol = m_listSymbols.GetNext(pos);
		if (pSymbol != NULL)
		{
			delete pSymbol;
		}
	}
	m_listSymbols.RemoveAll();
	m_mapNames.RemoveAll();
	m_mapValues.RemoveAll();

	m_nConflicts = 0;

	m_bModified = TRUE;
}


int CResourceSymbolBuffer::GetSymbolCount(CResourceSymbolCounts& rInfo) const
{
	POSITION pos = GetFirstSymbolPosition();
	while (pos != NULL)
	{
		CResourceSymbol* pSymbol = GetNextSymbol(pos);
		switch (pSymbol->GetType())
		{
			case SYM_RESOURCE:
			case SYM_BITMAP:
			case SYM_DIALOG:
			case SYM_MENU:
			case SYM_ICON:
			case SYM_PROMPT:
			case SYM_STRING:
				rInfo.m_nResources++;
				break;

			case SYM_CONTROL:
				rInfo.m_nControls++;
				break;

			case SYM_COMMAND:
				rInfo.m_nCommands++;
				break;

			default:
				ASSERT(FALSE);
				break;
		}
	}
	return rInfo.m_nResources +	rInfo.m_nControls + rInfo.m_nCommands;
}


BOOL CResourceSymbolBuffer::CalculateBaseValues(UINT& ruBaseResource,
												UINT& ruBaseCommand) const
{
	int nLowSum = 0;
	int nHighSum = 0;
	int nLowSymCount = 0;
	int nHighSymCount = 0;

	POSITION pos = GetFirstSymbolPosition();
	while (pos != NULL)
	{
		CResourceSymbol* pSymbol = GetNextSymbol(pos);

		UINT uValue = pSymbol->GetValue();
		if (uValue >= 32767)	// high range
		{
			nHighSum += uValue;
			nHighSymCount++;
		}
		else
		{
			nLowSum += uValue;
			nLowSymCount++;
		}
	}
	if (nLowSum > 0)
	{
		int nLowAvg = (nLowSum / nLowSymCount);

		ruBaseResource	= (int)(1000 * ::floor( (double)nLowAvg / 1000.0) );
	}
	if (nHighSum > 0)
	{
		int nHighAvg = (nHighSum / nHighSymCount);

		ruBaseCommand	= (int)(1000 * ::floor( (double)nHighAvg / 1000.0) );
	}
	BOOL bResult = ((nLowSum > 0) && (nHighSum > 0));

	// Validate against defined ranges, just to be sure....
	// This is friggy code, but it'll do for now
	if (ruBaseResource < 100)
	{
		ruBaseResource = 100;
	}
	else if (ruBaseResource > 28671)
	{
		ruBaseResource = 28000;
	}
	if (ruBaseCommand < 32768)
	{
		ruBaseCommand	= 32768;
	}
	else if (ruBaseCommand > 57343)
	{
		ruBaseCommand	= 57000;
	}
	return bResult;
}


BOOL CResourceSymbolBuffer::Renumber(	CResourceSymbolList* plistSymbols,
										UINT uBaseResource,
										UINT uBaseCommand,
										UINT uBaseControl,
										BOOL bSortByName /*= TRUE*/)
{
	BOOL bResult = FALSE;

	UINT uNextResourceValue		= uBaseResource;
	UINT uNextControlValue		= uBaseControl;
	UINT uNextCommandValue		= uBaseCommand;

	if (bSortByName)
	{

⌨️ 快捷键说明

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