📄 resourcesymbolbuffer.cpp
字号:
/************************************************************************
*
* 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 + -