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

📄 resorgsymbolsdoc.cpp

📁 一个vc中管理资源文件ID的插件
💻 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 + -