Added theme metrics analysis

Working on metrics editor
This commit is contained in:
Chris Danford
2003-03-28 21:34:40 +00:00
parent 541b5fe9c2
commit e89595cbea
13 changed files with 1124 additions and 79 deletions
+275
View File
@@ -0,0 +1,275 @@
// ColorListBox.cpp : implementation file
//-------------------------------------------------------------------
//
// CColorListBox class -
// A CListBox-derived class with optional colored items.
//
// Version: 1.0 01/10/1998 Copyright © Patrice Godard
//
// Version: 2.0 09/17/1999 Copyright © Paul M. Meidinger
//
//-------------------------------------------------------------------
#include "stdafx.h"
#include "ColorListBox.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CColorListBox
//-------------------------------------------------------------------
//
CColorListBox::CColorListBox()
//
// Return Value: None.
//
// Parameters : None.
//
// Remarks : Standard constructor.
//
{
} // CColorListBox
//-------------------------------------------------------------------
//
CColorListBox::~CColorListBox()
//
// Return Value: None.
//
// Parameters : None.
//
// Remarks : Destructor.
//
{
} // ~CColorListBox()
BEGIN_MESSAGE_MAP(CColorListBox, CListBox)
//{{AFX_MSG_MAP(CColorListBox)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CColorListBox message handlers
//-------------------------------------------------------------------
//
void CColorListBox::DrawItem(LPDRAWITEMSTRUCT lpDIS)
//
// Return Value: None.
//
// Parameters : lpDIS - A long pointer to a DRAWITEMSTRUCT structure
// that contains information about the type of drawing required.
//
// Remarks : Called by the framework when a visual aspect of
// an owner-draw list box changes.
//
{
if ((int)lpDIS->itemID < 0)
return;
CDC* pDC = CDC::FromHandle(lpDIS->hDC);
COLORREF crText;
CString sText;
COLORREF crNorm = (COLORREF)lpDIS->itemData; // Color information is in item data.
COLORREF crHilite = RGB(255-GetRValue(crNorm), 255-GetGValue(crNorm), 255-GetBValue(crNorm));
// If item has been selected, draw the highlight rectangle using the item's color.
if ((lpDIS->itemState & ODS_SELECTED) &&
(lpDIS->itemAction & (ODA_SELECT | ODA_DRAWENTIRE)))
{
CBrush brush(crNorm);
pDC->FillRect(&lpDIS->rcItem, &brush);
}
// If item has been deselected, draw the rectangle using the window color.
if (!(lpDIS->itemState & ODS_SELECTED) && (lpDIS->itemAction & ODA_SELECT))
{
CBrush brush(::GetSysColor(COLOR_WINDOW));
pDC->FillRect(&lpDIS->rcItem, &brush);
}
// If item has focus, draw the focus rect.
if ((lpDIS->itemAction & ODA_FOCUS) && (lpDIS->itemState & ODS_FOCUS))
pDC->DrawFocusRect(&lpDIS->rcItem);
// If item does not have focus, redraw (erase) the focus rect.
if ((lpDIS->itemAction & ODA_FOCUS) && !(lpDIS->itemState & ODS_FOCUS))
pDC->DrawFocusRect(&lpDIS->rcItem);
// Set the background mode to TRANSPARENT to draw the text.
int nBkMode = pDC->SetBkMode(TRANSPARENT);
// If the item's color information is set, use the highlight color
// gray text color, or normal color for the text.
if (lpDIS->itemData)
{
if (lpDIS->itemState & ODS_SELECTED)
crText = pDC->SetTextColor(crHilite);
else if (lpDIS->itemState & ODS_DISABLED)
crText = pDC->SetTextColor(::GetSysColor(COLOR_GRAYTEXT));
else
crText = pDC->SetTextColor(crNorm);
}
// Else the item's color information is not set, so use the
// system colors for the text.
else
{
if (lpDIS->itemState & ODS_SELECTED)
crText = pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
else if (lpDIS->itemState & ODS_DISABLED)
crText = pDC->SetTextColor(::GetSysColor(COLOR_GRAYTEXT));
else
crText = pDC->SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));
}
// Get and display item text.
GetText(lpDIS->itemID, sText);
CRect rect = lpDIS->rcItem;
// Setup the text format.
UINT nFormat = DT_LEFT | DT_SINGLELINE | DT_VCENTER;
if (GetStyle() & LBS_USETABSTOPS)
nFormat |= DT_EXPANDTABS;
// Calculate the rectangle size before drawing the text.
pDC->DrawText(sText, -1, &rect, nFormat | DT_CALCRECT);
pDC->DrawText(sText, -1, &rect, nFormat);
pDC->SetTextColor(crText);
pDC->SetBkMode(nBkMode);
} // DrawItem
//-------------------------------------------------------------------
//
void CColorListBox::MeasureItem(LPMEASUREITEMSTRUCT lpMIS)
//
// Return Value: None.
//
// Parameters : lpMIS - A long pointer to a
// MEASUREITEMSTRUCT structure.
//
// Remarks : Called by the framework when a list box with
// an owner-draw style is created.
//
{
// ### Is the default list box item height the same as
// the menu check height???
lpMIS->itemHeight = ::GetSystemMetrics(SM_CYMENUCHECK);
} // MeasureItem
//-------------------------------------------------------------------
//
int CColorListBox::AddString(LPCTSTR lpszItem)
//
// Return Value: The zero-based index to the string in the list box.
// The return value is LB_ERR if an error occurs; the
// return value is LB_ERRSPACE if insufficient space
// is available to store the new string.
//
// Parameters : lpszItem - Points to the null-terminated
// string that is to be added.
//
// Remarks : Call this member function to add a string to a list
// box. Provided because CListBox::AddString is NOT
// a virtual function.
//
{
return ((CListBox*)this)->AddString(lpszItem);
} // AddString
//-------------------------------------------------------------------
//
int CColorListBox::AddString(LPCTSTR lpszItem, COLORREF rgb)
//
// Return Value: The zero-based index to the string in the list box.
// The return value is LB_ERR if an error occurs; the
// return value is LB_ERRSPACE if insufficient space
// is available to store the new string.
//
// Parameters : lpszItem - Points to the null-terminated
// string that is to be added.
// rgb - Specifies the color to be associated with the item.
//
// Remarks : Call this member function to add a string to a list
// box with a custom color.
//
{
int nItem = AddString(lpszItem);
if (nItem >= 0)
SetItemData(nItem, rgb);
return nItem;
} // AddString
//-------------------------------------------------------------------
//
int CColorListBox::InsertString(int nIndex, LPCTSTR lpszItem)
//
// Return Value: The zero-based index of the position at which the
// string was inserted. The return value is LB_ERR if
// an error occurs; the return value is LB_ERRSPACE if
// insufficient space is available to store the new string.
//
// Parameters : nIndex - Specifies the zero-based index of the position
// to insert the string. If this parameter is 1, the string
// is added to the end of the list.
// lpszItem - Points to the null-terminated string that
// is to be inserted.
//
// Remarks : Inserts a string into the list box. Provided because
// CListBox::InsertString is NOT a virtual function.
//
{
return ((CListBox*)this)->InsertString(nIndex, lpszItem);
} // InsertString
//-------------------------------------------------------------------
//
int CColorListBox::InsertString(int nIndex, LPCTSTR lpszItem, COLORREF rgb)
//
// Return Value: The zero-based index of the position at which the
// string was inserted. The return value is LB_ERR if
// an error occurs; the return value is LB_ERRSPACE if
// insufficient space is available to store the new string.
//
// Parameters : nIndex - Specifies the zero-based index of the position
// to insert the string. If this parameter is 1, the string
// is added to the end of the list.
// lpszItem - Points to the null-terminated string that
// is to be inserted.
// rgb - Specifies the color to be associated with the item.
//
// Remarks : Inserts a colored string into the list box.
//
{
int nItem = ((CListBox*)this)->InsertString(nIndex,lpszItem);
if (nItem >= 0)
SetItemData(nItem, rgb);
return nItem;
} // InsertString
//-------------------------------------------------------------------
//
void CColorListBox::SetItemColor(int nIndex, COLORREF rgb)
//
// Return Value: None.
//
// Parameters : nIndex - Specifies the zero-based index of the item.
// rgb - Specifies the color to be associated with the item.
//
// Remarks : Sets the 32-bit value associated with the specified
// item in the list box.
//
{
SetItemData(nIndex, rgb);
RedrawWindow();
} // SetItemColor
+65
View File
@@ -0,0 +1,65 @@
#if !defined(AFX_COLORLISTBOX_H__5529A6B1_584A_11D2_A41A_006097BD277B__INCLUDED_)
#define AFX_COLORLISTBOX_H__5529A6B1_584A_11D2_A41A_006097BD277B__INCLUDED_
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
// ColorListBox.h : header file
//-------------------------------------------------------------------
//
// CColorListBox class -
// A CListBox-derived class with optional colored items.
//
// Version: 1.0 01/10/1998 Copyright © Patrice Godard
//
// Version: 2.0 09/17/1999 Copyright © Paul M. Meidinger
//
//-------------------------------------------------------------------
/////////////////////////////////////////////////////////////////////////////
// CColorListBox window
class CColorListBox : public CListBox
{
// Construction
public:
CColorListBox();
// Attributes
public:
// Operations
public:
int AddString(LPCTSTR lpszItem); // Adds a string to the list box
int AddString(LPCTSTR lpszItem, COLORREF rgb); // Adds a colored string to the list box
int InsertString(int nIndex, LPCTSTR lpszItem); // Inserts a string to the list box
int InsertString(int nIndex, LPCTSTR lpszItem, COLORREF rgb); // Inserts a colored string to the list box
void SetItemColor(int nIndex, COLORREF rgb); // Sets the color of an item in the list box
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CColorListBox)
public:
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CColorListBox();
// Generated message map functions
protected:
//{{AFX_MSG(CColorListBox)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_COLORLISTBOX_H__5529A6B1_584A_11D2_A41A_006097BD277B__INCLUDED_)
@@ -0,0 +1,46 @@
// EditMetricsDlg.cpp : implementation file
//
#include "stdafx.h"
#include "smpackage.h"
#include "EditMetricsDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// EditMetricsDlg dialog
EditMetricsDlg::EditMetricsDlg(CWnd* pParent /*=NULL*/)
: CDialog(EditMetricsDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(EditMetricsDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void EditMetricsDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(EditMetricsDlg)
DDX_Control(pDX, IDC_LIST_NAME, m_listName);
DDX_Control(pDX, IDC_LIST_CLASS, m_listClass);
DDX_Control(pDX, IDC_EDIT_VALUE, m_editValue);
DDX_Control(pDX, IDC_EDIT_DEFAULT, m_editDefault);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(EditMetricsDlg, CDialog)
//{{AFX_MSG_MAP(EditMetricsDlg)
// NOTE: the ClassWizard will add message map macros here
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// EditMetricsDlg message handlers
+52
View File
@@ -0,0 +1,52 @@
#if !defined(AFX_EDITMETRICSDLG_H__39D944CD_BCE4_4C30_876E_0B5A0CE42931__INCLUDED_)
#define AFX_EDITMETRICSDLG_H__39D944CD_BCE4_4C30_876E_0B5A0CE42931__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// EditMetricsDlg.h : header file
//
#include "ColorListBox.h"
/////////////////////////////////////////////////////////////////////////////
// EditMetricsDlg dialog
class EditMetricsDlg : public CDialog
{
// Construction
public:
EditMetricsDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(EditMetricsDlg)
enum { IDD = IDD_EDIT_METRICS };
CColorListBox m_listName;
CColorListBox m_listClass;
CEdit m_editValue;
CEdit m_editDefault;
//}}AFX_DATA
CString m_sTheme;
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(EditMetricsDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(EditMetricsDlg)
// NOTE: the ClassWizard will add member functions here
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_EDITMETRICSDLG_H__39D944CD_BCE4_4C30_876E_0B5A0CE42931__INCLUDED_)
+275
View File
@@ -0,0 +1,275 @@
/*
-----------------------------------------------------------------------------
File: IniFile.h
Desc: Wrapper for reading and writing an .ini file.
Copyright (c) 2001-2002 by the persons listed below. All rights reserved.
-----------------------------------------------------------------------------
*/
#include "stdafx.h"
#include "IniFile.h"
/////////////////////////////////////////////////////////////////////
// Construction/Destruction
/////////////////////////////////////////////////////////////////////
//default constructor
IniFile::IniFile()
{
}
//constructor, can specify pathname here instead of using SetPath later
IniFile::IniFile(CString inipath)
{
path = inipath;
}
//default destructor
IniFile::~IniFile()
{
}
/////////////////////////////////////////////////////////////////////
// Public Functions
/////////////////////////////////////////////////////////////////////
//sets path of ini file to read and write from
void IniFile::SetPath(CString newpath)
{
path = newpath;
}
//reads ini file specified using IniFile::SetPath()
//returns true if successful, false otherwise
BOOL IniFile::ReadFile()
{
CStdioFile file;
if( !file.Open(path, CFile::modeRead) )
{
error = "Unable to open ini file.";
return FALSE;
}
CString line;
int curkey = -1, curval = -1;
CString keyname, valuename, value;
while( file.ReadString(line) )
{
if( line != "" )
{
if( line[0] == '[' && line[line.GetLength()-1] == ']' ) //if a section heading
{
keyname = line;
keyname.TrimLeft('[');
keyname.TrimRight(']');
}
else //if a value
{
int iIndexOfEqual = line.Find("=");
if( iIndexOfEqual == -1 ) // this is a malformed line
continue;
valuename = line.Left( iIndexOfEqual );
value = line.Right(line.GetLength()-valuename.GetLength()-1);
SetValue(keyname,valuename,value);
}
}
}
file.Close();
return 1;
}
//writes data stored in class to ini file
void IniFile::WriteFile()
{
CStdioFile file;
if( !file.Open(path, CFile::modeCreate | CFile::modeWrite ) )
{
error = "Unable to open ini for writing.";
return;
}
// foreach key
for( int keynum = 0; keynum <= names.GetUpperBound(); keynum++ )
{
CString sTemp;
sTemp.Format( "[%s]\n", names[keynum] );
file.WriteString( sTemp );
CMapStringToString &map = keys[keynum];
// for each value_name/value pair
for( POSITION pos = map.GetStartPosition(); pos != NULL; )
{
CString value_name;
CString value;
map.GetNextAssoc( pos, value_name, value );
sTemp.Format( "%s=%s\n", value_name, value );
file.WriteString( sTemp );
}
file.WriteString( "\n" );
}
file.Close();
}
//deletes all stored ini data
void IniFile::Reset()
{
keys.SetSize(0);
names.SetSize(0);
}
//returns number of keys currently in the ini
int IniFile::GetNumKeys()
{
return keys.GetSize();
}
//returns a pointer to the key for direct modification
CMapStringToString* IniFile::GetKeyPointer( CString keyname )
{
int keynum = FindKey(keyname);
if (keynum == -1)
return NULL;
else
return &keys[keynum];
}
//returns number of values stored for specified key, or -1 if key not found
int IniFile::GetNumValues(CString keyname)
{
int keynum = FindKey(keyname);
if (keynum == -1)
return -1;
else
return keys[keynum].GetCount();
}
//gets value of [keyname] valuename =
//overloaded to return CString, int, and double
CString IniFile::GetValue(CString keyname, CString valuename)
{
int keynum = FindKey(keyname);//, valuenum = FindValue(keynum,valuename);
if( keynum == -1 )
{
error = "Unable to locate specified key.";
return "";
}
CMapStringToString &map = keys[keynum];
CString value;
if( !map.Lookup(valuename, value) )
{
error = "Unable to locate specified value.";
return "";
}
return value;
}
//gets value of [keyname] valuename =
//overloaded to return CString, int, and double
int IniFile::GetValueI(CString keyname, CString valuename)
{
return atoi( GetValue(keyname,valuename) );
}
//gets value of [keyname] valuename =
//overloaded to return CString, int, and double
double IniFile::GetValueF(CString keyname, CString valuename)
{
return atof( GetValue(keyname, valuename) );
}
//sets value of [keyname] valuename =.
//specify the optional paramter as false (0) if you do not want it to create
//the key if it doesn't exist. Returns true if data entered, false otherwise
//overloaded to accept CString, int, and double
BOOL IniFile::SetValue(CString keyname, CString valuename, CString value, BOOL create)
{
int keynum = FindKey(keyname);
if( keynum == -1 ) //if key doesn't exist
{
if( !create ) //and user does not want to create it,
return FALSE; //stop entering this key
names.SetSize(names.GetSize()+1);
keys.SetSize(keys.GetSize()+1);
keynum = names.GetSize()-1;
names[keynum] = keyname;
}
// insert value
CMapStringToString &map = keys[keynum];
CString oldvalue;
if( !map.Lookup(valuename, oldvalue) && !create )
return FALSE;
map[valuename] = value;
return TRUE;
}
//sets value of [keyname] valuename =.
//specify the optional paramter as false (0) if you do not want it to create
//the key if it doesn't exist. Returns true if data entered, false otherwise
//overloaded to accept CString, int, and double
BOOL IniFile::SetValueI(CString keyname, CString valuename, int value, BOOL create)
{
CString temp;
temp.Format("%d",value);
return SetValue(keyname, valuename, temp, create);
}
//sets value of [keyname] valuename =.
//specify the optional paramter as false (0) if you do not want it to create
//the key if it doesn't exist. Returns true if data entered, false otherwise
//overloaded to accept CString, int, and double
BOOL IniFile::SetValueF(CString keyname, CString valuename, double value, BOOL create)
{
CString temp;
temp.Format("%e",value);
return SetValue(keyname, valuename, temp, create);
}
//deletes specified value
//returns true if value existed and deleted, false otherwise
BOOL IniFile::DeleteValue(CString keyname, CString valuename)
{
int keynum = FindKey(keyname);
if( keynum == -1 )
return FALSE;
CMapStringToString &map = keys[keynum];
return map.RemoveKey( valuename );
}
//deletes specified key and all values contained within
//returns true if key existed and deleted, false otherwise
BOOL IniFile::DeleteKey(CString keyname)
{
int keynum = FindKey(keyname);
if (keynum == -1)
return 0;
keys.RemoveAt(keynum);
names.RemoveAt(keynum);
return 1;
}
/////////////////////////////////////////////////////////////////////
// Private Functions
/////////////////////////////////////////////////////////////////////
//returns index of specified key, or -1 if not found
int IniFile::FindKey(CString keyname)
{
int keynum = 0;
while ( keynum < keys.GetSize() && names[keynum] != keyname)
keynum++;
if (keynum == keys.GetSize())
return -1;
return keynum;
}
+111
View File
@@ -0,0 +1,111 @@
/*
-----------------------------------------------------------------------------
File: IniFile.h
Desc: Wrapper for reading and writing an .ini file.
Copyright (c) 2001-2002 by the persons listed below. All rights reserved.
-----------------------------------------------------------------------------
*/
#ifndef _INIFILE_H_
#define _INIFILE_H_
#include <afxtempl.h>
//#include <iostream.h>
class IniFile
{
//all private variables
public:
//stores pathname of ini file to read/write
CString path;
//all keys are of this time
typedef CMapStringToString key;
//list of keys in ini
CArray<key, key> keys;
//corresponding list of keynames
CArray<CString, CString> names;
//all private functions
private:
//returns index of specified key, or -1 if not found
int FindKey(CString keyname);
//public variables
public:
//will contain error info if one occurs
//ended up not using much, just in ReadFile and GetValue
CString error;
//public functions
public:
//default constructor
IniFile();
//constructor, can specify pathname here instead of using SetPath later
IniFile(CString inipath);
//default destructor
virtual ~IniFile();
//sets path of ini file to read and write from
void SetPath(CString newpath);
//reads ini file specified using IniFile::SetPath()
//returns true if successful, false otherwise
BOOL ReadFile();
//writes data stored in class to ini file
void WriteFile();
//deletes all stored ini data
void Reset();
//returns number of keys currently in the ini
int GetNumKeys();
//returns a pointer to the key for direct modification
CMapStringToString* GetKeyPointer( CString keyname );
//returns number of values stored for specified key
int GetNumValues( CString keyname );
//gets value of [keyname] valuename =
//overloaded to return CString, int, and double,
//returns "", or 0 if key/value not found. Sets error member to show problem
CString GetValue(CString keyname, CString valuename);
int GetValueI(CString keyname, CString valuename);
double GetValueF(CString keyname, CString valuename);
//sets value of [keyname] valuename =.
//specify the optional paramter as false (0) if you do not want it to create
//the key if it doesn't exist. Returns true if data entered, false otherwise
//overloaded to accept CString, int, and double
BOOL SetValue(CString key, CString valuename, CString value, BOOL create = 1);
BOOL SetValueI(CString key, CString valuename, int value, BOOL create = 1);
BOOL SetValueF(CString key, CString valuename, double value, BOOL create = 1);
//deletes specified value
//returns true if value existed and deleted, false otherwise
BOOL DeleteValue(CString keyname, CString valuename);
//deletes specified key and all values contained within
//returns true if key existed and deleted, false otherwise
BOOL DeleteKey(CString keyname);
};
#endif
Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 31 KiB

+155 -38
View File
@@ -5,6 +5,9 @@
#include "smpackage.h"
#include "onvertThemeDlg.h"
#include "smpackageUtil.h"
#include "EditMetricsDlg.h"
#include "EditMetricsDlg.h"
#include "IniFile.h"
#ifdef _DEBUG
#define new DEBUG_NEW
@@ -29,6 +32,8 @@ 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);
@@ -41,6 +46,8 @@ BEGIN_MESSAGE_MAP(ConvertThemeDlg, CDialog)
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()
@@ -192,6 +199,8 @@ void ConvertThemeDlg::OnSelchangeListThemes()
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 )
@@ -225,6 +234,28 @@ CString StripExtension( CString sPath )
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()
{
// TODO: Add your control notification handler code here
@@ -232,9 +263,9 @@ void ConvertThemeDlg::OnButtonAnalyze()
CString sBaseDir = "Themes\\default\\";
int iSel = m_listThemes.GetCurSel();
CString sThemeDir;
m_listThemes.GetText( iSel, sThemeDir );
sThemeDir = "Themes\\"+sThemeDir+"\\";
CString sThemeName;
m_listThemes.GetText( iSel, sThemeName );
CString sThemeDir = "Themes\\"+sThemeName+"\\";
CStringArray asBaseFilePaths;
GetDirListing( sBaseDir+"BGAnimations\\*.*", asBaseFilePaths, false, true );
@@ -250,15 +281,14 @@ void ConvertThemeDlg::OnButtonAnalyze()
GetDirListing( sThemeDir+"Numbers\\*.*", asThemeFilePaths, false, true );
GetDirListing( sThemeDir+"Sounds\\*.*", asThemeFilePaths, false, true );
FILE* fp = fopen( "theme_report.txt", "w" );
ASSERT( fp );
CStringArray asRedundantPaths;
CStringArray asWarningPaths;
CStringArray asRedundant;
CStringArray asWarning;
for( i=0; i<asThemeFilePaths.GetSize(); i++ )
{
CString sThemeElement = asThemeFilePaths[i];
sThemeElement.Replace( sThemeDir, "" );
sThemeElement = StripExtension( sThemeElement );
bool bFoundMatch = false;
for( int j=0; j<asBaseFilePaths.GetSize(); j++ )
{
@@ -269,48 +299,135 @@ void ConvertThemeDlg::OnButtonAnalyze()
if( sThemeElement.CompareNoCase(sBaseElement)==0 ) // file names match
{
if( FilesAreIdentical( asThemeFilePaths[i], asBaseFilePaths[j] ) )
{
asRedundantPaths.Add( asThemeFilePaths[i] );
break;
}
else // files are not identical
{
break; // skip to next file in asThemeFilePaths
}
asRedundant.Add( asThemeFilePaths[i] );
break; // skip to next file in asThemeFilePaths
}
}
if( j == asBaseFilePaths.GetSize() )
asWarningPaths.Add( asThemeFilePaths[i] );
if( !bFoundMatch )
asWarning.Add( 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<asRedundantPaths.GetSize(); i++ )
fprintf( fp, asRedundantPaths[i] + "\n" );
for( i=0; i<asRedundant.GetSize(); 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\n"
" the base theme. This likely means that there is an error in the file name.)\n" );
for( i=0; i<asWarningPaths.GetSize(); i++ )
fprintf( fp, asWarningPaths[i] + "\n" );
for( i=0; i<asWarning.GetSize(); i++ )
fprintf( fp, asWarning[i] + "\n" );
fclose( fp );
// launch notepad
PROCESS_INFORMATION pi;
STARTUPINFO si;
ZeroMemory( &si, sizeof(si) );
CreateProcess(
NULL, // pointer to name of executable module
"notepad.exe theme_report.txt", // 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
);
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()
{
// TODO: Add your control notification handler code here
int i;
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;
for( i=0; i<iniBase.names.GetSize(); i++ )
{
CString sKey = iniBase.names[i];
IniFile::key& Key = iniBase.keys[i];
for( POSITION pos=Key.GetStartPosition(); pos!=NULL; )
{
CString sName, sValue;
Key.GetNextAssoc( pos, sName, sValue );
mapBaseClassPlusNameToValue[sKey+"-"+sName] = sValue;
}
}
CMapStringToString mapThemeClassPlusNameToValue;
for( i=0; i<iniTheme.names.GetSize(); i++ )
{
CString sKey = iniTheme.names[i];
IniFile::key& Key = iniTheme.keys[i];
for( POSITION pos=Key.GetStartPosition(); pos!=NULL; )
{
CString sName, sValue;
Key.GetNextAssoc( pos, sName, sValue );
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.Add( sThemeKey );
break; // skip to next file in asThemeFilePaths
}
}
if( !bFoundMatch )
asWarning.Add( 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.GetSize(); 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.GetSize(); i++ )
fprintf( fp, asWarning[i] + "\n" );
fclose( fp );
LaunchNotepad( "metrics_report.txt" );
}
+4
View File
@@ -19,6 +19,8 @@ public:
// Dialog Data
//{{AFX_DATA(ConvertThemeDlg)
enum { IDD = IDD_CONVERT_THEME };
CButton m_buttonAnalyzeMetrics;
CButton m_buttonEditMetrics;
CButton m_buttonAnalyze;
CButton m_buttonConvert;
CListBox m_listThemes;
@@ -41,6 +43,8 @@ protected:
afx_msg void OnButtonConvert();
afx_msg void OnSelchangeListThemes();
afx_msg void OnButtonAnalyze();
afx_msg void OnButtonEditMetrics();
afx_msg void OnButtonAnalyzeMetrics();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
+10 -3
View File
@@ -15,6 +15,8 @@
#define MENU 140
#define IDD_CONVERT_THEME 142
#define CONVERTTHEME 144
#define IDD_EDIT_METRICS 145
#define EDIT_METRICS 146
#define IDC_LIST_SONGS 1000
#define IDC_LIST 1000
#define IDC_BUTTON_PLAY 1001
@@ -38,16 +40,21 @@
#define IDC_ANALYZE_ELEMENTS 1023
#define IDC_EDIT_INSTALLATIONS 1024
#define IDC_BUTTON_CONVERT 1024
#define IDC_EDIT_METRICS 1025
#define IDC_BUTTON_ANALYZE 1025
#define IDC_BUTTON_EDIT_METRICS 1026
#define IDC_LIST_CLASS 1026
#define IDC_LIST_NAME 1027
#define IDC_BUTTON_ANALYZE_METRICS 1027
#define IDC_EDIT_VALUE 1028
#define IDC_EDIT_DEFAULT 1029
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 145
#define _APS_NEXT_RESOURCE_VALUE 147
#define _APS_NEXT_COMMAND_VALUE 32771
#define _APS_NEXT_CONTROL_VALUE 1026
#define _APS_NEXT_CONTROL_VALUE 1029
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
+44 -17
View File
@@ -7,24 +7,26 @@ LastTemplate=CDialog
NewFileInclude1=#include "stdafx.h"
NewFileInclude2=#include "smpackage.h"
ClassCount=8
ClassCount=9
Class1=CSmpackageApp
Class2=CSmpackageDlg
ResourceCount=7
ResourceCount=8
Resource1=IDR_MAINFRAME
Resource2=IDD_MENU
Resource2=IDD_EDIT_INSTALLATIONS
Class3=CSMPackageInstallDlg
Class4=CSmpackageExportDlg
Resource3=IDD_EDIT_INSTALLATIONS
Resource3=IDD_INSTALL
Class5=EnterName
Resource4=IDD_DIALOG_NAME
Resource4=IDD_CONVERT_THEME
Class6=EditInsallations
Resource5=IDD_EXPORTER
Resource5=IDD_DIALOG_NAME
Class7=MainMenuDlg
Resource6=IDD_INSTALL
Resource6=IDD_MENU
Class8=ConvertThemeDlg
Resource7=IDD_CONVERT_THEME
Resource7=IDD_EXPORTER
Class9=EditMetricsDlg
Resource8=IDD_EDIT_METRICS
[CLS:CSmpackageApp]
Type=0
@@ -139,7 +141,7 @@ LastObject=EditInsallations
[DLG:IDD_MENU]
Type=1
Class=MainMenuDlg
ControlCount=13
ControlCount=11
Control1=IDOK,button,1342242817
Control2=IDC_STATIC,static,1342177294
Control3=IDC_EXPORT_PACKAGES,button,1342242816
@@ -150,9 +152,7 @@ Control7=IDC_ANALYZE_ELEMENTS,button,1342242816
Control8=IDC_EDIT_INSTALLATIONS,button,1342242816
Control9=IDC_STATIC,static,1342308352
Control10=IDC_STATIC,button,1342177287
Control11=IDC_EDIT_METRICS,button,1342242816
Control12=IDC_STATIC,static,1342308352
Control13=IDC_STATIC,static,1342308352
Control11=IDC_STATIC,static,1342308352
[CLS:MainMenuDlg]
Type=0
@@ -166,7 +166,7 @@ LastObject=IDC_CONVERT_THEME
[DLG:IDD_CONVERT_THEME]
Type=1
Class=ConvertThemeDlg
ControlCount=10
ControlCount=14
Control1=IDOK,button,1342242817
Control2=IDC_STATIC,static,1342177294
Control3=IDC_LIST_THEMES,listbox,1352728835
@@ -174,9 +174,13 @@ Control4=IDC_BUTTON_CONVERT,button,1476460544
Control5=IDC_STATIC,static,1342308352
Control6=IDC_STATIC,static,1342308352
Control7=IDC_STATIC,button,1342177287
Control8=IDC_STATIC,button,1342177287
Control9=IDC_STATIC,static,1342308352
Control10=IDC_BUTTON_ANALYZE,button,1476460544
Control8=IDC_STATIC,static,1342308352
Control9=IDC_BUTTON_ANALYZE,button,1476460544
Control10=IDC_STATIC,button,1342177287
Control11=IDC_STATIC,static,1342308352
Control12=IDC_BUTTON_EDIT_METRICS,button,1476460544
Control13=IDC_STATIC,static,1342308352
Control14=IDC_BUTTON_ANALYZE_METRICS,button,1476460544
[CLS:ConvertThemeDlg]
Type=0
@@ -184,6 +188,29 @@ HeaderFile=onvertThemeDlg.h
ImplementationFile=onvertThemeDlg.cpp
BaseClass=CDialog
Filter=D
LastObject=ConvertThemeDlg
LastObject=IDC_LIST_THEMES
VirtualFilter=dWC
[DLG:IDD_EDIT_METRICS]
Type=1
Class=EditMetricsDlg
ControlCount=10
Control1=IDOK,button,1342242817
Control2=IDC_STATIC,static,1342177294
Control3=IDC_LIST_CLASS,listbox,1352728835
Control4=IDC_STATIC,static,1342308352
Control5=IDC_LIST_NAME,listbox,1352728835
Control6=IDC_STATIC,static,1342308352
Control7=IDC_EDIT_VALUE,edit,1350631552
Control8=IDC_STATIC,static,1342308352
Control9=IDC_EDIT_DEFAULT,edit,1350633600
Control10=IDC_STATIC,static,1342308352
[CLS:EditMetricsDlg]
Type=0
HeaderFile=EditMetricsDlg.h
ImplementationFile=EditMetricsDlg.cpp
BaseClass=CDialog
Filter=D
VirtualFilter=dWC
+32
View File
@@ -88,6 +88,18 @@ LINK32=link.exe
# Name "smpackage - Win32 Debug"
# Begin Source File
SOURCE=.\ColorListBox.cpp
# End Source File
# Begin Source File
SOURCE=.\ColorListBox.h
# End Source File
# Begin Source File
SOURCE=.\converttheme.bmp
# End Source File
# Begin Source File
SOURCE=.\EditInsallations.cpp
# End Source File
# Begin Source File
@@ -96,6 +108,18 @@ SOURCE=.\EditInsallations.h
# End Source File
# Begin Source File
SOURCE=.\editmetrics.bmp
# End Source File
# Begin Source File
SOURCE=.\EditMetricsDlg.cpp
# End Source File
# Begin Source File
SOURCE=.\EditMetricsDlg.h
# End Source File
# Begin Source File
SOURCE=.\EnterName.cpp
# End Source File
# Begin Source File
@@ -104,6 +128,14 @@ SOURCE=.\EnterName.h
# End Source File
# Begin Source File
SOURCE=.\IniFile.cpp
# End Source File
# Begin Source File
SOURCE=.\IniFile.h
# End Source File
# Begin Source File
SOURCE=.\install.bmp
# End Source File
# Begin Source File
+55 -21
View File
@@ -153,51 +153,76 @@ BEGIN
IDC_STATIC,18,144,196,17
END
IDD_MENU DIALOG DISCARDABLE 0, 0, 332, 263
IDD_MENU DIALOG DISCARDABLE 0, 0, 332, 234
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "StepMania Tools Main Menu"
FONT 8, "MS Sans Serif"
BEGIN
DEFPUSHBUTTON "Close",IDOK,275,242,50,14
DEFPUSHBUTTON "Close",IDOK,275,213,50,14
CONTROL 140,IDC_STATIC,"Static",SS_BITMAP,0,0,332,38
PUSHBUTTON "Export Packages",IDC_EXPORT_PACKAGES,20,120,70,15
LTEXT "Choose this option to create .smzip files that you can share with other StepMania and DWI users. A .smzip package can contain songs, courses, themes, background animations, and more.",
IDC_STATIC,105,115,215,25
GROUPBOX ".smzip Packages",IDC_STATIC,5,100,320,50
GROUPBOX "Themes",IDC_STATIC,5,155,320,82
PUSHBUTTON "Analyze Elements",IDC_ANALYZE_ELEMENTS,20,174,70,15
GROUPBOX "Themes",IDC_STATIC,5,155,320,53
PUSHBUTTON "Theme Tools",IDC_ANALYZE_ELEMENTS,20,176,70,15
PUSHBUTTON "Edit Installations",IDC_EDIT_INSTALLATIONS,20,65,70,15
LTEXT "Choose this option to edit the list of locations where you have StepMania or DWI installed. When you double-click on a .smzip file, you can choose to install the package to any of these locations.",
IDC_STATIC,105,60,215,25
GROUPBOX "Installations",IDC_STATIC,5,45,320,50
PUSHBUTTON "Edit Metrics",IDC_EDIT_METRICS,19,208,70,15
LTEXT "This is a user-friendly interface for editing the metrics of a theme. It will warn you of misnamed and redundant metrics.",
IDC_STATIC,102,206,215,25
LTEXT "This function will catch mistakes in theme element naming. Also, it gives you the option to convert a StepMania 3.0 theme to the StepMania 4.0 naming scheme.",
IDC_STATIC,103,168,215,25
LTEXT "Using this feature, you can:\n - Catch redundant and misnamed theme elements\n - Convert a SM 3.0 theme for use in SM 4.0\n - Edit theme metrics using a user-friendly interface",
IDC_STATIC,103,168,215,35
END
IDD_CONVERT_THEME DIALOG DISCARDABLE 0, 0, 332, 234
IDD_CONVERT_THEME DIALOG DISCARDABLE 0, 0, 332, 282
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Theme Elements"
FONT 8, "MS Sans Serif"
BEGIN
DEFPUSHBUTTON "Close",IDOK,275,213,50,14
DEFPUSHBUTTON "Close",IDOK,275,261,50,14
CONTROL 144,IDC_STATIC,"Static",SS_BITMAP,0,0,332,38
LISTBOX IDC_LIST_THEMES,7,46,110,181,LBS_SORT |
LISTBOX IDC_LIST_THEMES,7,48,88,207,LBS_SORT |
LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
PUSHBUTTON "Convert from 3.0 to 4.0",IDC_BUTTON_CONVERT,174,59,95,
PUSHBUTTON "Convert from 3.0 to 4.0",IDC_BUTTON_CONVERT,170,55,95,
15,WS_DISABLED
LTEXT "This will convert a StepMania 3.0 theme to the StepMania 4.0 theme format. After converting a theme, it will no longer be compatible with StepMania 3.0. Be sure to make a backup if this is important to you.",
IDC_STATIC,129,82,189,34
LTEXT "This will convert the element names in a SM 3.0 theme to the SM 4.0 theme naming scheme. After converting a theme, it will no longer be compatible with StepMania 3.0. Be sure to make a backup if this is important to you.",
IDC_STATIC,110,75,210,33
LTEXT "This tool will not convert any theme metrics. You'll need to convert these by hand.",
IDC_STATIC,129,123,189,19
GROUPBOX "Convert",IDC_STATIC,123,46,202,102
GROUPBOX "Analyze",IDC_STATIC,123,153,202,54
IDC_STATIC,110,113,210,18
GROUPBOX "Elements",IDC_STATIC,105,45,220,122
LTEXT "Check for redundant or possibly midnamed theme elements.",
IDC_STATIC,130,185,186,18
PUSHBUTTON "Analyze Elements",IDC_BUTTON_ANALYZE,173,164,95,15,
IDC_STATIC,110,155,210,10
PUSHBUTTON "Analyze Elements",IDC_BUTTON_ANALYZE,165,135,95,15,
WS_DISABLED
GROUPBOX "Metrics",IDC_STATIC,105,172,220,83
LTEXT "Edit theme metrics with a user-friendly interface.",
IDC_STATIC,110,202,210,10
PUSHBUTTON "Edit Metrics",IDC_BUTTON_EDIT_METRICS,165,182,95,15,
WS_DISABLED
LTEXT "Check for redundant or possibly midnamed theme metrics.",
IDC_STATIC,109,242,210,10
PUSHBUTTON "Analyze Metrics",IDC_BUTTON_ANALYZE_METRICS,165,222,95,
15,WS_DISABLED
END
IDD_EDIT_METRICS DIALOG DISCARDABLE 0, 0, 332, 234
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Edit Theme Metrics"
FONT 8, "MS Sans Serif"
BEGIN
DEFPUSHBUTTON "Close",IDOK,275,213,50,14
CONTROL 146,IDC_STATIC,"Static",SS_BITMAP,0,0,332,38
LISTBOX IDC_LIST_CLASS,7,57,94,170,LBS_SORT |
LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
LTEXT "Class",IDC_STATIC,7,47,88,9
LISTBOX IDC_LIST_NAME,106,57,107,170,LBS_SORT |
LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
LTEXT "Name",IDC_STATIC,106,47,88,9
EDITTEXT IDC_EDIT_VALUE,217,58,108,46,ES_AUTOHSCROLL
LTEXT "Value",IDC_STATIC,218,47,88,9
EDITTEXT IDC_EDIT_DEFAULT,217,119,108,48,ES_AUTOHSCROLL |
ES_READONLY
LTEXT "Default Value",IDC_STATIC,218,108,88,9
END
@@ -289,10 +314,18 @@ BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 325
TOPMARGIN, 7
BOTTOMMARGIN, 256
BOTTOMMARGIN, 227
END
IDD_CONVERT_THEME, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 325
TOPMARGIN, 7
BOTTOMMARGIN, 275
END
IDD_EDIT_METRICS, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 325
@@ -312,6 +345,7 @@ INSTALL BITMAP DISCARDABLE "install.bmp"
MANAGE BITMAP DISCARDABLE "manage.bmp"
MENU BITMAP DISCARDABLE "menu.bmp"
CONVERTTHEME BITMAP DISCARDABLE "converttheme.bmp"
EDIT_METRICS BITMAP DISCARDABLE "editmetrics.bmp"
#endif // English (U.S.) resources
/////////////////////////////////////////////////////////////////////////////