📄 resourcesymbolmanager.cpp
字号:
/************************************************************************
*
* Resource ID Organiser Core Library
*
* (c) Copyright 2000-2004 by Anna-Jayne Metcalfe (resorg@annasplace.me.uk)
* All rights reserved.
*
************************************************************************
*
* Filename : ResourceSymbolManager.cpp
*
* Description : CResourceSymbolManager - manager class for resource
* symbols
*
* 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" 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 Anna-Jayne 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.annasplace.me.uk/resorg 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/ResOrgCore/ResourceSymbolManager.cpp $
* $Revision: 45 $
* $Date: 20/12/04 13:12 $
* $Author: Anna $
*
* $History: ResourceSymbolManager.cpp $
*
* ***************** Version 45 *****************
* User: Anna Date: 20/12/04 Time: 13:12
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* Initialised some class members
*
* ***************** Version 44 *****************
* User: Anna Date: 29/08/04 Time: 21:13
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* Corrections to CResourceSymbolManager::IsOutOfRange()
*
* ***************** Version 43 *****************
* User: Anna Date: 29/08/04 Time: 10:46
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* CResourceSymbolManager::GetSymbolCount() now supports toolbars and
* accelerators
*
* ***************** Version 42 *****************
* User: Anna Date: 23/08/04 Time: 21:36
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* Added support for out of range symbol detection
*
* ***************** Version 41 *****************
* User: Anna Date: 11/07/04 Time: 16:15
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* Added support for detection of out of range symbols
*
* ***************** Version 40 *****************
* User: Anna Date: 11/05/04 Time: 0:22
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* By popular request...added support for "Fixed" symbols
*
* ***************** Version 39 *****************
* User: Anna Date: 26/06/03 Time: 20:17
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* 1. Added CResourceSymbolManager::GetBaseSymbolValue() to allow the
* "Fix Conflicts" command in the Symbols Display to choose more
* appropriate values.
* 2. Replaced hardcoded base symbol values with #defines
*
* ***************** Version 38 *****************
* User: Anna Date: 23/06/03 Time: 16:41
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* Improved handling of symbol base values
*
* ***************** Version 37 *****************
* User: Anna Date: 15/04/03 Time: 20:50
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* 1. Improved support for base values
* 2. Removed unnecessary file guards (#pragma once works well enough)
*
* ***************** Version 36 *****************
* User: Anna Date: 3/04/03 Time: 13:31
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* Added symbol base value attributes (not used yet)
*
* ***************** Version 35 *****************
* User: Anna Date: 19/03/03 Time: 19:14
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* CResourceSymbolManager::Set() now calls
* CResourceSymbol::RemoveConflict() if appropriate
*
* ***************** Version 34 *****************
* User: Anna Date: 3/03/03 Time: 20:10
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* Moved XML code to its own class (CResOrgXmlWriter)
*
* ***************** Version 33 *****************
* User: Anna Date: 27/02/03 Time: 13:38
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* Write "uid" attriutes for symbols and files so the XSL stylesheet can
* identify objects uniquely
*
* ***************** Version 32 *****************
* User: Anna Date: 19/02/03 Time: 19:20
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* Started adding XML export and HTML reports
*
* ***************** Version 31 *****************
* User: Anna Date: 15/02/03 Time: 20:50
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* Changed big BOOLs into little bools
*
* ***************** Version 30 *****************
* User: Anna Date: 19/01/03 Time: 17:24
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* CResourceSymbolManager::Serialize() now correctly calls
* CResourceSymbol::SetUserData()
*
* ***************** Version 29 *****************
* User: Anna Date: 3/01/03 Time: 7:38
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* CResourceSymbolManager doesn't need dynamic creation support
* (DECLARE_DYNCREATE) - changed to runtime class info support
* (DECLARE_DYNAMIC)
*
* ***************** Version 28 *****************
* User: Anna Date: 2/01/03 Time: 0:09
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* Mods for compatibility with multi-file symbol editing
*
* ***************** Version 27 *****************
* User: Anna Date: 17/12/02 Time: 15:38
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* 1. CResourceSymbolManager::Add() now sets the "User Data" field of a
* CResourceSymbol object it creates
* 2. Minor correction to CResourceSymbolManager::GetNextFreeValue()
*
* ***************** Version 26 *****************
* User: Anna Date: 25/11/02 Time: 15:19
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* Changed website address in banner
*
* ***************** Version 25 *****************
* User: Anna Date: 22/10/02 Time: 13:24
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* Changed name/mail address (at last!)
*
* ***************** Version 24 *****************
* User: Andy Date: 1/08/02 Time: 16:29
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* Added CResourceSymbolManager::m_sPathName
*
* ***************** Version 23 *****************
* User: Andy Date: 12/06/02 Time: 22:58
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* Improved calculation of "Next Symbol" values
*
* ***************** Version 22 *****************
* 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 21 *****************
* User: Andy Date: 27/05/02 Time: 13:33
* Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
* 1. Renamed CResourceSymbolBuffer as CResourceSymbolManager
* 2. Moved header file parsing/writing code to a new class
* (CResourceSymbolFileBuffer)
*
* ***************** Version 20 *****************
* User: Andy Date: 12/28/01 Time: 12:55a
* Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
* Changes to support new options and Wizard functionality
*
* ***************** Version 19 *****************
* User: Andy Date: 11/07/01 Time: 1:21p
* Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
* 1. Corrected the order of the "Next Symbol" defines
* 2. Changed the formatting of #defines to be a closer match to the
* VC6.0 format (useful for file differencing)
*
* ***************** Version 18 *****************
* User: Andy Date: 10/21/01 Time: 11:04p
* Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
* Corrected resource count in CResourceSymbolBuffer::GetSymbolCount() [it
* was erroneously including controls]
*
* ***************** Version 17 *****************
* User: Andy Date: 10/03/01 Time: 12:38p
* Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
* Added CResourceSymbolBuffer::AreNextSymbolValuesInUse() and
* CalculateNextSymbolValues()
*
* ***************** Version 16 *****************
* User: Andy Date: 16/08/01 Time: 7:01
* Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
* Bug fix in CResourceSymbolBuffer::UpdateNextSymbolValues()
*
* ***************** Version 15 *****************
* User: Andy Date: 16/08/01 Time: 6:37
* Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
* Replaced some direct reads of member variables with access methods
*
* ***************** Version 14 *****************
* User: Andy Date: 15/08/01 Time: 21:59
* Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
* Removed unnecessary #include of ReservedSymbolsDlg.h
*
* ***************** Version 13 *****************
* User: Andy Date: 15/08/01 Time: 12:34
* Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
* 1. Added extra metrics to CResourceSymbolCounts
* 2. CResourceSymbolBuffer attributes are now protected
* 3. Added access methods for "Next Symbol" values to
* CResourceSymbolBuffer
* 4. CResourceSymbolBuffer::Serialize() now sets the "3D Controls" value
* to 0 when loading a file in case it wasn't specified (otherwise it gets
* converted to 1 when the file is saved)
* 5. CResourceSymbolBuffer::GetSymbolCount() now returns additional
* metrics
* CResourceSymbolBuffer::CalculateBaseValues()
* 6. The _APS_3D_CONTROLS define is now written to the file ONLY if the
* value is set to 1 (true*
*
* ***************** 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: $
*
************************************************************************/
#include "StdAfx.h"
#include <math.h>
#include "ResOrgCore_Priv.h"
#include "ResourceSymbol.h"
#include "ResourceSymbolFileBuffer.h"
#include "ResourceSymbolManager.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
static UINT GetBaseRangeFromValue(UINT uValue)
{
return (UINT)(1000 * ::floor( ((double)uValue) / 1000.0) );
}
/////////////////////////////////////////////////////////////////////////////
// CResourceSymbolManager
IMPLEMENT_DYNAMIC(CResourceSymbolManager, CResourceSymbolManager_BASE)
CResourceSymbolManager::CResourceSymbolManager(bool bAutoDelete /*= false*/)
{
m_bAutoDelete = bAutoDelete; // Only set if created by CResourceSymbolConflictManager.
m_sPathName = _T("");
m_sResourceFileName = _T("");
m_uBaseResourceValue = SYM_RESOURCE_VALUE_DEFAULT;
m_uBaseControlValue = SYM_CONTROL_VALUE_DEFAULT;
m_uBaseCommandValue = SYM_COMMAND_VALUE_DEFAULT;
m_uNextResourceValue = SYM_RESOURCE_VALUE_DEFAULT;
m_uNextControlValue = SYM_CONTROL_VALUE_DEFAULT;
m_uNextCommandValue = SYM_COMMAND_VALUE_DEFAULT;
m_uNextSymedValue = m_uNextResourceValue + 100;
m_b3dControls = true;
m_bModified = false;
m_nConflicts = 0;
m_nOutOfRangeSymbols = 0;
m_nProblemSymbols = 0;
m_bCheckForOutOfRangeSymbols = Options.CheckForOutOfRangeSymbols();
}
CResourceSymbolManager::CResourceSymbolManager(const CResourceSymbolManager& src)
{
m_bAutoDelete = false;
*this = src;
}
CResourceSymbolManager::~CResourceSymbolManager(void)
{
RemoveAll();
}
/////////////////////////////////////////////////////////////////////////////
// CResourceSymbolManager operators
void CResourceSymbolManager::operator=(const CResourceSymbolManager& src)
{
RemoveAll();
m_sPathName = src.m_sPathName;
m_sResourceFileName = src.m_sResourceFileName;
m_bModified = src.m_bModified;
m_nConflicts = src.m_nConflicts;
m_nOutOfRangeSymbols = src.m_nOutOfRangeSymbols;
m_nProblemSymbols = src.m_nProblemSymbols;
CResourceSymbolList listSymbols;
src.GetSymbols(listSymbols);
POSITION pos = listSymbols.GetHeadPosition();
while (NULL != pos)
{
CResourceSymbol* pSymbol = listSymbols.GetNext(pos);
if (NULL != pSymbol)
{
Add(pSymbol->GetName(),
pSymbol->GetValue(),
0,
false);
}
}
SortByValue();
CountConflicts();
m_b3dControls = src.m_b3dControls;
m_uNextResourceValue = src.m_uNextResourceValue;
m_uNextControlValue = src.m_uNextControlValue;
m_uNextSymedValue = src.m_uNextSymedValue;
m_uNextCommandValue = src.m_uNextCommandValue;
SetModifiedFlag(false);
}
/////////////////////////////////////////////////////////////////////////////
// CResourceSymbolManager Virtual Overrides
void CResourceSymbolManager::Serialize(CArchive& ar)
{
ASSERT_VALID(this);
if (ar.IsLoading())
{
RemoveAll();
CResourceSymbolFileBuffer buffer(&m_listSymbols);
buffer.Serialize(ar);
m_sPathName = ar.GetFile()->GetFilePath();
m_sResourceFileName = buffer.GetResourceFileName();
UINT uBaseResourceValue = SYM_RESOURCE_VALUE_MIN;
UINT uBaseControlValue = SYM_CONTROL_VALUE_MIN;
UINT uBaseCommandValue = SYM_COMMAND_VALUE_MIN;
// UINT uBaseResourceValue = 0;
// UINT uBaseControlValue = 0;
// UINT uBaseCommandValue = 0;
m_uNextResourceValue = buffer.GetNextResourceValue();
m_uNextCommandValue = buffer.GetNextCommandValue();
m_uNextControlValue = buffer.GetNextControlValue();
m_uNextSymedValue = buffer.GetNextSymedValue();
m_b3dControls = (FALSE != buffer.Get3dControlsValue());
POSITION pos = m_listSymbols.GetHeadPosition();
while (NULL != pos)
{
CResourceSymbol* pSymbol = m_listSymbols.GetNext(pos);
if (NULL != pSymbol)
{
m_mapNames.Add(pSymbol);
m_mapValues.Add(pSymbol);
pSymbol->SetUserData( (INT_PTR)this );
UINT uValue = pSymbol->GetValue();
switch (pSymbol->GetType())
{
case SYM_RESOURCE:
default:
// if ( (uValue < uBaseResourceValue) && (uValue >= SYM_RESOURCE_VALUE_MIN) )
// if ( (uValue < uBaseResourceValue) || (0 == uBaseResourceValue) )
if ( (SYM_RESOURCE_VALUE_MIN == uBaseResourceValue) ||
( (uValue < uBaseResourceValue) && (uValue >= SYM_RESOURCE_VALUE_MIN) ) )
{
uBaseResourceValue = uValue;
}
break;
case SYM_CONTROL:
// if ( (uValue < uBaseControlValue) && (uValue >= SYM_CONTROL_VALUE_MIN) )
// if ( (uValue < uBaseControlValue) || (0 == uBaseControlValue) )
if ( (SYM_CONTROL_VALUE_MIN == uBaseControlValue) ||
( (uValue < uBaseControlValue) && (uValue >= SYM_CONTROL_VALUE_MIN) ) )
{
uBaseControlValue = uValue;
}
break;
case SYM_COMMAND:
// if ( (uValue < uBaseCommandValue) && (uValue >= SYM_COMMAND_VALUE_MIN) )
// if ( (uValue < uBaseCommandValue) || (0 == uBaseCommandValue) )
if ( (SYM_COMMAND_VALUE_MIN == uBaseCommandValue) ||
( (uValue < uBaseCommandValue) && (uValue >= SYM_COMMAND_VALUE_MIN) ) )
{
uBaseCommandValue = uValue;
}
break;
}
}
}
SetBaseResourceValue(uBaseResourceValue);
SetBaseControlValue(uBaseControlValue);
SetBaseCommandValue(uBaseCommandValue);
SortByValue();
CountConflicts();
SetModifiedFlag(false);
}
else
{
CResourceSymbolFileBuffer buffer(&m_listSymbols);
buffer.SetResourceFileName(m_sResourceFileName);
buffer.SetNextResourceValue(m_uNextResourceValue);
buffer.SetNextCommandValue(m_uNextCommandValue);
buffer.SetNextControlValue(m_uNextControlValue);
buffer.SetNextSymedValue(m_uNextSymedValue);
buffer.Set3dControlsValue(m_b3dControls);
buffer.Serialize(ar);
}
}
/////////////////////////////////////////////////////////////////////////////
// CResourceSymbolManager Operations
CString CResourceSymbolManager::GetFileName(void) const
{
CNGSplitPath split(m_sPathName);
return split.GetFileName() + split.GetExtension();
}
bool CResourceSymbolManager::ReadSymbolFile(const CString& sPathName)
{
ASSERT(!sPathName.IsEmpty() );
if (!sPathName.IsEmpty() )
{
CStdioFile f;
CFileException e;
if (f.Open( sPathName,
CFile::modeRead |
CFile::shareDenyWrite,
&e) )
{
// File opened OK
//
// Now create an archive, and an empty text buffer
CArchive ar(&f, CArchive::load);
Serialize(ar);
try
{
ar.Flush();
ar.Close();
f.Flush();
f.Close();
}
catch (CException* e)
{
TCHAR szCause[255];
e->GetErrorMessage(szCause, 255);
CString sMsg;
sMsg.Format( _T("Error closing project file\n\nDetails: %s\n"), szCause);
TRACE1("%s\n", sMsg);
AfxMessageBox(sMsg, MB_OK | MB_ICONSTOP);
e->Delete();
}
return true;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -