📄 resorgnetaddintoolwinformview.cpp
字号:
/************************************************************************
*
* Resource ID Organiser Add-In for Visual C++.NET
*
* (c) Copyright 2000-2004 by Anna-Jayne Metcalfe (resorg@annasplace.me.uk)
* All rights reserved.
*
************************************************************************
*
* Filename : ResOrgNETAddInToolWinFormView.cpp
*
* Description : CResOrgNETAddInToolWinFormView - ResOrg.NET Tool Window
* form view class
*
* Compiler : Microsoft Visual C++ .NET 2003
*
* Target
* Environment : Windows 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/ResOrgNETAddInToolWindows/ResOrgNETAddInToolWinFormView.cpp $
* $Revision: 16 $
* $Date: 30/08/04 0:44 $
* $Author: Anna $
*
* $History: ResOrgNETAddInToolWinFormView.cpp $
*
* ***************** Version 16 *****************
* User: Anna Date: 30/08/04 Time: 0:44
* Updated in $/Projects/AddIns/ResOrg/ResOrgNETAddInToolWindows
* 1. CResOrgNETAddInToolWinFormView::Save() now checks that the file
* exists before attempting to check whether it is read only
* 2. Moved CResOrgNETAddInToolWinFormView::DoOverwritePrompt() to
* ResOrgCore_Globals.cpp/h
*
* ***************** Version 15 *****************
* User: Anna Date: 24/08/04 Time: 0:14
* Updated in $/Projects/AddIns/ResOrg/ResOrgNETAddInToolWindows
* Added support for out of range symbols
*
* ***************** Version 14 *****************
* User: Anna Date: 1/07/03 Time: 23:30
* Updated in $/Projects/AddIns/ResOrg/ResOrgNETAddInToolWindows
* Be a little more careful about dealing with relative pathnames. Also
* guarded some methods against empty workspace/symbol file pathnames just
* in case
*
* ***************** Version 13 *****************
* User: Anna Date: 7/03/03 Time: 15:37
* Updated in $/Projects/AddIns/ResOrg/ResOrgNETAddInToolWindows
* Modified CResOrgNETAddInToolWinFormView::UpdateSymbolPropertiesCtrls()
* to work better with CNGHtmlStaticCtrl
*
* ***************** Version 12 *****************
* User: Anna Date: 15/02/03 Time: 21:05
* Updated in $/Projects/AddIns/ResOrg/ResOrgNETAddInToolWindows
* Knock on change from CResourceSymbolFilePropertySheet
*
* ***************** Version 11 *****************
* User: Anna Date: 2/01/03 Time: 0:31
* Updated in $/Projects/AddIns/ResOrg/ResOrgNETAddInToolWindows
* Replaced CQhtmWnd controls with CNGHtmlStaticCtrl (QHTM is
* overspecified for what I need here)
*
* ***************** Version 10 *****************
* User: Anna Date: 25/11/02 Time: 16:50
* Updated in $/Projects/AddIns/ResOrg/ResOrgNETAddInToolWindows
* Changed website address in banner
*
* ***************** Version 9 *****************
* User: Anna Date: 22/10/02 Time: 14:45
* Updated in $/Projects/AddIns/ResOrg/ResOrgNETAddInToolWindows
* Changed name/email address (at last!)
*
* ***************** Version 8 *****************
* User: Andy Date: 10/08/02 Time: 0:17
* Updated in $/Projects/AddIns/ResOrg/ResOrgNETAddInToolWindows
* Added a warning if the Next Symbol values are in use
*
* ***************** Version 7 *****************
* User: Andy Date: 9/08/02 Time: 17:01
* Updated in $/Projects/AddIns/ResOrg/ResOrgNETAddInToolWindows
* Added expiry date checks in the handlers for the "Properties", "Edit"
* and "Renumber" buttons)
*
* ***************** Version 6 *****************
* User: Andy Date: 8/08/02 Time: 20:42
* Updated in $/Projects/AddIns/ResOrg/ResOrgNETAddInToolWindows
* 1. Added CResOrgNETAddInToolWinFormView::PreTranslateMessage() in a
* vain attempt to get the tooltips on the buttons working (this is
* driving me nuts, but it's probably something really dumb)
* 2. If no projects are loaded the expiry date warning is now shown (if
* a dev build) and the combobox is disabled
*
* ***************** Version 5 *****************
* User: Andy Date: 6/08/02 Time: 12:32
* Updated in $/Projects/AddIns/ResOrg/ResOrgNETAddInToolWindows
* The warning message is now also used to display expiry date information
*
* ***************** Version 4 *****************
* User: Andy Date: 6/08/02 Time: 10:35
* Updated in $/Projects/AddIns/ResOrg/ResOrgNETAddInToolWindows
* Corrected a syntax error (forgot to compile before checking in!
*
* ***************** Version 3 *****************
* User: Andy Date: 5/08/02 Time: 13:48
* Updated in $/Projects/AddIns/ResOrg/ResOrgNETAddInToolWindows
* 1.Converted literal strings to string table entries
*
* ***************** Version 2 *****************
* User: Andy Date: 2/08/02 Time: 17:04
* Updated in $/Projects/AddIns/ResOrg/ResOrgNETAddInToolWindows
* 1. Added file banners
* 2. Tidied up the code a little - removing unused capabilities
*
* $Nokeywords: $
*
************************************************************************/
#include "StdAfx.h"
#include "ResOrgNETAddInToolWindows.h"
#include "ResOrgNETAddInToolWinFormView.h"
/////////////////////////////////////////////////////////////////////////////
// CResOrgNETAddInToolWinFormView
IMPLEMENT_DYNCREATE(CResOrgNETAddInToolWinFormView, CResOrgNETAddInToolWinFormView_BASE)
CResOrgNETAddInToolWinFormView::CResOrgNETAddInToolWinFormView(void)
: CResOrgNETAddInToolWinFormView_BASE(CResOrgNETAddInToolWinFormView::IDD)
{
m_hWndResOrg = NULL;
m_pSymbols = NULL;
m_sResourceSymbolFile = _T("");
m_sResourceRange = _T("");
m_sCommandRange = _T("");
m_nOutOfRangeSymbols = 0;
m_sOutOfRangeSymbols = _T("");
m_nConflicts = 0;
m_sConflicts = _T("");
m_sOutOfRangeSymbolsCaption.LoadString(IDC_TOOLWIN_SYM_OUT_OF_RANGE_CAPTION);
m_sConflictsCaption.LoadString(IDC_TOOLWIN_SYM_CONFLICTS_CAPTION);
m_pSymbols = new CResourceSymbolManager;
ASSERT(NULL != m_pSymbols);
}
CResOrgNETAddInToolWinFormView::~CResOrgNETAddInToolWinFormView(void)
{
if (NULL != m_pSymbols)
{
delete m_pSymbols;
}
}
/////////////////////////////////////////////////////////////////////////////
// CResOrgNETAddInToolWinFormView virtual overrides
void CResOrgNETAddInToolWinFormView::DoDataExchange(CDataExchange* pDX)
{
CResOrgNETAddInToolWinFormView_BASE::DoDataExchange(pDX);
DDX_Control(pDX, IDC_TOOLWIN_SYM_FILE, m_ctrlProjects);
DDX_Control(pDX, IDC_TOOLWIN_PROPERTIES, m_ctrlProperties);
DDX_Control(pDX, IDC_TOOLWIN_EDIT, m_ctrlEdit);
DDX_Control(pDX, IDC_TOOLWIN_RENUMBER, m_ctrlRenumber);
DDX_Control(pDX, IDC_TOOLWIN_SYM_LOW_RANGE_CAPTION, m_ctrlResourceRangeCaption);
DDX_Control(pDX, IDC_TOOLWIN_SYM_HIGH_RANGE_CAPTION, m_ctrlCommandRangeCaption);
DDX_Control(pDX, IDC_TOOLWIN_SYM_LOW_RANGE, m_ctrlResourceRange);
DDX_Control(pDX, IDC_TOOLWIN_SYM_HIGH_RANGE, m_ctrlCommandRange);
DDX_Control(pDX, IDC_TOOLWIN_SYM_OUT_OF_RANGE_CAPTION, m_ctrlOutOfRangeSymbolsCaption);
DDX_Control(pDX, IDC_TOOLWIN_SYM_OUT_OF_RANGE, m_ctrlOutOfRangeSymbols);
DDX_Control(pDX, IDC_TOOLWIN_SYM_CONFLICTS_CAPTION, m_ctrlConflictsCaption);
DDX_Control(pDX, IDC_TOOLWIN_SYM_CONFLICTS, m_ctrlConflicts);
DDX_Control(pDX, IDC_TOOLWIN_WARNING_ICON, m_ctrlWarningIcon);
DDX_Control(pDX, IDC_TOOLWIN_WARNING_MSG, m_ctrlWarningText);
DDX_CBStringExact(pDX, IDC_TOOLWIN_SYM_FILE, m_sResourceSymbolFile);
DDX_Text(pDX, IDC_TOOLWIN_SYM_LOW_RANGE, m_sResourceRange);
DDX_Text(pDX, IDC_TOOLWIN_SYM_HIGH_RANGE, m_sCommandRange);
DDX_Text(pDX, IDC_TOOLWIN_SYM_OUT_OF_RANGE_CAPTION, m_sOutOfRangeSymbolsCaption);
DDX_Text(pDX, IDC_TOOLWIN_SYM_OUT_OF_RANGE, m_sOutOfRangeSymbols);
DDX_Text(pDX, IDC_TOOLWIN_SYM_CONFLICTS_CAPTION, m_sConflictsCaption);
DDX_Text(pDX, IDC_TOOLWIN_SYM_CONFLICTS, m_sConflicts);
DDX_Text(pDX, IDC_TOOLWIN_WARNING_MSG, m_sWarningText);
}
#define WM_USER_RESID_FILE_CHANGED WM_USER + 69
BEGIN_MESSAGE_MAP(CResOrgNETAddInToolWinFormView, CResOrgNETAddInToolWinFormView_BASE)
ON_WM_CTLCOLOR()
ON_CBN_SELCHANGE( IDC_TOOLWIN_SYM_FILE, OnCbnSelchangeResourceSymbolFile)
ON_BN_CLICKED( IDC_TOOLWIN_REFRESH, OnBnClickedToolwinRefresh)
ON_BN_CLICKED( IDC_TOOLWIN_PROPERTIES, OnBnClickedToolwinProperties)
ON_BN_CLICKED( IDC_TOOLWIN_EDIT, OnBnClickedToolwinEdit)
ON_BN_CLICKED( IDC_TOOLWIN_RENUMBER, OnBnClickedToolwinRenumber)
ON_MESSAGE( WM_USER_RESID_FILE_CHANGED, OnMsgResourceSymbolFileChanged)
END_MESSAGE_MAP()
BOOL CResOrgNETAddInToolWinFormView::Create(LPCTSTR lpszClassName,
LPCTSTR lpszWindowName,
DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd,
UINT nID,
CCreateContext* pContext/* = NULL*/)
{
int nResult = CResOrgNETAddInToolWinFormView_BASE::Create( lpszClassName,
lpszWindowName,
dwStyle,
rect,
pParentWnd,
nID,
pContext);
if (nResult > 0)
{
UpdateData(FALSE);
m_Resizer.Create(this);
m_Resizer.Add(IDC_TOOLWIN_SYM_FILE, 0, 0, 50, 0);
m_Resizer.Add(IDC_TOOLWIN_PROPERTIES, 50, 0, 0, 0);
m_Resizer.Add(IDC_TOOLWIN_EDIT, 50, 0, 0, 0);
m_Resizer.Add(IDC_TOOLWIN_RENUMBER, 50, 0, 0, 0);
m_Resizer.Add(IDC_TOOLWIN_DIVIDER, 0, 0, 100, 0);
m_Resizer.Add(IDC_TOOLWIN_WARNING_MSG, 0, 0, 50, 0);
m_ctrlProperties.SetIcon(IDI_TOOLWIN_PROPERTIES);
m_ctrlProperties.SetTooltipText(IDS_TOOLWIN_PROPERTIES, TRUE);
m_ctrlEdit.SetIcon(IDI_TOOLWIN_EDIT);
m_ctrlEdit.SetTooltipText(IDS_TOOLWIN_EDIT, TRUE);
m_ctrlRenumber.SetIcon(IDI_TOOLWIN_RENUMBER);
m_ctrlRenumber.SetTooltipText(IDS_TOOLWIN_RENUMBER, TRUE);
ASSERT( ::IsWindow(m_ctrlWarningIcon.m_hWnd) );
m_ctrlResourceRangeCaption.SetWindowText( _T("Resource / Control IDs:") );
m_ctrlCommandRangeCaption.SetWindowText( _T("Command IDs:") );
m_ctrlResourceRange.SetWindowText( _T("") );
m_ctrlCommandRange.SetWindowText( _T("") );
m_ctrlOutOfRangeSymbols.SetWindowText( _T("") );
m_ctrlConflicts.SetWindowText( _T("") );
#ifdef _DEBUG
// The Refresh button really shouldn't be needed - it's really just
// there for testing
CWnd* pWnd = GetDlgItem(IDC_TOOLWIN_REFRESH);
if (NULL != pWnd) pWnd->ShowWindow(TRUE);
#endif
}
return nResult;
}
BOOL CResOrgNETAddInToolWinFormView::PreTranslateMessage(MSG* pMsg)
{
/* AJM 8.8.2002 this doesn't work..WM_MOUSEMOVE (the one we really want)
never gets here
CToolTipCtrl* pToolTip = NULL;
switch (pMsg->message)
{
case WM_MOUSEMOVE:
case WM_LBUTTONDOWN:
case WM_LBUTTONUP:
case WM_MBUTTONDOWN:
case WM_MBUTTONUP:
case WM_RBUTTONDOWN:
case WM_RBUTTONUP:
pToolTip = m_ctrlProperties.GetToolTips();
if (NULL != pToolTip)
{
pToolTip->Activate(TRUE);
pToolTip->RelayEvent(pMsg);
}
break;
default:
break;
}
*/
return CFormView::PreTranslateMessage(pMsg);
}
// This override is necessary since this view is created on the stack rather
// than the heap...and CView::PostNcDestroy() does a "delete this"!
//
// It's also a convenient place to unconfigure the automation helper
// before it's destroyed (it will ASSERT otherwise, since not
// clearing it down in normal use would be very, very bad)
void CResOrgNETAddInToolWinFormView::PostNcDestroy(void)
{
m_AutomationHelper.SetDTE(NULL);
}
/////////////////////////////////////////////////////////////////////////////
// CResOrgNETAddInToolWinFormView operations
bool CResOrgNETAddInToolWinFormView::Initialise(CComPtr<EnvDTE::_DTE> pDTE, HWND hWndResOrg)
{
m_AutomationHelper.SetDTE(pDTE);
m_hWndResOrg = hWndResOrg;
return true;
}
void CResOrgNETAddInToolWinFormView::Refresh(void)
{
if (m_FileChangeMonitor.IsMonitoring() )
{
m_FileChangeMonitor.Stop();
}
if (UpdateSymbolFilesCtrl() && !m_sWorkspacePathName.IsEmpty() && !m_sResourceSymbolFile.IsEmpty() )
{
CNGSplitPath split(m_sWorkspacePathName);
CString sWorkspaceFolder = split.GetDrive() + split.GetDirectory();
CString sPathName = ::CombinePath(sWorkspaceFolder, m_sResourceSymbolFile);
// If the file has changed, parse it and update statistics
if ( ConfigureSymbolManager(m_pSymbols, sPathName) )
{
UpdateSymbolPropertiesCtrls();
m_FileChangeMonitor.Start( sPathName,
this,
WM_USER_RESID_FILE_CHANGED);
}
}
SetAvailableControls();
}
/////////////////////////////////////////////////////////////////////////////
// CResOrgNETAddInToolWinFormView implementation
bool CResOrgNETAddInToolWinFormView::UpdateSymbolFilesCtrl(void)
{
m_sWorkspacePathName = m_AutomationHelper.GetSolutionPathName();
CStringArray arrayProjects;
m_AutomationHelper.GetProjectNames(arrayProjects);
CStringArray arraySymbolFilePathNames;
for (int n = 0; n < arrayProjects.GetSize(); n++)
{
CString sProject = arrayProjects[n];
if (!sProject.IsEmpty() )
{
CString sResourceFile = m_AutomationHelper.GetResourceFileName(sProject);
if (!sResourceFile.IsEmpty() )
{
CString sSymbolFile = ::GetSymbolFileName(sResourceFile);
if (!sSymbolFile.IsEmpty())
{
arraySymbolFilePathNames.Add(sSymbolFile);
}
}
}
}
CStringArray arraySymbolFiles;
for (int n = 0; n < arraySymbolFilePathNames.GetSize(); n++)
{
CString sSymbolFile = arraySymbolFilePathNames[n];
if (!sSymbolFile.IsEmpty() )
{
CString sRelativeFileName;
LPTSTR pszRelativeFileName = sRelativeFileName.GetBuffer(_MAX_PATH);
::PathRelativePathTo( pszRelativeFileName,
m_sWorkspacePathName,
FILE_ATTRIBUTE_NORMAL,
sSymbolFile,
FILE_ATTRIBUTE_NORMAL);
sRelativeFileName.ReleaseBuffer();
if (!sRelativeFileName.IsEmpty() )
{
arraySymbolFiles.Add(sRelativeFileName);
}
}
}
::FillComboBox(&m_ctrlProjects, arraySymbolFiles, m_sResourceSymbolFile);
// Only enable the combobox if there's something in it
m_ctrlProjects.EnableWindow(arraySymbolFiles.GetSize() > 0);
if (CB_ERR == m_ctrlProjects.FindStringExact(0, m_sResourceSymbolFile) )
{
m_ctrlProjects.SetCurSel(0);
UpdateData(TRUE); // Update m_sResourceSymbolFile
// Force the dependent controls to update
OnCbnSelchangeResourceSymbolFile();
return true; // A true return indicates that the selection has changed
}
return false; // The selection is unchanged
}
bool CResOrgNETAddInToolWinFormView::ConfigureSymbolManager(CResourceSymbolManager* pSymbols,
const CString& sPathName) const
{
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);
pSymbols->Serialize(ar);
try
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -