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

+154 -37
View File
@@ -5,6 +5,9 @@
#include "smpackage.h" #include "smpackage.h"
#include "onvertThemeDlg.h" #include "onvertThemeDlg.h"
#include "smpackageUtil.h" #include "smpackageUtil.h"
#include "EditMetricsDlg.h"
#include "EditMetricsDlg.h"
#include "IniFile.h"
#ifdef _DEBUG #ifdef _DEBUG
#define new DEBUG_NEW #define new DEBUG_NEW
@@ -29,6 +32,8 @@ void ConvertThemeDlg::DoDataExchange(CDataExchange* pDX)
{ {
CDialog::DoDataExchange(pDX); CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(ConvertThemeDlg) //{{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_ANALYZE, m_buttonAnalyze);
DDX_Control(pDX, IDC_BUTTON_CONVERT, m_buttonConvert); DDX_Control(pDX, IDC_BUTTON_CONVERT, m_buttonConvert);
DDX_Control(pDX, IDC_LIST_THEMES, m_listThemes); 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_BN_CLICKED(IDC_BUTTON_CONVERT, OnButtonConvert)
ON_LBN_SELCHANGE(IDC_LIST_THEMES, OnSelchangeListThemes) ON_LBN_SELCHANGE(IDC_LIST_THEMES, OnSelchangeListThemes)
ON_BN_CLICKED(IDC_BUTTON_ANALYZE, OnButtonAnalyze) 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 //}}AFX_MSG_MAP
END_MESSAGE_MAP() END_MESSAGE_MAP()
@@ -192,6 +199,8 @@ void ConvertThemeDlg::OnSelchangeListThemes()
BOOL bSomethingSelected = m_listThemes.GetCurSel() != LB_ERR; BOOL bSomethingSelected = m_listThemes.GetCurSel() != LB_ERR;
m_buttonConvert.EnableWindow( bSomethingSelected ); m_buttonConvert.EnableWindow( bSomethingSelected );
m_buttonAnalyze.EnableWindow( bSomethingSelected ); m_buttonAnalyze.EnableWindow( bSomethingSelected );
m_buttonEditMetrics.EnableWindow( bSomethingSelected );
m_buttonAnalyzeMetrics.EnableWindow( bSomethingSelected );
} }
bool FilesAreIdentical( CString sPath1, CString sPath2 ) bool FilesAreIdentical( CString sPath1, CString sPath2 )
@@ -225,6 +234,28 @@ CString StripExtension( CString sPath )
return sDir + sFName; 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() void ConvertThemeDlg::OnButtonAnalyze()
{ {
// TODO: Add your control notification handler code here // TODO: Add your control notification handler code here
@@ -232,9 +263,9 @@ void ConvertThemeDlg::OnButtonAnalyze()
CString sBaseDir = "Themes\\default\\"; CString sBaseDir = "Themes\\default\\";
int iSel = m_listThemes.GetCurSel(); int iSel = m_listThemes.GetCurSel();
CString sThemeDir; CString sThemeName;
m_listThemes.GetText( iSel, sThemeDir ); m_listThemes.GetText( iSel, sThemeName );
sThemeDir = "Themes\\"+sThemeDir+"\\"; CString sThemeDir = "Themes\\"+sThemeName+"\\";
CStringArray asBaseFilePaths; CStringArray asBaseFilePaths;
GetDirListing( sBaseDir+"BGAnimations\\*.*", asBaseFilePaths, false, true ); GetDirListing( sBaseDir+"BGAnimations\\*.*", asBaseFilePaths, false, true );
@@ -250,15 +281,14 @@ void ConvertThemeDlg::OnButtonAnalyze()
GetDirListing( sThemeDir+"Numbers\\*.*", asThemeFilePaths, false, true ); GetDirListing( sThemeDir+"Numbers\\*.*", asThemeFilePaths, false, true );
GetDirListing( sThemeDir+"Sounds\\*.*", asThemeFilePaths, false, true ); GetDirListing( sThemeDir+"Sounds\\*.*", asThemeFilePaths, false, true );
FILE* fp = fopen( "theme_report.txt", "w" ); CStringArray asRedundant;
ASSERT( fp ); CStringArray asWarning;
CStringArray asRedundantPaths;
CStringArray asWarningPaths;
for( i=0; i<asThemeFilePaths.GetSize(); i++ ) for( i=0; i<asThemeFilePaths.GetSize(); i++ )
{ {
CString sThemeElement = asThemeFilePaths[i]; CString sThemeElement = asThemeFilePaths[i];
sThemeElement.Replace( sThemeDir, "" ); sThemeElement.Replace( sThemeDir, "" );
sThemeElement = StripExtension( sThemeElement ); sThemeElement = StripExtension( sThemeElement );
bool bFoundMatch = false;
for( int j=0; j<asBaseFilePaths.GetSize(); j++ ) for( int j=0; j<asBaseFilePaths.GetSize(); j++ )
{ {
@@ -269,48 +299,135 @@ void ConvertThemeDlg::OnButtonAnalyze()
if( sThemeElement.CompareNoCase(sBaseElement)==0 ) // file names match if( sThemeElement.CompareNoCase(sBaseElement)==0 ) // file names match
{ {
if( FilesAreIdentical( asThemeFilePaths[i], asBaseFilePaths[j] ) ) if( FilesAreIdentical( asThemeFilePaths[i], asBaseFilePaths[j] ) )
{ asRedundant.Add( asThemeFilePaths[i] );
asRedundantPaths.Add( asThemeFilePaths[i] ); break; // skip to next file in asThemeFilePaths
break;
}
else // files are not identical
{
break; // skip to next file in asThemeFilePaths
}
} }
} }
if( j == asBaseFilePaths.GetSize() ) if( !bFoundMatch )
asWarningPaths.Add( asThemeFilePaths[i] ); 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" fprintf( fp, "The following elements are REDUNDANT.\n"
" (These elements are identical to the elements in the base theme.\n" " (These elements are identical to the elements in the base theme.\n"
" They are unnecessary and should be deleted.)\n" ); " They are unnecessary and should be deleted.)\n" );
for( i=0; i<asRedundantPaths.GetSize(); i++ ) for( i=0; i<asRedundant.GetSize(); i++ )
fprintf( fp, asRedundantPaths[i] + "\n" ); fprintf( fp, asRedundant[i] + "\n" );
fprintf( fp, "\n" ); fprintf( fp, "\n" );
fprintf( fp, "The following elements are possibly MISNAMED.\n" fprintf( fp, "The following elements are possibly MISNAMED.\n"
" (These files do not have a corresponding element in\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" ); " the base theme. This likely means that there is an error in the file name.)\n" );
for( i=0; i<asWarningPaths.GetSize(); i++ ) for( i=0; i<asWarning.GetSize(); i++ )
fprintf( fp, asWarningPaths[i] + "\n" ); fprintf( fp, asWarning[i] + "\n" );
fclose( fp ); fclose( fp );
// launch notepad LaunchNotepad( "elements_report.txt" );
PROCESS_INFORMATION pi; }
STARTUPINFO si;
ZeroMemory( &si, sizeof(si) );
CreateProcess( void ConvertThemeDlg::OnButtonEditMetrics()
NULL, // pointer to name of executable module {
"notepad.exe theme_report.txt", // pointer to command line string // TODO: Add your control notification handler code here
NULL, // process security attributes EditMetricsDlg dlg;
NULL, // thread security attributes int iSel = m_listThemes.GetCurSel();
false, // handle inheritance flag CString sThemeName;
0, // creation flags m_listThemes.GetText( iSel, sThemeName );
NULL, // pointer to new environment block dlg.m_sTheme = sThemeName;
NULL, // pointer to current directory name int nResponse = dlg.DoModal();
&si, // pointer to STARTUPINFO
&pi // pointer to PROCESS_INFORMATION
);
} }
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 // Dialog Data
//{{AFX_DATA(ConvertThemeDlg) //{{AFX_DATA(ConvertThemeDlg)
enum { IDD = IDD_CONVERT_THEME }; enum { IDD = IDD_CONVERT_THEME };
CButton m_buttonAnalyzeMetrics;
CButton m_buttonEditMetrics;
CButton m_buttonAnalyze; CButton m_buttonAnalyze;
CButton m_buttonConvert; CButton m_buttonConvert;
CListBox m_listThemes; CListBox m_listThemes;
@@ -41,6 +43,8 @@ protected:
afx_msg void OnButtonConvert(); afx_msg void OnButtonConvert();
afx_msg void OnSelchangeListThemes(); afx_msg void OnSelchangeListThemes();
afx_msg void OnButtonAnalyze(); afx_msg void OnButtonAnalyze();
afx_msg void OnButtonEditMetrics();
afx_msg void OnButtonAnalyzeMetrics();
//}}AFX_MSG //}}AFX_MSG
DECLARE_MESSAGE_MAP() DECLARE_MESSAGE_MAP()
}; };
+10 -3
View File
@@ -15,6 +15,8 @@
#define MENU 140 #define MENU 140
#define IDD_CONVERT_THEME 142 #define IDD_CONVERT_THEME 142
#define CONVERTTHEME 144 #define CONVERTTHEME 144
#define IDD_EDIT_METRICS 145
#define EDIT_METRICS 146
#define IDC_LIST_SONGS 1000 #define IDC_LIST_SONGS 1000
#define IDC_LIST 1000 #define IDC_LIST 1000
#define IDC_BUTTON_PLAY 1001 #define IDC_BUTTON_PLAY 1001
@@ -38,16 +40,21 @@
#define IDC_ANALYZE_ELEMENTS 1023 #define IDC_ANALYZE_ELEMENTS 1023
#define IDC_EDIT_INSTALLATIONS 1024 #define IDC_EDIT_INSTALLATIONS 1024
#define IDC_BUTTON_CONVERT 1024 #define IDC_BUTTON_CONVERT 1024
#define IDC_EDIT_METRICS 1025
#define IDC_BUTTON_ANALYZE 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 // Next default values for new objects
// //
#ifdef APSTUDIO_INVOKED #ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS #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_COMMAND_VALUE 32771
#define _APS_NEXT_CONTROL_VALUE 1026 #define _APS_NEXT_CONTROL_VALUE 1029
#define _APS_NEXT_SYMED_VALUE 101 #define _APS_NEXT_SYMED_VALUE 101
#endif #endif
#endif #endif
+44 -17
View File
@@ -7,24 +7,26 @@ LastTemplate=CDialog
NewFileInclude1=#include "stdafx.h" NewFileInclude1=#include "stdafx.h"
NewFileInclude2=#include "smpackage.h" NewFileInclude2=#include "smpackage.h"
ClassCount=8 ClassCount=9
Class1=CSmpackageApp Class1=CSmpackageApp
Class2=CSmpackageDlg Class2=CSmpackageDlg
ResourceCount=7 ResourceCount=8
Resource1=IDR_MAINFRAME Resource1=IDR_MAINFRAME
Resource2=IDD_MENU Resource2=IDD_EDIT_INSTALLATIONS
Class3=CSMPackageInstallDlg Class3=CSMPackageInstallDlg
Class4=CSmpackageExportDlg Class4=CSmpackageExportDlg
Resource3=IDD_EDIT_INSTALLATIONS Resource3=IDD_INSTALL
Class5=EnterName Class5=EnterName
Resource4=IDD_DIALOG_NAME Resource4=IDD_CONVERT_THEME
Class6=EditInsallations Class6=EditInsallations
Resource5=IDD_EXPORTER Resource5=IDD_DIALOG_NAME
Class7=MainMenuDlg Class7=MainMenuDlg
Resource6=IDD_INSTALL Resource6=IDD_MENU
Class8=ConvertThemeDlg Class8=ConvertThemeDlg
Resource7=IDD_CONVERT_THEME Resource7=IDD_EXPORTER
Class9=EditMetricsDlg
Resource8=IDD_EDIT_METRICS
[CLS:CSmpackageApp] [CLS:CSmpackageApp]
Type=0 Type=0
@@ -139,7 +141,7 @@ LastObject=EditInsallations
[DLG:IDD_MENU] [DLG:IDD_MENU]
Type=1 Type=1
Class=MainMenuDlg Class=MainMenuDlg
ControlCount=13 ControlCount=11
Control1=IDOK,button,1342242817 Control1=IDOK,button,1342242817
Control2=IDC_STATIC,static,1342177294 Control2=IDC_STATIC,static,1342177294
Control3=IDC_EXPORT_PACKAGES,button,1342242816 Control3=IDC_EXPORT_PACKAGES,button,1342242816
@@ -150,9 +152,7 @@ Control7=IDC_ANALYZE_ELEMENTS,button,1342242816
Control8=IDC_EDIT_INSTALLATIONS,button,1342242816 Control8=IDC_EDIT_INSTALLATIONS,button,1342242816
Control9=IDC_STATIC,static,1342308352 Control9=IDC_STATIC,static,1342308352
Control10=IDC_STATIC,button,1342177287 Control10=IDC_STATIC,button,1342177287
Control11=IDC_EDIT_METRICS,button,1342242816 Control11=IDC_STATIC,static,1342308352
Control12=IDC_STATIC,static,1342308352
Control13=IDC_STATIC,static,1342308352
[CLS:MainMenuDlg] [CLS:MainMenuDlg]
Type=0 Type=0
@@ -166,7 +166,7 @@ LastObject=IDC_CONVERT_THEME
[DLG:IDD_CONVERT_THEME] [DLG:IDD_CONVERT_THEME]
Type=1 Type=1
Class=ConvertThemeDlg Class=ConvertThemeDlg
ControlCount=10 ControlCount=14
Control1=IDOK,button,1342242817 Control1=IDOK,button,1342242817
Control2=IDC_STATIC,static,1342177294 Control2=IDC_STATIC,static,1342177294
Control3=IDC_LIST_THEMES,listbox,1352728835 Control3=IDC_LIST_THEMES,listbox,1352728835
@@ -174,9 +174,13 @@ Control4=IDC_BUTTON_CONVERT,button,1476460544
Control5=IDC_STATIC,static,1342308352 Control5=IDC_STATIC,static,1342308352
Control6=IDC_STATIC,static,1342308352 Control6=IDC_STATIC,static,1342308352
Control7=IDC_STATIC,button,1342177287 Control7=IDC_STATIC,button,1342177287
Control8=IDC_STATIC,button,1342177287 Control8=IDC_STATIC,static,1342308352
Control9=IDC_STATIC,static,1342308352 Control9=IDC_BUTTON_ANALYZE,button,1476460544
Control10=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] [CLS:ConvertThemeDlg]
Type=0 Type=0
@@ -184,6 +188,29 @@ HeaderFile=onvertThemeDlg.h
ImplementationFile=onvertThemeDlg.cpp ImplementationFile=onvertThemeDlg.cpp
BaseClass=CDialog BaseClass=CDialog
Filter=D 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 VirtualFilter=dWC
+32
View File
@@ -88,6 +88,18 @@ LINK32=link.exe
# Name "smpackage - Win32 Debug" # Name "smpackage - Win32 Debug"
# Begin Source File # 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 SOURCE=.\EditInsallations.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
@@ -96,6 +108,18 @@ SOURCE=.\EditInsallations.h
# End Source File # End Source File
# Begin 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 SOURCE=.\EnterName.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
@@ -104,6 +128,14 @@ SOURCE=.\EnterName.h
# End Source File # End Source File
# Begin 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 SOURCE=.\install.bmp
# End Source File # End Source File
# Begin Source File # Begin Source File
+55 -21
View File
@@ -153,51 +153,76 @@ BEGIN
IDC_STATIC,18,144,196,17 IDC_STATIC,18,144,196,17
END 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 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "StepMania Tools Main Menu" CAPTION "StepMania Tools Main Menu"
FONT 8, "MS Sans Serif" FONT 8, "MS Sans Serif"
BEGIN 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 CONTROL 140,IDC_STATIC,"Static",SS_BITMAP,0,0,332,38
PUSHBUTTON "Export Packages",IDC_EXPORT_PACKAGES,20,120,70,15 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.", 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 IDC_STATIC,105,115,215,25
GROUPBOX ".smzip Packages",IDC_STATIC,5,100,320,50 GROUPBOX ".smzip Packages",IDC_STATIC,5,100,320,50
GROUPBOX "Themes",IDC_STATIC,5,155,320,82 GROUPBOX "Themes",IDC_STATIC,5,155,320,53
PUSHBUTTON "Analyze Elements",IDC_ANALYZE_ELEMENTS,20,174,70,15 PUSHBUTTON "Theme Tools",IDC_ANALYZE_ELEMENTS,20,176,70,15
PUSHBUTTON "Edit Installations",IDC_EDIT_INSTALLATIONS,20,65,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.", 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 IDC_STATIC,105,60,215,25
GROUPBOX "Installations",IDC_STATIC,5,45,320,50 GROUPBOX "Installations",IDC_STATIC,5,45,320,50
PUSHBUTTON "Edit Metrics",IDC_EDIT_METRICS,19,208,70,15 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",
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,103,168,215,35
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
END 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 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Theme Elements" CAPTION "Theme Elements"
FONT 8, "MS Sans Serif" FONT 8, "MS Sans Serif"
BEGIN 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 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 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 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.", 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,129,82,189,34 IDC_STATIC,110,75,210,33
LTEXT "This tool will not convert any theme metrics. You'll need to convert these by hand.", LTEXT "This tool will not convert any theme metrics. You'll need to convert these by hand.",
IDC_STATIC,129,123,189,19 IDC_STATIC,110,113,210,18
GROUPBOX "Convert",IDC_STATIC,123,46,202,102 GROUPBOX "Elements",IDC_STATIC,105,45,220,122
GROUPBOX "Analyze",IDC_STATIC,123,153,202,54
LTEXT "Check for redundant or possibly midnamed theme elements.", LTEXT "Check for redundant or possibly midnamed theme elements.",
IDC_STATIC,130,185,186,18 IDC_STATIC,110,155,210,10
PUSHBUTTON "Analyze Elements",IDC_BUTTON_ANALYZE,173,164,95,15, PUSHBUTTON "Analyze Elements",IDC_BUTTON_ANALYZE,165,135,95,15,
WS_DISABLED 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 END
@@ -289,10 +314,18 @@ BEGIN
LEFTMARGIN, 7 LEFTMARGIN, 7
RIGHTMARGIN, 325 RIGHTMARGIN, 325
TOPMARGIN, 7 TOPMARGIN, 7
BOTTOMMARGIN, 256 BOTTOMMARGIN, 227
END END
IDD_CONVERT_THEME, DIALOG IDD_CONVERT_THEME, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 325
TOPMARGIN, 7
BOTTOMMARGIN, 275
END
IDD_EDIT_METRICS, DIALOG
BEGIN BEGIN
LEFTMARGIN, 7 LEFTMARGIN, 7
RIGHTMARGIN, 325 RIGHTMARGIN, 325
@@ -312,6 +345,7 @@ INSTALL BITMAP DISCARDABLE "install.bmp"
MANAGE BITMAP DISCARDABLE "manage.bmp" MANAGE BITMAP DISCARDABLE "manage.bmp"
MENU BITMAP DISCARDABLE "menu.bmp" MENU BITMAP DISCARDABLE "menu.bmp"
CONVERTTHEME BITMAP DISCARDABLE "converttheme.bmp" CONVERTTHEME BITMAP DISCARDABLE "converttheme.bmp"
EDIT_METRICS BITMAP DISCARDABLE "editmetrics.bmp"
#endif // English (U.S.) resources #endif // English (U.S.) resources
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////