/************************************************************************
*
* Resource ID Organiser Core Library
*
* (c) Copyright 2000-2003 by Anna-Jayne Metcalfe (resorg@annasplace.me.uk)
* All rights reserved.
*
************************************************************************
*
* Filename : RenumWizNewSymbolValuesPage.cpp
*
* Description : RenumWizNewSymbolValuesPage - Symbol Renumbering Wizard
* "New Symbol Values" page class
*
* Compiler : Microsoft Visual C++ 6.0, Service Pack 3 or later
* Microsoft Visual C++ .NET 2002
*
* 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/RenumWizNewSymbolValuesPage.cpp $
* $Revision: 10 $
* $Date: 11/07/04 16:20 $
* $Author: Anna $
*
* $History: RenumWizNewSymbolValuesPage.cpp $
*
* ***************** Version 10 *****************
* User: Anna Date: 11/07/04 Time: 16:20
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* Knock-on changes from CSymbolPropertiesGeneralPage
*
* ***************** Version 9 *****************
* User: Anna Date: 15/04/03 Time: 20:38
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* 1. Removed unnecessary file guards (#pragma once works well enough)
* 2. Updated file banners
*
* ***************** Version 8 *****************
* User: Anna Date: 15/02/03 Time: 20:43
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* Changed big BOOLs into little bools
*
* ***************** Version 7 *****************
* User: Anna Date: 25/11/02 Time: 15:10
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* Changed website address in banner
*
* ***************** Version 6 *****************
* User: Anna Date: 22/10/02 Time: 13:24
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* Changed name/mail address (at last!)
*
* ***************** Version 5 *****************
* 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 4 *****************
* User: Andy Date: 27/05/02 Time: 16:43
* Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
* Knock on changes from CResourceSymbolBuffer (now
* CResourceSymbolManager)
*
* ***************** Version 3 *****************
* User: Andy Date: 12/28/01 Time: 4:33p
* Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
* Added an option to hide unmodified symbols
*
* ***************** Version 2 *****************
* User: Andy Date: 12/28/01 Time: 1:12p
* Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
* Added a context menu
*
* ***************** Version 1 *****************
* User: Andy Date: 12/28/01 Time: 1:13a
* Created in $/Projects/AddIns/ResOrg/ResOrgUtils
*
* ***************** Version 3 *****************
* User: Andy Date: 4/05/01 Time: 22:37
* Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
* Implemented resizing
*
* ***************** Version 2 *****************
* User: Andy Date: 23/04/01 Time: 21:18
* Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
* Implemented the "Auto" symbol selection options
*
* ***************** Version 1 *****************
* User: Andy Date: 21/04/01 Time: 7:13
* Created in $/Projects/AddIns/ResOrg/ResOrgUtils
*
* $Nokeywords: $
*
************************************************************************/
#include "StdAfx.h"
#include "ResOrgCore_Priv.h"
#include "SymbolPropertySheet.h"
#include "RenumWizNewSymbolValuesPage.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CRenumWizNewSymbolValuesPage wizard page
IMPLEMENT_DYNCREATE(CRenumWizNewSymbolValuesPage, CRenumWizNewSymbolValuesPage_BASE)
CRenumWizNewSymbolValuesPage::CRenumWizNewSymbolValuesPage(void)
: CRenumWizNewSymbolValuesPage_BASE( CRenumWizNewSymbolValuesPage::IDD,
IDS_RENUMWIZ,
IDS_RENUMWIZ_NEW_VALUES_PAGE_TITLE,
IDS_RENUMWIZ_NEW_VALUES_PAGE_SUBTITLE)
{
//{{AFX_DATA_INIT(CRenumWizNewSymbolValuesPage)
m_bHideUnmodifiedSymbols = TRUE;
//}}AFX_DATA_INIT
}
CRenumWizNewSymbolValuesPage::~CRenumWizNewSymbolValuesPage(void)
{
}
void CRenumWizNewSymbolValuesPage::DoDataExchange(CDataExchange* pDX)
{
CRenumWizNewSymbolValuesPage_BASE::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CRenumWizNewSymbolValuesPage)
DDX_Control(pDX, IDC_RENUMWIZ_SYMBOLS, m_ctrlSymbols);
DDX_Check(pDX, IDC_RENUMWIZ_HIDE_UNMODIFIED, m_bHideUnmodifiedSymbols);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CRenumWizNewSymbolValuesPage, CRenumWizNewSymbolValuesPage_BASE)
//{{AFX_MSG_MAP(CRenumWizNewSymbolValuesPage)
ON_WM_CONTEXTMENU()
ON_COMMAND( ID_SYM_AUTOSIZE_COLS, OnCmdAutosizeColumns)
ON_BN_CLICKED( IDC_RENUMWIZ_HIDE_UNMODIFIED, OnClickedHideUnmodifiedSymbols)
ON_BN_CLICKED( IDC_RENUMWIZ_EDIT_VALUE, OnClickedEditValue)
ON_BN_CLICKED( IDC_RENUMWIZ_RESTORE_VALUE, OnClickedRestoreOriginalValue)
ON_BN_CLICKED( IDC_RENUMWIZ_RENUMBER, OnClickedRenumber)
ON_NOTIFY( LVN_ITEMCHANGED, IDC_RENUMWIZ_SYMBOLS, OnItemchangedSymbols)
ON_NOTIFY( NM_DBLCLK, IDC_RENUMWIZ_SYMBOLS, OnDblClickSymbols)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CRenumWizNewSymbolValuesPage overrides
BOOL CRenumWizNewSymbolValuesPage::OnInitDialog(void)
{
CRenumWizNewSymbolValuesPage_BASE::OnInitDialog();
if (IsResizeable())
{
m_Resizer.Add( IDC_RENUMWIZ_SYMBOLS, 0, 0, 100, 100);
m_Resizer.Add( IDC_RENUMWIZ_HIDE_UNMODIFIED, 0, 100, 0, 0);
m_Resizer.Add( IDC_RENUMWIZ_EDIT_VALUE, 50, 100, 0, 0);
m_Resizer.Add( IDC_RENUMWIZ_RESTORE_VALUE, 50, 100, 0, 0);
m_Resizer.Add( IDC_RENUMWIZ_RENUMBER, 50, 100, 0, 0);
}
CWaitCursor wait;
m_ctrlSymbols.Initialise();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
BOOL CRenumWizNewSymbolValuesPage::OnSetActive(void)
{
BOOL bResult = CRenumWizNewSymbolValuesPage_BASE::OnSetActive();
if (!IsInitialising())
{
if (bResult)
{
CWaitCursor wait;
FillListCtrl();
SetAvailableControls();
}
}
m_ctrlSymbols.AutoSizeColumn();
return bResult;
}
LRESULT CRenumWizNewSymbolValuesPage::OnWizardBack(void)
{
return IDD_RENUMWIZ_BASE_VALUES_PAGE;
}
LRESULT CRenumWizNewSymbolValuesPage::OnWizardNext(void)
{
return IDD_RENUMWIZ_COMPLETION_PAGE;
}
/////////////////////////////////////////////////////////////////////////////
// CRenumWizNewSymbolValuesPage implementation
/******************************************************************************
* Fill the list controls
*
******************************************************************************/
void CRenumWizNewSymbolValuesPage::FillListCtrl(void)
{
if (!m_bHideUnmodifiedSymbols)
{
m_ctrlSymbols.AddSymbols(&m_pEngine->m_LocalSymbolManager);
}
else
{
CResourceSymbolList listAllSymbols, listFilteredSymbols;
m_pEngine->m_LocalSymbolManager.GetSymbols(listAllSymbols);
POSITION pos = listAllSymbols.GetHeadPosition();
while (NULL != pos)
{
CResourceSymbol* pSymbol = listAllSymbols.GetNext(pos);
if ( (NULL != pSymbol) && pSymbol->IsModified() )
{
listFilteredSymbols.AddTail(pSymbol);
}
}
m_ctrlSymbols.SetSymbolManager(&m_pEngine->m_LocalSymbolManager);
m_ctrlSymbols.AddSymbols(listFilteredSymbols);
}
}
void CRenumWizNewSymbolValuesPage::SetAvailableControls(void)
{
EnableDlgControl(IDC_RENUMWIZ_EDIT_VALUE, m_ctrlSymbols.GetSelectedCount() == 1);
BOOL bEnable = FALSE;
CResourceSymbolList listSelectedSymbols, listSymbolsToUpdate;
m_ctrlSymbols.GetSelection(listSelectedSymbols);
POSITION pos = listSelectedSymbols.GetHeadPosition();
while (NULL != pos)
{
CResourceSymbol* pSymbol = listSelectedSymbols.GetNext(pos);
if (NULL != pSymbol)
{
if ( (pSymbol->IsModified() ) && (pSymbol->GetOriginalValue() > 0) )
{
bEnable = TRUE;
break;
}
}
}
EnableDlgControl(IDC_RENUMWIZ_RESTORE_VALUE, bEnable);
}
// Work out which symbols we need to update in the list control
void CRenumWizNewSymbolValuesPage::UpdateSymbols(UINT uValue)
{
if (uValue > 0)
{
CResourceSymbolList listSymbols;
m_pEngine->m_LocalSymbolManager.GetSymbols(uValue, listSymbols);
// Update all affected symbols
POSITION pos = listSymbols.GetHeadPosition();
while (NULL != pos)
{
CResourceSymbol* pSymbol = listSymbols.GetNext(pos);
if (NULL != pSymbol)
{
m_ctrlSymbols.UpdateSymbol(pSymbol);
}
}
}
}
/////////////////////////////////////////////////////////////////////////////
// CRenumWizNewSymbolValuesPage message handlers
/******************************************************************************
* Context Menu handler
*
******************************************************************************/
void CRenumWizNewSymbolValuesPage::OnContextMenu(CWnd* pWnd, CPoint point)
{
if (pWnd == &m_ctrlSymbols)
{
// Make sure window is active
//GetParentFrame()->ActivateFrame();
CCJMenu menu;
if (menu.LoadMenu(IDM_RENUMWIZ_NEW_VALUES_CONTEXT_MENU))
{
menu.LoadToolbar(IDR_MAINFRAME);
CMenu* pPopup = menu.GetSubMenu(0);
ASSERT(NULL != pPopup);
pPopup->SetDefaultItem(IDC_RENUMWIZ_EDIT_VALUE);
pPopup->TrackPopupMenu(TPM_RIGHTBUTTON | TPM_LEFTALIGN,
point.x,
point.y,
this);
return;
}
}
Default(); // Default message handling if we didn't do anything
}
/******************************************************************************
* Handler for "Autosize columns" context menu command
*
******************************************************************************/
void CRenumWizNewSymbolValuesPage::OnCmdAutosizeColumns(void)
{
m_ctrlSymbols.AutoSizeColumn();
}
void CRenumWizNewSymbolValuesPage::OnClickedHideUnmodifiedSymbols(void)
{
FillListCtrl();
}
/******************************************************************************
* "Edit Value" button handler
*
******************************************************************************/
void CRenumWizNewSymbolValuesPage::OnClickedEditValue(void)
{
CResourceSymbolList listSelectedSymbols, listSymbolsToUpdate;
m_ctrlSymbols.GetSelection(listSelectedSymbols);
POSITION pos = listSelectedSymbols.GetHeadPosition();
while (NULL != pos)
{
CResourceSymbol* pSymbol = listSelectedSymbols.GetNext(pos);
if (NULL != pSymbol)
{
// Create a dialog object and let it do the difficult bit
CSymbolPropertySheet dlg(IDP_SYM_PROPERTIES_CAPTION, this);
dlg.Initialise(&m_pEngine->m_LocalSymbolManager, pSymbol, true);
if (IDOK == dlg.DoModal())
{
UINT uOriginalValue = pSymbol->GetValue();
m_pEngine->m_LocalSymbolManager.Set( pSymbol,
dlg.GeneralPage().GetName(),
dlg.GeneralPage().GetValue(),
(FALSE != dlg.GeneralPage().IsReadOnly() ) );
// Update all affected symbols in the list control
UpdateSymbols(uOriginalValue);
UpdateSymbols(pSymbol->GetValue());
}
}
}
SetAvailableControls();
}
/******************************************************************************
* "Restore Original Value" button handler
*
******************************************************************************/
void CRenumWizNewSymbolValuesPage::OnClickedRestoreOriginalValue(void)
{
CResourceSymbolList listSelectedSymbols, listSymbolsToUpdate;
m_ctrlSymbols.GetSelection(listSelectedSymbols);
POSITION pos = listSelectedSymbols.GetHeadPosition();
while (NULL != pos)
{
CResourceSymbol* pSymbol = listSelectedSymbols.GetNext(pos);
if (NULL != pSymbol)
{
if ( (pSymbol->IsModified() ) && (pSymbol->GetOriginalValue() > 0) )
{
UINT uOriginalValue = pSymbol->GetOriginalValue();
UINT uCurrentValue = pSymbol->GetValue();
m_pEngine->m_LocalSymbolManager.Set( pSymbol,
pSymbol->GetName(),
uOriginalValue,
pSymbol->IsReadOnly() );
pSymbol->SetModifiedFlag(false);
m_ctrlSymbols.RemoveSymbol(pSymbol);
// Update all affected symbols in the list control
UpdateSymbols(uOriginalValue);
UpdateSymbols(uCurrentValue);
}
}
}
SetAvailableControls();
}
void CRenumWizNewSymbolValuesPage::OnClickedRenumber(void)
{
CResourceSymbolList listSelectedSymbols, listSymbolsToUpdate;
m_ctrlSymbols.GetSelection(listSelectedSymbols);
m_pEngine->Renumber(&listSelectedSymbols);
if (m_bHideUnmodifiedSymbols)
{
FillListCtrl();
}
else
{
m_ctrlSymbols.UpdateAllSymbols();
}
SetAvailableControls();
}
/******************************************************************************
* Called when the user double clicks on an item in the list
*
******************************************************************************/
void CRenumWizNewSymbolValuesPage::OnDblClickSymbols(NMHDR* /*pNMHDR*/, LRESULT* pResult)
{
*pResult = 0;
if (1 == m_ctrlSymbols.GetSelectedCount() )
{
OnClickedEditValue();
}
}
/******************************************************************************
* Called when an item changes in the list control
*
******************************************************************************/
void CRenumWizNewSymbolValuesPage::OnItemchangedSymbols(NMHDR* pNMHDR, LRESULT* pResult)
{
UNREFERENCED_PARAMETER(pNMHDR);
UNREFERENCED_PARAMETER(pResult);
SetAvailableControls();
}