📄 resorgsymbolsdoc.cpp
字号:
/************************************************************************
*
* Resource ID Organiser Utility Library
*
* (c) Copyright 2000 by Andy Metcalfe (andy.metcalfe@lineone.net)
* All rights reserved.
*
************************************************************************
*
* Filename : ResOrgSymbolsDoc.cpp
*
* Description : CResOrgSymbolsDoc - document class for 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/ResOrgSymbolsDoc.cpp $
* $Revision: 7 $
* $Date: 22/06/01 9:51 $
* $Author: Andy $
*
* $History: ResOrgSymbolsDoc.cpp $
*
* ***************** Version 7 *****************
* User: Andy Date: 22/06/01 Time: 9:51
* Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
* CResOrgSymbolsDoc::OnCmdRenumberSymbol() no longer marks the document
* as changed if the wizard is cancelled without changing anything
*
* ***************** Version 6 *****************
* User: Andy Date: 2/03/01 Time: 17:06
* Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
* 1. Made view hints more specific to remove the need to rebuild the
* displays completely
* 2. CResOrgSymbolsDoc::OnCmdFileProperties() now handles the details of
* displaying the File Properties Dialog, rather than asking
* CResourceSymbolBuffer to do it
*
* ***************** Version 5 *****************
* User: Andy Date: 19/02/01 Time: 8:30
* Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
* Better view hints
*
* ***************** Version 4 *****************
* User: Andy Date: 17/02/01 Time: 6:57
* Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
* 1. Knock-on changes from renaming of CResOrgSymbolsView to
* CResOrgSymbolsListView
* 2. Added wrappers around commonly used CResourceSymbolBuffer methods
* [e.g. Set()] to remove the need for views to raise view hints
*
* ***************** Version 3 *****************
* User: Andy Date: 29/11/00 Time: 18:38
* Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
* Added file banners
*
* $Nokeywords: $
*
************************************************************************/
// ResOrgSymbolsDoc.cpp : implementation of the CResOrgSymbolsDoc class
//
#include "StdAfx.h"
#include "ResOrgUtils_Res.h"
#include "ResourceSymbol.h"
#include "RenumWizard.h"
#include "ReservedSymbolsDlg.h"
#include "ResOrgSymbolsDoc.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CResOrgSymbolsDoc
IMPLEMENT_DYNCREATE(CResOrgSymbolsDoc, CResOrgSymbolsDoc_BASE)
BEGIN_MESSAGE_MAP(CResOrgSymbolsDoc, CResOrgSymbolsDoc_BASE)
//{{AFX_MSG_MAP(CResOrgSymbolsDoc)
ON_COMMAND( ID_FILE_CLOSE, OnFileClose)
ON_COMMAND( ID_FILE_SAVE, OnFileSave)
ON_COMMAND( ID_FILE_SAVE_AS, OnFileSaveAs)
ON_COMMAND( ID_FILE_PROPERTIES, OnCmdFileProperties)
ON_COMMAND( ID_FILE_CHANGED, OnCmdFileChanged)
ON_COMMAND( ID_TOOLS_RENUMBER, OnCmdRenumberSymbols)
ON_UPDATE_COMMAND_UI( ID_TOOLS_RENUMBER, OnUpdateRenumberSymbols)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CResOrgSymbolsDoc construction/destruction
CResOrgSymbolsDoc::CResOrgSymbolsDoc(void)
{
}
CResOrgSymbolsDoc::~CResOrgSymbolsDoc(void)
{
}
/////////////////////////////////////////////////////////////////////////////
// CResOrgSymbolsDoc overrides
BOOL CResOrgSymbolsDoc::OnNewDocument(void)
{
BOOL bResult = CResOrgSymbolsDoc_BASE::OnNewDocument();
return bResult;
}
BOOL CResOrgSymbolsDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
BOOL bResult = CResOrgSymbolsDoc_BASE::OnOpenDocument(lpszPathName);
if (bResult)
{
StartFileChangeMonitor(lpszPathName);
}
return bResult;
}
BOOL CResOrgSymbolsDoc::OnSaveDocument(LPCTSTR lpszPathName)
{
BOOL bResult = CResOrgSymbolsDoc_BASE::OnSaveDocument(lpszPathName);
if (bResult)
{
m_ResourceSymbolBuffer.SetModifiedFlag(FALSE);
StartFileChangeMonitor(lpszPathName);
UpdateAllViews(NULL, SYM_REFRESH);
}
return bResult;
}
void CResOrgSymbolsDoc::OnCloseDocument(void)
{
StopFileChangeMonitor();
CResOrgSymbolsDoc_BASE::OnCloseDocument();
}
void CResOrgSymbolsDoc::DeleteContents(void)
{
m_ResourceSymbolBuffer.RemoveAll();
UpdateAllViews(NULL, SYM_REFRESH);
CResOrgSymbolsDoc_BASE::DeleteContents();
}
/////////////////////////////////////////////////////////////////////////////
// CResOrgSymbolsDoc serialization
void CResOrgSymbolsDoc::Serialize(CArchive& ar)
{
m_ResourceSymbolBuffer.Serialize(ar);
}
/////////////////////////////////////////////////////////////////////////////
// CResOrgSymbolsDoc diagnostics
#ifdef _DEBUG
void CResOrgSymbolsDoc::AssertValid(void) const
{
CResOrgSymbolsDoc_BASE::AssertValid();
}
void CResOrgSymbolsDoc::Dump(CDumpContext& dc) const
{
CResOrgSymbolsDoc_BASE::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CResOrgSymbolsDoc operations
CResourceSymbol* CResOrgSymbolsDoc::Add(const CString& sSymbolName,
UINT uSymbolValue,
int nLineNo)
{
CResourceSymbol* pSymbol = m_ResourceSymbolBuffer.Add( sSymbolName,
uSymbolValue,
nLineNo);
if (pSymbol != NULL)
{
if (m_ResourceSymbolBuffer.IsModified())
{
SetModifiedFlag(TRUE);
}
UpdateAllViews(NULL, SYM_ADDED, (CObject*)pSymbol);
// Work out which symbols are affected so we can issue the right view hints
CResourceSymbolList listSymbols;
m_ResourceSymbolBuffer.GetSymbols( uSymbolValue,
listSymbols);
POSITION pos = listSymbols.GetHeadPosition();
while (NULL != pos)
{
CResourceSymbol* pSymbol = listSymbols.GetNext(pos);
if (NULL != pSymbol)
{
UpdateAllViews(NULL, SYM_CHANGED, (CObject*)pSymbol);
}
}
}
return pSymbol;
}
BOOL CResOrgSymbolsDoc::Set(CResourceSymbol* pSymbol,
const CString& sName,
UINT uValue,
BOOL bReadOnly /*= FALSE*/)
{
CResourceSymbolList listSymbols;
m_ResourceSymbolBuffer.GetSymbols( pSymbol->GetValue(),
listSymbols);
// Work out which symbols are affected so we can issue the right view hints
CResourceSymbolList listSymbolsWithNewValue;
m_ResourceSymbolBuffer.GetSymbols( uValue,
listSymbolsWithNewValue);
listSymbols.AddTail(&listSymbolsWithNewValue);
BOOL bResult = m_ResourceSymbolBuffer.Set( pSymbol,
sName,
uValue,
bReadOnly);
if (bResult)
{
if (m_ResourceSymbolBuffer.IsModified())
{
SetModifiedFlag(TRUE);
}
POSITION pos = listSymbols.GetHeadPosition();
while (NULL != pos)
{
CResourceSymbol* pSymbol = listSymbols.GetNext(pos);
if (NULL != pSymbol)
{
UpdateAllViews(NULL, SYM_CHANGED, (CObject*)pSymbol);
}
}
}
return bResult;
}
BOOL CResOrgSymbolsDoc::Remove(CResourceSymbol* pSymbol)
{
if (NULL != pSymbol)
{
UpdateAllViews(NULL, SYM_DELETED, (CObject*)pSymbol);
m_ResourceSymbolBuffer.Remove(pSymbol);
// Work out which symbols are affected so we can issue the right view hints
CResourceSymbolList listSymbols;
m_ResourceSymbolBuffer.GetSymbols( pSymbol->GetValue(),
listSymbols);
POSITION pos = listSymbols.GetHeadPosition();
while (NULL != pos)
{
CResourceSymbol* pSymbol = listSymbols.GetNext(pos);
if (NULL != pSymbol)
{
UpdateAllViews(NULL, SYM_CHANGED, (CObject*)pSymbol);
}
}
delete pSymbol;
SetModifiedFlag();
return TRUE;
}
return FALSE;
}
/////////////////////////////////////////////////////////////////////////////
// CResOrgSymbolsDoc implementation
BOOL CResOrgSymbolsDoc::StartFileChangeMonitor(const CString& sPathName)
{
if (!m_FileChangeMonitor.IsMonitoring())
{
POSITION pos = GetFirstViewPosition();
if (pos != NULL)
{
CView* pView = GetNextView(pos);
return m_FileChangeMonitor.Start( sPathName,
pView,
WM_COMMAND,
ID_FILE_CHANGED,
THREAD_PRIORITY_LOWEST);
}
}
return FALSE;
}
BOOL CResOrgSymbolsDoc::StopFileChangeMonitor(void)
{
if (m_FileChangeMonitor.IsMonitoring())
{
return m_FileChangeMonitor.Stop();
}
return FALSE;
}
/////////////////////////////////////////////////////////////////////////////
// CResOrgSymbolsDoc message handlers
void CResOrgSymbolsDoc::OnCmdFileChanged(void)
{
CString sPathName = GetPathName();
CNGSplitPath split(sPathName);
CString sFileName = split.GetFileName() + split.GetExtension();
CNGMessageBox dlg;
if (IsModified())
{
dlg.FormatMsgEx(MAKEINTRESOURCE(IDP_SYM_FILE_CHANGED_EX),
_T("RTF"),
sFileName);
}
else
{
dlg.FormatMsgEx(MAKEINTRESOURCE(IDP_SYM_FILE_CHANGED),
_T("RTF"),
sFileName);
}
dlg.SetRtf();
dlg.SetStandardIcon(IDI_WARNING);
dlg.AddButton(IDYES, FALSE, FALSE, _T("&Yes") );
dlg.AddButton(IDNO, TRUE, TRUE, _T("&No") );
if (IDYES == dlg.DoModal())
{
OnOpenDocument(sPathName);
UpdateAllViews(NULL, SYM_REFRESH);
}
else
{
StartFileChangeMonitor(sPathName);
}
}
void CResOrgSymbolsDoc::OnFileSave(void)
{
StopFileChangeMonitor();
CResOrgSymbolsDoc_BASE::OnFileSave();
}
void CResOrgSymbolsDoc::OnFileSaveAs(void)
{
StopFileChangeMonitor();
CResOrgSymbolsDoc_BASE::OnFileSaveAs();
}
void CResOrgSymbolsDoc::OnCmdFileProperties(void)
{
CReservedSymbolsDlg dlg;
dlg.m_sResourceFile = m_ResourceSymbolBuffer.m_sResourceFileName;
dlg.m_b3DControls = m_ResourceSymbolBuffer.m_b3dControls;
dlg.m_uNextResourceID = m_ResourceSymbolBuffer.m_uNextResourceValue;
dlg.m_uNextControlID = m_ResourceSymbolBuffer.m_uNextControlValue;
dlg.m_uNextCommandID = m_ResourceSymbolBuffer.m_uNextCommandValue;
dlg.m_uNextSymedID = m_ResourceSymbolBuffer.m_uNextSymedValue;
if (dlg.DoModal() == IDOK)
{
m_ResourceSymbolBuffer.m_b3dControls = dlg.m_b3DControls;
m_ResourceSymbolBuffer.m_uNextResourceValue = dlg.m_uNextResourceID;
m_ResourceSymbolBuffer.m_uNextControlValue = dlg.m_uNextControlID;
m_ResourceSymbolBuffer.m_uNextCommandValue = dlg.m_uNextCommandID;
m_ResourceSymbolBuffer.m_uNextSymedValue = dlg.m_uNextSymedID;
m_ResourceSymbolBuffer.m_sResourceFileName = dlg.m_sResourceFile;
m_ResourceSymbolBuffer.SetModifiedFlag(TRUE);
SetModifiedFlag(TRUE);
}
}
// Renumber all symbols
void CResOrgSymbolsDoc::OnCmdRenumberSymbols(void)
{
// To renumber all the symbols in a given file we need to pick starting
// values for each of the four symbol catgories identified by the _APS_NEXT...
// symbols in each resource file.
//
// The Symbol Renumbering Wizard works this out by looking at the values
// of existing symbols in the resource symbol file.
//
CRenumWizard Wizard;
Wizard.Initialise(&m_ResourceSymbolBuffer);
if (ID_WIZFINISH == Wizard.DoModal() )
{
if (m_ResourceSymbolBuffer.IsModified() )
{
SetModifiedFlag(TRUE);
UpdateAllViews(NULL, SYM_REFRESH);
}
}
}
void CResOrgSymbolsDoc::OnUpdateRenumberSymbols(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_ResourceSymbolBuffer.GetSymbolCount() > 0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -