/************************************************************************
*
* Resource ID Organiser Core Library
*
* (c) Copyright 2000-2005 by Riverblade Limited (UK). All rights reserved.
*
************************************************************************
*
* Description : CResourceSymbolFileBaseValuesPage - "Base Values" page
* for resource symbol file properties
*
* 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". All title and copyrights in and
* to the software, including but not limited to any images, text etc.
* etc. incorporated into it, are the property of Anna-Jayne Metcalfe
* and Riverblade Limited, except where acknowledged otherwise.
*
* Your may freely use this code in your own products, PROVIDED
* this notice is not removed or modified.
*
* Please visit http://www.riverblade.co.uk/products/resorg
* or email support@riverblade.co.uk for latest updates and product support
*
************************************************************************
*
* MODIFICATION HISTORY:
*
* This is a controlled document. See project configuration
* control tool for latest version and full version history.
*
* $Archive: /Projects/AddIns/ResOrg/ResOrgCore/ResourceSymbolFileBaseValuesPage.cpp $
* $Revision: 6 $
* $Date: 31/12/04 16:26 $
* $Author: Anna $
*
* $History: ResourceSymbolFileBaseValuesPage.cpp $
*
* ***************** Version 6 *****************
* User: Anna Date: 31/12/04 Time: 16:26
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* 1. Added IDP_WARN_CONFIG_LOAD_FAILED and IDP_WARN_CONFIG_SAVE_FAILED
* string table prompts for use when loading/saving config files (debug
* builds only)
* 2. Updated file banners
*
* ***************** Version 5 *****************
* User: Anna Date: 29/08/04 Time: 21:58
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* CResourceSymbolFileBaseValuesPage::OnOK() now saves the symbol file
* configuration if the "Auto Save Symbol File Config" option is enabled
*
* ***************** Version 4 *****************
* User: Anna Date: 21/08/04 Time: 19:02
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* CResourceSymbolFileBaseValuesPage::OnOK() now makes an
* UpdateAllViews(SYM_REFRESH) call on the Document if the base values
* have been changed. This ensures that any Symbols Displays are updated
* correctly.
*
* ***************** Version 3 *****************
* User: Anna Date: 1/07/03 Time: 21:02
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* Fixed selection bugs with multi-file symbols displays
*
* ***************** Version 2 *****************
* User: Anna Date: 26/06/03 Time: 20:22
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* 1. Added resizing support
* 2. Changed the look of the page - it's now a lot easier to use, and
* uses text colouring in the same way as
* CResourceSymbolFileNextValuesPage
*
* ***************** Version 1 *****************
* User: Anna Date: 15/04/03 Time: 19:18
* Created in $/Projects/AddIns/ResOrg/ResOrgCore
*
*
* $Nokeywords: $
*
************************************************************************/
#include "StdAfx.h"
#include "ResOrgCore_Priv.h"
#include "ResOrgCore_Globals.h"
#include "ResourceSymbolTypes.h"
#include "ResourceSymbolManager.h"
#include "ResOrgXmlWriter.h"
#include "ResourceSymbolFileBaseValuesPage.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CResourceSymbolFileBaseValuesPage dialog
IMPLEMENT_DYNAMIC(CResourceSymbolFileBaseValuesPage, CResourceSymbolFileBaseValuesPage_BASE)
CResourceSymbolFileBaseValuesPage::CResourceSymbolFileBaseValuesPage(void)
: CResourceSymbolFileBaseValuesPage_BASE(CResourceSymbolFileBaseValuesPage::IDD)
{
m_sBaseResourceCaption = _T("");
m_sBaseControlCaption = _T("");
m_sBaseCommandCaption = _T("");
m_uBaseCommandValue = 0;
m_uBaseControlValue = 0;
m_uBaseResourceValue = 0;
m_sResources = _T("");
m_sControls = _T("");
m_sCommands = _T("");
m_sInfoText = _T("");
}
void CResourceSymbolFileBaseValuesPage::DoDataExchange(CDataExchange* pDX)
{
CResourceSymbolFileBaseValuesPage_BASE::DoDataExchange(pDX);
if (NULL != m_pSymbols)
{
DDX_Text(pDX, IDC_SYM_BASE_RESOURCE_CAPTION, m_sBaseResourceCaption);
DDX_Text(pDX, IDC_SYM_BASE_RESOURCE, m_uBaseResourceValue);
DDV_MinMaxUInt(pDX, m_uBaseResourceValue, SYM_RESOURCE_VALUE_MIN, SYM_RESOURCE_VALUE_MAX);
DDX_Text(pDX, IDC_SYM_RESOURCES, m_sResources);
DDX_Text(pDX, IDC_SYM_BASE_CONTROLS_CAPTION, m_sBaseControlCaption);
DDX_Text(pDX, IDC_SYM_BASE_CONTROLS, m_uBaseControlValue);
DDV_MinMaxUInt(pDX, m_uBaseControlValue, SYM_CONTROL_VALUE_MIN, SYM_CONTROL_VALUE_MAX);
DDX_Text(pDX, IDC_SYM_CONTROLS, m_sControls);
DDX_Text(pDX, IDC_SYM_BASE_COMMANDS_CAPTION, m_sBaseCommandCaption);
DDX_Text(pDX, IDC_SYM_BASE_COMMANDS, m_uBaseCommandValue);
DDV_MinMaxUInt(pDX, m_uBaseCommandValue, SYM_COMMAND_VALUE_MIN, SYM_COMMAND_VALUE_MAX);
DDX_Text(pDX, IDC_SYM_COMMANDS, m_sCommands);
}
DDX_Control(pDX, IDC_SYM_WARNING_ICON, m_ctrlInfoIcon);
DDX_Control(pDX, IDC_SYM_WARNING, m_ctrlInfo);
DDX_Text(pDX, IDC_SYM_WARNING, m_sInfoText);
}
BEGIN_MESSAGE_MAP(CResourceSymbolFileBaseValuesPage, CResourceSymbolFileBaseValuesPage_BASE)
ON_WM_CTLCOLOR()
ON_BN_CLICKED( IDC_SYM_CALC_BASE_VALUES, OnClickedRecalculateAllValues)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CResourceSymbolFileBaseValuesPage virtual overrides
BOOL CResourceSymbolFileBaseValuesPage::OnInitDialog(void)
{
BOOL bResult = CResourceSymbolFileBaseValuesPage_BASE::OnInitDialog();
m_Resizer.Add(IDC_SYM_BASE_VALUES_GROUP, 0, 0, 100, 100);
m_Resizer.Add(IDC_SYM_BASE_RESOURCE_CAPTION, 0, 20, 0, 0);
m_Resizer.Add(IDC_SYM_BASE_RESOURCE, 20, 20, 0, 0);
m_Resizer.Add(IDC_SYM_RESOURCES, 40, 20, 0, 0);
m_Resizer.Add(IDC_SYM_BASE_CONTROLS_CAPTION, 0, 40, 0, 0);
m_Resizer.Add(IDC_SYM_BASE_CONTROLS, 20, 40, 0, 0);
m_Resizer.Add(IDC_SYM_CONTROLS, 40, 40, 0, 0);
m_Resizer.Add(IDC_SYM_BASE_COMMANDS_CAPTION, 0, 60, 0, 0);
m_Resizer.Add(IDC_SYM_BASE_COMMANDS, 20, 60, 0, 0);
m_Resizer.Add(IDC_SYM_COMMANDS, 40, 60, 0, 0);
m_Resizer.Add(IDC_SYM_CALC_BASE_VALUES, 20, 80, 0, 0);
m_Resizer.Add(IDC_SYM_WARNING_ICON, 0, 90, 0, 0);
m_Resizer.Add(IDC_SYM_WARNING, 0, 90, 100, 10);
m_sBaseResourceCaption.Format( IDC_SYM_BASE_RESOURCE_CAPTION, SYM_RESOURCE_VALUE_MIN, SYM_RESOURCE_VALUE_MAX);
m_sBaseControlCaption.Format( IDC_SYM_BASE_CONTROL_CAPTION, SYM_CONTROL_VALUE_MIN, SYM_CONTROL_VALUE_MAX);
m_sBaseCommandCaption.Format( IDC_SYM_BASE_COMMAND_CAPTION, SYM_COMMAND_VALUE_MIN, SYM_COMMAND_VALUE_MAX);
CString sMsg;
sMsg.Format(IDS_SYM_BASE_VALUES_INFO,
SYM_RESOURCE_VALUE_MIN, SYM_RESOURCE_VALUE_MAX,
SYM_CONTROL_VALUE_MIN, SYM_CONTROL_VALUE_MAX,
SYM_COMMAND_VALUE_MIN, SYM_COMMAND_VALUE_MAX);
SetInfoMessage(IDI_INFORMATION, sMsg);
return bResult;
}
BOOL CResourceSymbolFileBaseValuesPage::OnSetActive(void)
{
SetAvailableControls();
return CResourceSymbolFileBaseValuesPage_BASE::OnSetActive();
}
void CResourceSymbolFileBaseValuesPage::OnOK(void)
{
ASSERT(NULL != m_pSymbols);
if (NULL != m_pSymbols)
{
bool bChanged = m_pSymbols->SetBaseResourceValue(m_uBaseResourceValue);
bChanged |= m_pSymbols->SetBaseControlValue(m_uBaseControlValue);
bChanged |= m_pSymbols->SetBaseCommandValue(m_uBaseCommandValue);
// If one or more values was changed, the symbols in the manager will need to
// be checked for range again
if (bChanged)
{
m_pSymbols->CountConflicts();
if (NULL != m_pDoc)
{
m_pDoc->UpdateAllViews(NULL, SYM_REFRESH);
}
// If the associated option is set, try to save the symbol file configuration
if (Options.AutoSaveSymbolFileConfig() )
{
CString sConfigFilePathName = CResOrgXmlWriter::GetConfigFilePathName( m_pSymbols->GetPathName() );
// Determine whether the file exists and is read-only.
// If so, ask if the read only file should be overwritten.
DWORD dwAttrib = ::GetFileAttributes(sConfigFilePathName);
if (::FileExists(sConfigFilePathName) && (dwAttrib & FILE_ATTRIBUTE_READONLY) )
{
switch ( ::DoOverwritePrompt(sConfigFilePathName, false) )
{
case IDYES:
if (!::SetFileAttributes(sConfigFilePathName, dwAttrib & ~FILE_ATTRIBUTE_READONLY) )
{
::AfxMessageBox(IDP_SYM_FILE_ERR_FILE_ATTRIBUTES, MB_OK | MB_ICONSTOP);
return;
}
break;
case IDNO:
case IDCANCEL:
return;
default:
ASSERT(false);
break;
}
}
CString sErrorMsg;
if (!CResOrgXmlWriter::SaveSymbolFileConfig(m_pSymbols,
sConfigFilePathName,
&sErrorMsg) )
{
#ifdef _DEBUG
CNGSplitPath split(sConfigFilePathName);
CString sMsg;
sMsg.Format(IDP_WARN_CONFIG_SAVE_FAILED,
split.GetFileName() + split.GetExtension(),
sErrorMsg);
::AfxMessageBox( sMsg, MB_OK | MB_ICONEXCLAMATION);
#endif
}
}
}
}
}
/////////////////////////////////////////////////////////////////////////////
// CResourceSymbolFileBaseValuesPage implementation
void CResourceSymbolFileBaseValuesPage::SetInfoMessage(LPCTSTR pszIconID, const CString& sText)
{
HICON hIcon = ::AfxGetApp()->LoadStandardIcon(pszIconID);
m_ctrlInfoIcon.SetIcon(hIcon);
m_sInfoText = sText;
Invalidate();
UpdateData(FALSE);
}
void CResourceSymbolFileBaseValuesPage::SetAvailableControls(void)
{
BOOL bAvail = (NULL != m_pSymbols);
ShowDlgControl(IDC_SYM_BASE_RESOURCE_CAPTION, bAvail);
ShowDlgControl(IDC_SYM_BASE_RESOURCE, bAvail);
ShowDlgControl(IDC_SYM_RESOURCES, bAvail);
ShowDlgControl(IDC_SYM_BASE_CONTROLS_CAPTION, bAvail);
ShowDlgControl(IDC_SYM_BASE_CONTROLS, bAvail);
ShowDlgControl(IDC_SYM_CONTROLS, bAvail);
ShowDlgControl(IDC_SYM_BASE_COMMANDS_CAPTION, bAvail);
ShowDlgControl(IDC_SYM_BASE_COMMANDS, bAvail);
ShowDlgControl(IDC_SYM_COMMANDS, bAvail);
ShowDlgControl(IDC_SYM_CALC_BASE_VALUES, bAvail);
ShowDlgControl(IDC_SYM_WARNING_ICON, bAvail);
ShowDlgControl(IDC_SYM_WARNING, bAvail);
}
/////////////////////////////////////////////////////////////////////////////
// CResourceSymbolFileBaseValuesPage operations
bool CResourceSymbolFileBaseValuesPage::SetSymbolManager(CResourceSymbolManager* pSymbols)
{
BOOL bResult = CResourceSymbolFileBaseValuesPage_BASE::SetSymbolManager(pSymbols);
if (NULL != m_pSymbols)
{
m_uBaseResourceValue = m_pSymbols->GetBaseResourceValue();
m_uBaseControlValue = m_pSymbols->GetBaseControlValue();
m_uBaseCommandValue = m_pSymbols->GetBaseCommandValue();
CResourceSymbolCounts Info;
m_pSymbols->GetSymbolCount(Info);
// Update summary text
m_sResources.Format(IDS_SYM_RESOURCES, Info.m_nResources);
m_sControls.Format(IDS_SYM_CONTROLS, Info.m_nControls);
m_sCommands.Format(IDS_SYM_COMMANDS, Info.m_nCommands);
if (::IsWindow(GetSafeHwnd() ) )
{
UpdateData(FALSE);
}
}
else
{
m_uBaseResourceValue = 0;
m_uBaseControlValue = 0;
m_uBaseCommandValue = 0;
}
if (::IsWindow(GetSafeHwnd() ) )
{
UpdateData(FALSE);
}
return bResult;
}
/////////////////////////////////////////////////////////////////////////////
// CResourceSymbolFileBaseValuesPage message handlers
#define RGB_BLUE RGB(0, 0, 255)
HBRUSH CResourceSymbolFileBaseValuesPage::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CResourceSymbolFileBaseValuesPage_BASE::OnCtlColor(pDC, pWnd, nCtlColor);
if (NULL != m_pSymbols)
{
switch (pWnd->GetDlgCtrlID() )
{
case IDC_SYM_BASE_RESOURCE:
if (m_uBaseResourceValue != m_pSymbols->GetBaseResourceValue() )
{
pDC->SetTextColor(RGB_BLUE);
}
break;
case IDC_SYM_BASE_CONTROLS:
if (m_uBaseControlValue != m_pSymbols->GetBaseControlValue() )
{
pDC->SetTextColor(RGB_BLUE);
}
break;
case IDC_SYM_BASE_COMMANDS:
if (m_uBaseCommandValue != m_pSymbols->GetBaseCommandValue() )
{
pDC->SetTextColor(RGB_BLUE);
}
break;
default:
break;
}
}
return hbr;
}
void CResourceSymbolFileBaseValuesPage::OnClickedRecalculateAllValues(void)
{
ASSERT(NULL != m_pSymbols);
if (NULL != m_pSymbols)
{
CResourceSymbolCounts Info;
m_pSymbols->GetSymbolCount(Info);
// Update summary text
m_sResources.Format(IDS_SYM_RESOURCES, Info.m_nResources);
m_sControls.Format(IDS_SYM_CONTROLS, Info.m_nControls);
m_sCommands.Format(IDS_SYM_COMMANDS, Info.m_nCommands);
m_pSymbols->CalculateBaseValues(m_uBaseResourceValue,
m_uBaseCommandValue,
m_uBaseControlValue);
UpdateData(FALSE);
}
}