Files
itgmania212121/stepmania/src/smpackage/onvertThemeDlg.cpp
T
Glenn Maynard 33a835ff31 Tired of fighting with MFC; switch arrays to vector.
Update IniFile and some of RageUitl.  Can't do everything, since it's
still using MFC CString.
2003-07-23 00:47:23 +00:00

503 lines
22 KiB
C++

// onvertThemeDlg.cpp : implementation file
//
#include "stdafx.h"
#include "smpackage.h"
#include "onvertThemeDlg.h"
#include "smpackageUtil.h"
#include "EditMetricsDlg.h"
#include "EditMetricsDlg.h"
#include "IniFile.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// ConvertThemeDlg dialog
ConvertThemeDlg::ConvertThemeDlg(CWnd* pParent /*=NULL*/)
: CDialog(ConvertThemeDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(ConvertThemeDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void ConvertThemeDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(ConvertThemeDlg)
DDX_Control(pDX, IDC_BUTTON_ANALYZE_METRICS, m_buttonAnalyzeMetrics);
DDX_Control(pDX, IDC_BUTTON_EDIT_METRICS, m_buttonEditMetrics);
DDX_Control(pDX, IDC_BUTTON_ANALYZE, m_buttonAnalyze);
DDX_Control(pDX, IDC_BUTTON_CONVERT, m_buttonConvert);
DDX_Control(pDX, IDC_LIST_THEMES, m_listThemes);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(ConvertThemeDlg, CDialog)
//{{AFX_MSG_MAP(ConvertThemeDlg)
ON_BN_CLICKED(IDC_BUTTON_CONVERT, OnButtonConvert)
ON_LBN_SELCHANGE(IDC_LIST_THEMES, OnSelchangeListThemes)
ON_BN_CLICKED(IDC_BUTTON_ANALYZE, OnButtonAnalyze)
ON_BN_CLICKED(IDC_BUTTON_EDIT_METRICS, OnButtonEditMetrics)
ON_BN_CLICKED(IDC_BUTTON_ANALYZE_METRICS, OnButtonAnalyzeMetrics)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// ConvertThemeDlg message handlers
BOOL ConvertThemeDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
CStringArray asThemes;
GetDirListing( "Themes\\*.*", asThemes, true, false );
for( unsigned i=0; i<asThemes.size(); i++ )
// if( asThemes[i] != "default" ) // allow editing of default
m_listThemes.AddString( asThemes[i] );
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
// renames files and directories recursively
void RecursiveRename( CString sDirStart, CString sOld, CString sNew )
{
if( sDirStart.Right(1) != "\\" )
sDirStart += "\\";
CStringArray asFilesAndDirs;
GetDirListing( sDirStart+"*.*", asFilesAndDirs, false, false );
for( unsigned i=0; i<asFilesAndDirs.size(); i++ )
{
CString sOldFilePath = sDirStart+asFilesAndDirs[i];
CString sNewFilePath = sOldFilePath;
sNewFilePath.MakeLower();
sOld.MakeLower();
sNewFilePath.Replace( sOld, sNew );
if( sOldFilePath.CompareNoCase(sNewFilePath) != 0 )
MoveFile( sOldFilePath, sNewFilePath );
}
CStringArray asDirs;
GetDirListing( sDirStart+"*.*", asDirs, true, false );
for( i=0; i<asDirs.size(); i++ )
RecursiveRename( sDirStart+asDirs[i], sOld, sNew );
}
void ConvertThemeDlg::OnButtonConvert()
{
// TODO: Add your control notification handler code here
int iSel = m_listThemes.GetCurSel();
CString sThemeDir;
m_listThemes.GetText( iSel, sThemeDir );
sThemeDir = "Themes\\" + sThemeDir;
RecursiveRename( sThemeDir, "gameplay cleared", "______OBSOLETE gameplay cleared" );
RecursiveRename( sThemeDir, "gameplay closing star", "______OBSOLETE gameplay closing star" );
RecursiveRename( sThemeDir, "gameplay opening star", "______OBSOLETE gameplay opening star" );
RecursiveRename( sThemeDir, "gameplay here we go", "______OBSOLETE gameplay here we go" );
RecursiveRename( sThemeDir, "gameplay failed", "______OBSOLETE gameplay failed" );
RecursiveRename( sThemeDir, "gameplay toasty", "______OBSOLETE gameplay toasty" );
RecursiveRename( sThemeDir, "gameplay ready", "______OBSOLETE gameplay ready" );
RecursiveRename( sThemeDir, "keep alive", "______OBSOLETE keep alive" );
RecursiveRename( sThemeDir, "menu style icons 1x9", "______OBSOLETE menu style icons 1x9" );
RecursiveRename( sThemeDir, "game over", "______OBSOLETE game over" );
RecursiveRename( sThemeDir, "stage extra1", "______OBSOLETE stage extra1" );
RecursiveRename( sThemeDir, "stage extra2", "______OBSOLETE stage extra2" );
RecursiveRename( sThemeDir, "stage final", "______OBSOLETE stage final" );
RecursiveRename( sThemeDir, "stage oni", "______OBSOLETE stage oni" );
RecursiveRename( sThemeDir, "stage parts 5x3", "______OBSOLETE stage parts 5x3" );
RecursiveRename( sThemeDir, "stage stage", "______OBSOLETE stage stage" );
RecursiveRename( sThemeDir, "edit background", "______OBSOLETE edit background" );
RecursiveRename( sThemeDir, "Fonts\\bpmdisplay", "Fonts\\______OBSOLETE bpmdisplay" );
RecursiveRename( sThemeDir, "Fonts\\evaluation new record", "Fonts\\______OBSOLETE evaluation new record" );
RecursiveRename( sThemeDir, "Fonts\\evaluation stage", "Fonts\\______OBSOLETE evaluation stage" );
RecursiveRename( sThemeDir, "Fonts\\gameplay stage", "Fonts\\______OBSOLETE gameplay stage" );
RecursiveRename( sThemeDir, "Fonts\\normal2", "Fonts\\______OBSOLETE normal2" );
RecursiveRename( sThemeDir, "Fonts\\select course num songs", "Fonts\\______OBSOLETE select course num songs" );
RecursiveRename( sThemeDir, "Fonts\\select course total time", "Fonts\\______OBSOLETE select course total time" );
RecursiveRename( sThemeDir, "Fonts\\select group num songs", "Fonts\\______OBSOLETE select group num songs" );
RecursiveRename( sThemeDir, "Fonts\\select music hold", "Fonts\\______OBSOLETE select music hold" );
RecursiveRename( sThemeDir, "Fonts\\select music stage", "Fonts\\______OBSOLETE select music stage" );
RecursiveRename( sThemeDir, "Fonts\\small titles", "Fonts\\______OBSOLETE small titles" );
RecursiveRename( sThemeDir, "Fonts\\stage", "Fonts\\______OBSOLETE stage" );
RecursiveRename( sThemeDir, "Fonts\\survive time", "Fonts\\______OBSOLETE survive time" );
RecursiveRename( sThemeDir, "menu style icons", "______OBSOLETE menu style icons" );
RecursiveRename( sThemeDir, "music status icons", "______OBSOLETE music status icons" );
RecursiveRename( sThemeDir, "ScreenSelectMusic music", "______OBSOLETE ScreenSelectMusic music" );
RecursiveRename( sThemeDir, "title menu logo", "ScreenLogo" );
RecursiveRename( sThemeDir, "BGAnimations\\appearance options", "BGAnimations\\ScreenAppearanceOptions background" );
RecursiveRename( sThemeDir, "BGAnimations\\caution", "BGAnimations\\ScreenCaution background" );
RecursiveRename( sThemeDir, "BGAnimations\\game over", "BGAnimations\\ScreenGameOver background" );
RecursiveRename( sThemeDir, "BGAnimations\\logo", "BGAnimations\\ScreenLogo background" );
RecursiveRename( sThemeDir, "BGAnimations\\edit menu", "BGAnimations\\ScreenEditMenu background" );
RecursiveRename( sThemeDir, "BGAnimations\\evaluation", "BGAnimations\\ScreenEvaluation background" );
RecursiveRename( sThemeDir, "BGAnimations\\gameplay options", "BGAnimations\\ScreenGameplayOptions background" );
RecursiveRename( sThemeDir, "BGAnimations\\edit menu", "BGAnimations\\ScreenEditMenu background" );
RecursiveRename( sThemeDir, "BGAnimations\\game options", "BGAnimations\\ScreenGameOptions background" );
RecursiveRename( sThemeDir, "BGAnimations\\title menu", "BGAnimations\\ScreenLogo background" );
RecursiveRename( sThemeDir, "evaluation summary top edge", "ScreenEvaluationSummary header" );
RecursiveRename( sThemeDir, "top edge", "header" );
RecursiveRename( sThemeDir, "\\edit menu", "\\ScreenEditMenu" );
RecursiveRename( sThemeDir, "\\evaluation", "\\ScreenEvaluation" );
RecursiveRename( sThemeDir, "fallback banner", "Common fallback banner" );
RecursiveRename( sThemeDir, "Fonts\\music scroll", "Fonts\\ScreenMusicScroll titles" );
RecursiveRename( sThemeDir, "fallback background", "Common fallback background" );
RecursiveRename( sThemeDir, "all music banner", "Banner all" );
RecursiveRename( sThemeDir, "try extra stage", "try extra" );
RecursiveRename( sThemeDir, "fallback cd title", "ScreenSelectMusic fallback cdtitle" );
RecursiveRename( sThemeDir, "game options", "ScreenGameOptions" );
RecursiveRename( sThemeDir, "gameplay combo label", "Combo label" );
RecursiveRename( sThemeDir, "gameplay difficulty icons", "ScreenGameplay difficulty icons" );
RecursiveRename( sThemeDir, "gameplay extra life frame", "ScreenGameplay extra life frame" );
RecursiveRename( sThemeDir, "gameplay extra lifemeter bar", "LifeMeterBar extra frame" );
RecursiveRename( sThemeDir, "gameplay extra lifemeter stream hot", "LifeMeterBar extra hot" );
RecursiveRename( sThemeDir, "gameplay extra lifemeter stream normal", "LifeMeterBar extra normal" );
RecursiveRename( sThemeDir, "gameplay lifemeter bar", "LifeMeterBar frame" );
RecursiveRename( sThemeDir, "gameplay lifemeter battery 1x4", "LifeMeterBattery lives 1x4" );
RecursiveRename( sThemeDir, "gameplay lifemeter oni", "LifeMeterBattery frame" );
RecursiveRename( sThemeDir, "gameplay", "ScreenGameplay" );
RecursiveRename( sThemeDir, "graphic options", "ScreenGraphicOptions" );
RecursiveRename( sThemeDir, "input options", "ScreenInputOptions" );
RecursiveRename( sThemeDir, "instructions", "ScreenInstructions" );
RecursiveRename( sThemeDir, "machine options", "ScreenMachineOptions" );
RecursiveRename( sThemeDir, "map controllers", "ScreenMapControllers" );
RecursiveRename( sThemeDir, "menu bottom edge", "_shared footer" );
RecursiveRename( sThemeDir, "music sort icons 1x4", "MusicSortDisplay icons 1x4" );
RecursiveRename( sThemeDir, "options arrow", "ScreenOptions bullet" );
RecursiveRename( sThemeDir, "options cursor", "OptionsCursor cursor" );
RecursiveRename( sThemeDir, "options underline", "OptionsCursor underline" );
RecursiveRename( sThemeDir, "player options", "ScreenPlayerOptions" );
RecursiveRename( sThemeDir, "select course content bar", "CourseEntryDisplay bar" );
RecursiveRename( sThemeDir, "select course", "ScreenSelectCourse" );
RecursiveRename( sThemeDir, "select difficulty easy header", "ScreenSelectDifficulty info arcade-easy" );
RecursiveRename( sThemeDir, "select difficulty easy picture", "ScreenSelectDifficulty picture arcade-easy" );
RecursiveRename( sThemeDir, "select difficulty medium header", "ScreenSelectDifficulty info arcade-medium" );
RecursiveRename( sThemeDir, "select difficulty medium picture", "ScreenSelectDifficulty picture arcade-medium" );
RecursiveRename( sThemeDir, "select difficulty hard header", "ScreenSelectDifficulty info arcade-hard" );
RecursiveRename( sThemeDir, "select difficulty hard picture", "ScreenSelectDifficulty picture arcade-hard" );
RecursiveRename( sThemeDir, "select difficulty oni header", "ScreenSelectDifficulty info oni" );
RecursiveRename( sThemeDir, "select difficulty oni picture", "ScreenSelectDifficulty picture oni" );
RecursiveRename( sThemeDir, "select difficulty endless header", "ScreenSelectDifficulty info endless" );
RecursiveRename( sThemeDir, "select difficulty endless picture", "ScreenSelectDifficulty picture endless" );
RecursiveRename( sThemeDir, "select difficulty", "ScreenSelectDifficulty" );
RecursiveRename( sThemeDir, "select game", "ScreenSelectGame" );
RecursiveRename( sThemeDir, "select group button", "GroupList bar" );
RecursiveRename( sThemeDir, "select group contents header", "ScreenSelectGroup contents" );
RecursiveRename( sThemeDir, "select group info frame", "ScreenSelectGroup frame" );
RecursiveRename( sThemeDir, "select group", "ScreenSelectGroup" );
RecursiveRename( sThemeDir, "select music meter 2x1", "DifficultyMeter bar 2x1" );
RecursiveRename( sThemeDir, "select music option icons 3x2", "OptionIcon frame 3x2" );
RecursiveRename( sThemeDir, "select music radar base", "GrooveRadar base" );
RecursiveRename( sThemeDir, "select music radar labels 1x5", "GrooveRadar labels 1x5" );
RecursiveRename( sThemeDir, "select music roulette banner", "Banner roulette" );
RecursiveRename( sThemeDir, "select music scrollbar parts 1x3", "ScrollBar parts 1x3" );
RecursiveRename( sThemeDir, "select music scrollbar thumb", "ScrollBar thumb" );
RecursiveRename( sThemeDir, "select music section banner", "Banner abc" );
RecursiveRename( sThemeDir, "select music Section bar", "MusicWheelItem section" );
RecursiveRename( sThemeDir, "select music small grades", "SmallGradeDisplay grades" );
RecursiveRename( sThemeDir, "select music song bar", "MusicWheelItem song" );
RecursiveRename( sThemeDir, "select music", "ScreenSelectMusic" );
RecursiveRename( sThemeDir, "select player", "ScreenSelectPlayer" );
RecursiveRename( sThemeDir, "info dance", "info" );
RecursiveRename( sThemeDir, "preview dance", "picture" );
RecursiveRename( sThemeDir, "preview", "picture" );
RecursiveRename( sThemeDir, "select style", "ScreenSelectStyle" );
RecursiveRename( sThemeDir, "song options", "ScreenSongOptions" );
RecursiveRename( sThemeDir, "menu timer", "MenuTimer" );
RecursiveRename( sThemeDir, "appearance options", "ScreenAppearanceOptions" );
RecursiveRename( sThemeDir, "music scroll", "ScreenMusicScroll" );
RecursiveRename( sThemeDir, "how to play", "ScreenInstructions" );
RecursiveRename( sThemeDir, "background background", "background" );
RecursiveRename( sThemeDir, "credits", "ScreenManager credits" );
RecursiveRename( sThemeDir, "header1", "_shared1" );
RecursiveRename( sThemeDir, "header2", "_shared2" );
RecursiveRename( sThemeDir, "header3", "_shared3" );
RecursiveRename( sThemeDir, "header4", "_shared4" );
RecursiveRename( sThemeDir, "Fonts\\help", "Fonts\\Common help" );
RecursiveRename( sThemeDir, "Fonts\\musicwheel text banner", "Fonts\\TextBanner" );
RecursiveRename( sThemeDir, "Fonts\\normal", "Fonts\\Common normal" );
RecursiveRename( sThemeDir, "Fonts\\option icons", "Fonts\\OptionIcon" );
RecursiveRename( sThemeDir, "Fonts\\option explanation", "Fonts\\ScreenOptions explanation" );
RecursiveRename( sThemeDir, "Fonts\\option item", "Fonts\\ScreenOptions item" );
RecursiveRename( sThemeDir, "Fonts\\option title", "Fonts\\ScreenOptions title" );
RecursiveRename( sThemeDir, "Fonts\\select course num songs", "Fonts\\ScreenOptions title" );
RecursiveRename( sThemeDir, "Fonts\\select group button label", "Fonts\\GroupList label" );
RecursiveRename( sThemeDir, "Fonts\\selectmusicsection", "Fonts\\MusicWheel section" );
RecursiveRename( sThemeDir, "Fonts\\titlemenu", "Fonts\\ScreenTitleMenu choices" );
RecursiveRename( sThemeDir, "numbers 5x3", "5x3" );
RecursiveRename( sThemeDir, " (dither)", "" );
RecursiveRename( sThemeDir, " (1alpha)", "" );
RecursiveRename( sThemeDir, " (1 alpha)", "" );
RecursiveRename( sThemeDir, " (0 alpha)", "" );
RecursiveRename( sThemeDir, "edit header", "ScreenEdit header" );
AfxMessageBox( "Conversion Complete!" );
}
void ConvertThemeDlg::OnSelchangeListThemes()
{
// TODO: Add your control notification handler code here
BOOL bSomethingSelected = m_listThemes.GetCurSel() != LB_ERR;
m_buttonConvert.EnableWindow( bSomethingSelected );
m_buttonAnalyze.EnableWindow( bSomethingSelected );
m_buttonEditMetrics.EnableWindow( bSomethingSelected );
m_buttonAnalyzeMetrics.EnableWindow( bSomethingSelected );
}
bool FilesAreIdentical( CString sPath1, CString sPath2 )
{
if( IsADirectory(sPath1) || IsADirectory(sPath2) )
return false;
FILE* fp1 = fopen( sPath1, "r" );
FILE* fp2 = fopen( sPath2, "r" );
bool bReturn;
if( GetFileSizeInBytes(sPath1) != GetFileSizeInBytes(sPath2) )
{
bReturn = false;
goto clean_up;
}
char buffer1[1024], buffer2[1024];
ZERO( buffer1 );
ZERO( buffer2 );
while( !feof(fp1) )
{
int size1 = fread( buffer1, 1, sizeof(buffer1), fp1 );
int size2 = fread( buffer2, 1, sizeof(buffer2), fp2 );
if( size1 != size2 )
{
bReturn = false;
goto clean_up;
}
if( memcmp( buffer1, buffer2, sizeof(size1) ) != 0 )
{
bReturn = false;
goto clean_up;
}
}
bReturn = true;
goto clean_up;
clean_up:
fclose( fp1 );
fclose( fp2 );
return bReturn;
}
CString StripExtension( CString sPath )
{
CString sDir, sFName, sExt;
splitrelpath( sPath, sDir, sFName, sExt );
return sDir + sFName;
}
void LaunchNotepad( CString sPathToOpen )
{
PROCESS_INFORMATION pi;
STARTUPINFO si;
ZeroMemory( &si, sizeof(si) );
char szCommand[MAX_PATH] = "notepad.exe ";
strcat( szCommand, sPathToOpen );
CreateProcess(
NULL, // pointer to name of executable module
szCommand, // pointer to command line string
NULL, // process security attributes
NULL, // thread security attributes
false, // handle inheritance flag
0, // creation flags
NULL, // pointer to new environment block
NULL, // pointer to current directory name
&si, // pointer to STARTUPINFO
&pi // pointer to PROCESS_INFORMATION
);
}
void ConvertThemeDlg::OnButtonAnalyze()
{
CString sBaseDir = "Themes\\default\\";
int iSel = m_listThemes.GetCurSel();
CString sThemeName;
m_listThemes.GetText( iSel, sThemeName );
CString sThemeDir = "Themes\\"+sThemeName+"\\";
CStringArray asBaseFilePaths;
GetDirListing( sBaseDir+"BGAnimations\\*.*", asBaseFilePaths, false, true );
GetDirListing( sBaseDir+"Fonts\\*.*", asBaseFilePaths, false, true );
GetDirListing( sBaseDir+"Graphics\\*.*", asBaseFilePaths, false, true );
GetDirListing( sBaseDir+"Numbers\\*.*", asBaseFilePaths, false, true );
GetDirListing( sBaseDir+"Sounds\\*.*", asBaseFilePaths, false, true );
CStringArray asThemeFilePaths;
GetDirListing( sThemeDir+"BGAnimations\\*.*", asThemeFilePaths, false, true );
GetDirListing( sThemeDir+"Fonts\\*.*", asThemeFilePaths, false, true );
GetDirListing( sThemeDir+"Graphics\\*.*", asThemeFilePaths, false, true );
GetDirListing( sThemeDir+"Numbers\\*.*", asThemeFilePaths, false, true );
GetDirListing( sThemeDir+"Sounds\\*.*", asThemeFilePaths, false, true );
CStringArray asRedundant;
CStringArray asWarning;
unsigned i;
for( i=0; i<asThemeFilePaths.size(); i++ )
{
CString sThemeElement = asThemeFilePaths[i];
sThemeElement.Replace( sThemeDir, "" );
sThemeElement = StripExtension( sThemeElement );
bool bFoundMatch = false;
for( unsigned j=0; j<asBaseFilePaths.size(); j++ )
{
CString sBaseElement = asBaseFilePaths[j];
sBaseElement.Replace( sBaseDir, "" );
sBaseElement = StripExtension( sBaseElement );
if( sThemeElement.CompareNoCase(sBaseElement)==0 ) // file names match
{
bFoundMatch = true;
if( FilesAreIdentical( asThemeFilePaths[i], asBaseFilePaths[j] ) )
asRedundant.push_back( asThemeFilePaths[i] );
break; // skip to next file in asThemeFilePaths
}
}
if( !bFoundMatch )
asWarning.push_back( asThemeFilePaths[i] );
}
SortCStringArray( asRedundant );
SortCStringArray( asWarning );
FILE* fp = fopen( "elements_report.txt", "w" );
ASSERT( fp );
fprintf( fp, "Theme elements report for '"+sThemeName+"'.\n\n" );
fprintf( fp, "The following elements are REDUNDANT.\n"
" (These elements are identical to the elements in the base theme.\n"
" They are unnecessary and should be deleted.)\n" );
for( i=0; i<asRedundant.size(); i++ )
fprintf( fp, asRedundant[i] + "\n" );
fprintf( fp, "\n" );
fprintf( fp, "The following elements are possibly MISNAMED.\n"
" (These files do not have a corresponding element in the base theme.\n"
" This likely means that there is an error in the file name.)\n" );
for( i=0; i<asWarning.size(); i++ )
fprintf( fp, asWarning[i] + "\n" );
fclose( fp );
LaunchNotepad( "elements_report.txt" );
}
void ConvertThemeDlg::OnButtonEditMetrics()
{
// TODO: Add your control notification handler code here
EditMetricsDlg dlg;
int iSel = m_listThemes.GetCurSel();
CString sThemeName;
m_listThemes.GetText( iSel, sThemeName );
dlg.m_sTheme = sThemeName;
int nResponse = dlg.DoModal();
}
void ConvertThemeDlg::OnButtonAnalyzeMetrics()
{
int iSel = m_listThemes.GetCurSel();
CString sThemeName;
m_listThemes.GetText( iSel, sThemeName );
IniFile iniBase;
iniBase.SetPath( "Themes\\default\\metrics.ini" );
iniBase.ReadFile();
IniFile iniTheme;
iniTheme.SetPath( "Themes\\"+sThemeName+"\\metrics.ini" );
iniTheme.ReadFile();
CMapStringToString mapBaseClassPlusNameToValue;
unsigned i;
IniFile::const_iterator it;
for( it = iniBase.begin(); it != iniBase.end(); ++it )
{
CString sKey = it->first;
const IniFile::key &Key = it->second;
for( IniFile::key::const_iterator val = Key.begin(); val != Key.end(); ++val )
{
CString sName = val->first, sValue = val->second;
mapBaseClassPlusNameToValue[sKey+"-"+sName] = sValue;
}
}
CMapStringToString mapThemeClassPlusNameToValue;
for( it = iniTheme.begin(); it != iniTheme.end(); ++it )
{
CString sKey = it->first;
const IniFile::key &Key = it->second;
for( IniFile::key::const_iterator val = Key.begin(); val != Key.end(); ++val )
{
CString sName = val->first, sValue = val->second;
mapThemeClassPlusNameToValue[sKey+"-"+sName] = sValue;
}
}
CStringArray asRedundant;
CStringArray asWarning;
for( POSITION pos1=mapThemeClassPlusNameToValue.GetStartPosition(); pos1!=NULL; )
{
CString sThemeKey, sThemeValue;
mapThemeClassPlusNameToValue.GetNextAssoc( pos1, sThemeKey, sThemeValue );
bool bFoundMatch = false;
for( POSITION pos2=mapBaseClassPlusNameToValue.GetStartPosition(); pos2!=NULL; )
{
CString sBaseKey, sBaseValue;
mapBaseClassPlusNameToValue.GetNextAssoc( pos2, sBaseKey, sBaseValue );
if( sThemeKey == sBaseKey ) // match
{
bFoundMatch = true;
if( sThemeValue == sBaseValue )
asRedundant.push_back( sThemeKey );
break; // skip to next file in asThemeFilePaths
}
}
if( !bFoundMatch )
asWarning.push_back( sThemeKey );
}
SortCStringArray( asRedundant );
SortCStringArray( asWarning );
FILE* fp = fopen( "metrics_report.txt", "w" );
ASSERT( fp );
fprintf( fp, "Theme metrics report for '"+sThemeName+"'.\n\n" );
fprintf( fp, "The following metrics are REDUNDANT.\n"
" (These metrics are identical to the metrics in the base theme.\n"
" They are unnecessary and should be deleted.)\n" );
for( i=0; i<asRedundant.size(); i++ )
fprintf( fp, asRedundant[i] + "\n" );
fprintf( fp, "\n" );
fprintf( fp, "The following elements are possibly MISNAMED.\n"
" (These metrics do not have a corresponding metric in\n"
" the base theme. This likely means that there is an error in the metric name.)\n" );
for( i=0; i<asWarning.size(); i++ )
fprintf( fp, asWarning[i] + "\n" );
fclose( fp );
LaunchNotepad( "metrics_report.txt" );
}