2012-05-06 22:14:03 +00:00
/*
AppleWin : An Apple //e emulator for Windows
Copyright ( C ) 1994 - 1996 , Michael O ' Brien
Copyright ( C ) 1999 - 2001 , Oliver Schmidt
Copyright ( C ) 2002 - 2005 , Tom Charlesworth
Copyright ( C ) 2006 - 2012 , Tom Charlesworth , Michael Pohoreski
AppleWin is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation ; either version 2 of the License , or
( at your option ) any later version .
AppleWin is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with AppleWin ; if not , write to the Free Software
Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
*/
2012-03-27 21:20:36 +00:00
# include "stdafx.h"
2014-08-13 20:30:35 +00:00
2012-05-06 22:14:03 +00:00
# include "..\AppleWin.h" // g_nAppMode, g_uScrollLockToggle, sg_PropertySheet
2014-08-13 20:30:35 +00:00
# include "..\Disk.h"
# include "..\Frame.h"
# include "..\Registry.h"
# include "..\SaveState.h"
2012-05-06 22:14:03 +00:00
# include "IPropertySheet.h"
2014-08-13 20:30:35 +00:00
# include "PropertySheetHelper.h"
2012-05-06 22:14:03 +00:00
/*
Config causing AfterClose msgs :
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
Page : Action : Comment :
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Config
. Computer WM_USER_RESTART
. Benchmark PSBTN_OK - > WM_USER_BENCHMARK Forces PSBTN_OK
Input
. Mouse WM_USER_RESTART
. CP / M WM_USER_RESTART
Sound
2016-03-21 23:48:02 +00:00
. MB / Phasor / SAM / None WM_USER_RESTART
2012-05-06 22:14:03 +00:00
Disk
2013-03-28 22:28:42 +00:00
. Enhanced disk speed WM_USER_RESTART Why ? ( used to patch Disk ] [ f / w - but not anymore )
2012-05-06 22:14:03 +00:00
. HDD enable WM_USER_RESTART
Advanced
2012-08-11 22:02:35 +00:00
. Save State WM_USER_SAVESTATE
. Load State WM_USER_LOADSTATE
2012-05-06 22:14:03 +00:00
. Clone WM_USER_RESTART
. MrFreeze Rom WM_USER_RESTART
Requirements :
- - - - - - - - - - - - -
. Want to change multiple HW at once .
. Allow change Computer & Load State ( ie . multiple AfterClose msgs )
Design :
- - - - - - -
. At PropSheet init , copy original config state ( for above items )
. On last Page close , compare new config state , if changed :
- Show 1 restart + confirm msg ( if necessary )
- Cancel will rollback to original config ( for above items ) , but other items will be applied
. Load State button
2012-08-11 22:02:35 +00:00
- Don ' t action it immediately .
2012-05-06 22:14:03 +00:00
- . aws should contain config ( but doesn ' t ) , so should override any config changes .
- so this can just discard any config changes
- if any config change , then show msg box to say they won ' t be applied
. Save State button
2012-08-11 22:02:35 +00:00
- Don ' t action it immediately .
2012-05-06 22:14:03 +00:00
- save state applies to current config ( prior to restart ) .
- so this can just discard any config changes
- if any config change , then show msg box to say they won ' t be applied
. Benchmark button
2012-07-08 12:21:15 +00:00
- Action it immediately .
- If config has changed :
- Prompt to either do benchmark ( and lose new config ) or cancel benchmark ( and drop back to Configuration dialog ) .
2012-05-06 22:14:03 +00:00
*/
2012-03-27 21:20:36 +00:00
void CPropertySheetHelper : : FillComboBox ( HWND window , int controlid , LPCTSTR choices , int currentchoice )
{
_ASSERT ( choices ) ;
HWND combowindow = GetDlgItem ( window , controlid ) ;
SendMessage ( combowindow , CB_RESETCONTENT , 0 , 0 ) ;
while ( choices & & * choices )
{
SendMessage ( combowindow , CB_ADDSTRING , 0 , ( LPARAM ) ( LPCTSTR ) choices ) ;
choices + = _tcslen ( choices ) + 1 ;
}
SendMessage ( combowindow , CB_SETCURSEL , currentchoice , 0 ) ;
}
void CPropertySheetHelper : : SaveComputerType ( eApple2Type NewApple2Type )
{
if ( NewApple2Type = = A2TYPE_CLONE ) // Clone picked from Config tab, but no specific one picked from Advanced tab
NewApple2Type = A2TYPE_PRAVETS82 ;
REGSAVE ( TEXT ( REGVALUE_APPLE2_TYPE ) , NewApple2Type ) ;
}
2016-03-21 23:48:02 +00:00
void CPropertySheetHelper : : SaveCpuType ( eCpuType NewCpuType )
{
REGSAVE ( TEXT ( REGVALUE_CPU_TYPE ) , NewCpuType ) ;
}
2012-03-27 21:20:36 +00:00
void CPropertySheetHelper : : SetSlot4 ( SS_CARDTYPE NewCardType )
{
g_Slot4 = NewCardType ;
REGSAVE ( TEXT ( REGVALUE_SLOT4 ) , ( DWORD ) g_Slot4 ) ;
}
void CPropertySheetHelper : : SetSlot5 ( SS_CARDTYPE NewCardType )
{
g_Slot5 = NewCardType ;
REGSAVE ( TEXT ( REGVALUE_SLOT5 ) , ( DWORD ) g_Slot5 ) ;
}
// Looks like a (bad) C&P from SaveStateSelectImage()
// - eg. see "RAPCS" tags below...
// Used by:
// . CPageDisk: IDC_CIDERPRESS_BROWSE
// . CPageAdvanced: IDC_PRINTER_DUMP_FILENAME_BROWSE
2014-08-13 20:30:35 +00:00
std : : string CPropertySheetHelper : : BrowseToFile ( HWND hWindow , TCHAR * pszTitle , TCHAR * REGVALUE , TCHAR * FILEMASKS )
2012-03-27 21:20:36 +00:00
{
static char PathToFile [ MAX_PATH ] = { 0 } ; //This is a really awkward way to prevent mixing CiderPress and SaveStated values (RAPCS), but it seem the quickest. Here is its Line 1.
strcpy ( PathToFile , Snapshot_GetFilename ( ) ) ; //RAPCS, line 2.
TCHAR szDirectory [ MAX_PATH ] = TEXT ( " " ) ;
TCHAR szFilename [ MAX_PATH ] ;
strcpy ( szFilename , " " ) ;
RegLoadString ( TEXT ( " Configuration " ) , REGVALUE , 1 , szFilename , MAX_PATH ) ;
2014-08-13 20:30:35 +00:00
std : : string PathName = szFilename ;
2012-03-27 21:20:36 +00:00
OPENFILENAME ofn ;
ZeroMemory ( & ofn , sizeof ( OPENFILENAME ) ) ;
ofn . lStructSize = sizeof ( OPENFILENAME ) ;
ofn . hwndOwner = hWindow ;
ofn . hInstance = g_hInstance ;
ofn . lpstrFilter = FILEMASKS ;
/*ofn.lpstrFilter = TEXT("Applications (*.exe)\0*.exe\0")
TEXT ( " Text files (*.txt) \0 *.txt \0 " )
TEXT ( " All Files \0 *.* \0 " ) ; */
ofn . lpstrFile = szFilename ;
ofn . nMaxFile = MAX_PATH ;
ofn . lpstrInitialDir = szDirectory ;
ofn . Flags = OFN_PATHMUSTEXIST | OFN_HIDEREADONLY ;
ofn . lpstrTitle = pszTitle ;
int nRes = GetOpenFileName ( & ofn ) ;
if ( nRes ) // Okay is pressed
{
strcpy ( m_szNewFilename , & szFilename [ ofn . nFileOffset ] ) ; // TODO:TC: m_szNewFilename not used! (Was g_szNewFilename)
szFilename [ ofn . nFileOffset ] = 0 ;
if ( _tcsicmp ( szDirectory , szFilename ) )
strcpy ( m_szSSNewDirectory , szFilename ) ; // TODO:TC: m_szSSNewDirectory looks dodgy! (Was g_szSSNewDirectory)
PathName = szFilename ;
PathName . append ( m_szNewFilename ) ;
}
else // Cancel is pressed
{
RegLoadString ( TEXT ( " Configuration " ) , REGVALUE , 1 , szFilename , MAX_PATH ) ;
PathName = szFilename ;
}
strcpy ( m_szNewFilename , PathToFile ) ; //RAPCS, line 3 (last).
return PathName ;
}
void CPropertySheetHelper : : SaveStateUpdate ( )
{
if ( m_bSSNewFilename )
{
2013-12-29 22:09:41 +00:00
Snapshot_SetFilename ( m_szSSNewPathname ) ;
2012-03-27 21:20:36 +00:00
2013-12-29 22:09:41 +00:00
RegSaveString ( TEXT ( REG_CONFIG ) , REGVALUE_SAVESTATE_FILENAME , 1 , m_szSSNewPathname ) ;
2012-03-27 21:20:36 +00:00
if ( m_szSSNewDirectory [ 0 ] )
2013-12-29 22:09:41 +00:00
RegSaveString ( TEXT ( REG_PREFS ) , REGVALUE_PREF_START_DIR , 1 , m_szSSNewDirectory ) ;
2012-03-27 21:20:36 +00:00
}
}
void CPropertySheetHelper : : GetDiskBaseNameWithAWS ( TCHAR * pszFilename )
{
LPCTSTR pDiskName = DiskGetBaseName ( DRIVE_1 ) ;
if ( pDiskName & & pDiskName [ 0 ] )
{
strcpy ( pszFilename , pDiskName ) ;
2016-03-21 23:48:02 +00:00
strcpy ( & pszFilename [ strlen ( pDiskName ) ] , " .aws.yaml " ) ;
2012-03-27 21:20:36 +00:00
}
}
// NB. OK'ing this property sheet will call Snapshot_SetFilename() with this new filename
int CPropertySheetHelper : : SaveStateSelectImage ( HWND hWindow , TCHAR * pszTitle , bool bSave )
{
TCHAR szDirectory [ MAX_PATH ] = TEXT ( " " ) ;
TCHAR szFilename [ MAX_PATH ] = { 0 } ;
if ( bSave )
{
// Attempt to use drive1's image name as the name for the .aws file
// Else Attempt to use the Prop Sheet's filename
GetDiskBaseNameWithAWS ( szFilename ) ;
if ( szFilename [ 0 ] = = 0 )
{
strcpy ( szFilename , Snapshot_GetFilename ( ) ) ;
}
}
2013-12-29 22:09:41 +00:00
else // Load (or Browse)
2012-03-27 21:20:36 +00:00
{
// Attempt to use the Prop Sheet's filename first
// Else attempt to use drive1's image name as the name for the .aws file
strcpy ( szFilename , Snapshot_GetFilename ( ) ) ;
if ( szFilename [ 0 ] = = 0 )
{
GetDiskBaseNameWithAWS ( szFilename ) ;
}
2013-12-29 22:09:41 +00:00
strcpy ( szDirectory , Snapshot_GetPath ( ) ) ;
2012-03-27 21:20:36 +00:00
}
2013-12-29 22:09:41 +00:00
if ( szDirectory [ 0 ] = = 0 )
strcpy ( szDirectory , g_sCurrentDir ) ;
2012-03-27 21:20:36 +00:00
//
OPENFILENAME ofn ;
ZeroMemory ( & ofn , sizeof ( OPENFILENAME ) ) ;
ofn . lStructSize = sizeof ( OPENFILENAME ) ;
ofn . hwndOwner = hWindow ;
ofn . hInstance = g_hInstance ;
2016-03-21 23:48:02 +00:00
if ( bSave )
{
ofn . lpstrFilter = TEXT ( " Save State files (*.aws.yaml) \0 *.aws.yaml \0 " ) ;
TEXT ( " All Files \0 *.* \0 " ) ;
}
else
{
ofn . lpstrFilter = TEXT ( " Save State files (*.aws,*.aws.yaml) \0 *.aws;*.aws.yaml \0 " ) ;
TEXT ( " All Files \0 *.* \0 " ) ;
}
ofn . lpstrFile = szFilename ; // Dialog strips the last .EXT from this string (eg. file.aws.yaml is displayed as: file.aws
2012-03-27 21:20:36 +00:00
ofn . nMaxFile = MAX_PATH ;
ofn . lpstrInitialDir = szDirectory ;
ofn . Flags = OFN_PATHMUSTEXIST | OFN_HIDEREADONLY ;
ofn . lpstrTitle = pszTitle ;
2013-12-29 22:09:41 +00:00
2012-03-27 21:20:36 +00:00
int nRes = bSave ? GetSaveFileName ( & ofn ) : GetOpenFileName ( & ofn ) ;
if ( nRes )
{
if ( bSave ) // Only for saving (allow loading of any file for backwards compatibility)
{
2016-03-21 23:48:02 +00:00
// Append .aws.yaml if it's not there
const char szAWS_EXT1 [ ] = " .aws " ;
const char szAWS_EXT2 [ ] = " .yaml " ;
const char szAWS_EXT3 [ ] = " .aws.yaml " ;
const UINT uStrLenFile = strlen ( & szFilename [ ofn . nFileOffset ] ) ;
const UINT uStrLenExt1 = strlen ( szAWS_EXT1 ) ;
const UINT uStrLenExt2 = strlen ( szAWS_EXT2 ) ;
const UINT uStrLenExt3 = strlen ( szAWS_EXT3 ) ;
if ( uStrLenFile < = uStrLenExt1 )
{
strcpy ( & szFilename [ ofn . nFileOffset + uStrLenFile ] , szAWS_EXT3 ) ; // "file" += ".aws.yaml"
}
else if ( uStrLenFile < = uStrLenExt2 )
{
if ( strcmp ( & szFilename [ ofn . nFileOffset + uStrLenFile - uStrLenExt1 ] , szAWS_EXT1 ) = = 0 )
strcpy ( & szFilename [ ofn . nFileOffset + uStrLenFile - uStrLenExt1 ] , szAWS_EXT3 ) ; // "file.aws" -> "file" + ".aws.yaml"
else
strcpy ( & szFilename [ ofn . nFileOffset + uStrLenFile ] , szAWS_EXT3 ) ; // "file" += ".aws.yaml"
}
else if ( ( uStrLenFile < = uStrLenExt3 ) | | ( strcmp ( & szFilename [ ofn . nFileOffset + uStrLenFile - uStrLenExt3 ] , szAWS_EXT3 ) ! = 0 ) )
{
if ( strcmp ( & szFilename [ ofn . nFileOffset + uStrLenFile - uStrLenExt1 ] , szAWS_EXT1 ) = = 0 )
strcpy ( & szFilename [ ofn . nFileOffset + uStrLenFile - uStrLenExt1 ] , szAWS_EXT3 ) ; // "file.aws" -> "file" + ".aws.yaml"
else if ( strcmp ( & szFilename [ ofn . nFileOffset + uStrLenFile - uStrLenExt2 ] , szAWS_EXT2 ) = = 0 )
strcpy ( & szFilename [ ofn . nFileOffset + uStrLenFile - uStrLenExt2 ] , szAWS_EXT3 ) ; // "file.yaml" -> "file" + ".aws.yaml"
else
strcpy ( & szFilename [ ofn . nFileOffset + uStrLenFile ] , szAWS_EXT3 ) ; // "file" += ".aws.yaml"
}
2012-03-27 21:20:36 +00:00
}
2016-03-21 23:48:02 +00:00
strcpy ( m_szSSNewFilename , & szFilename [ ofn . nFileOffset ] ) ;
2013-12-29 22:09:41 +00:00
strcpy ( m_szSSNewPathname , szFilename ) ;
2012-03-27 21:20:36 +00:00
szFilename [ ofn . nFileOffset ] = 0 ;
if ( _tcsicmp ( szDirectory , szFilename ) )
strcpy ( m_szSSNewDirectory , szFilename ) ;
}
m_bSSNewFilename = nRes ? true : false ;
return nRes ;
}
2012-03-31 21:34:02 +00:00
// On OK: Optionally post a single "uAfterClose" msg after last page closes
2012-05-06 22:14:03 +00:00
void CPropertySheetHelper : : PostMsgAfterClose ( HWND hWnd , PAGETYPE page )
2012-03-31 21:34:02 +00:00
{
m_bmPages & = ~ ( 1 < < ( UINT32 ) page ) ;
2012-05-06 22:14:03 +00:00
if ( m_bmPages )
return ; // Still pages to close
//
2012-07-08 12:21:15 +00:00
if ( m_ConfigNew . m_uSaveLoadStateMsg & & IsOkToSaveLoadState ( hWnd , IsConfigChanged ( ) ) )
2012-05-06 22:14:03 +00:00
{
2012-07-08 12:21:15 +00:00
// Drop any config change, and do load/save state
2012-05-06 22:14:03 +00:00
PostMessage ( g_hFrameWindow , m_ConfigNew . m_uSaveLoadStateMsg , 0 , 0 ) ;
return ;
}
2012-07-08 12:21:15 +00:00
if ( m_bDoBenchmark )
{
// Drop any config change, and do benchmark
PostMessage ( g_hFrameWindow , WM_USER_BENCHMARK , 0 , 0 ) ; // NB. doesn't do WM_USER_RESTART
return ;
}
UINT uAfterClose = 0 ;
2012-05-06 22:14:03 +00:00
2012-07-08 12:21:15 +00:00
if ( IsConfigChanged ( ) )
2012-05-06 22:14:03 +00:00
{
if ( ! CheckChangesForRestart ( hWnd ) )
{
// Cancelled
RestoreCurrentConfig ( ) ;
return ;
}
ApplyNewConfig ( ) ;
uAfterClose = WM_USER_RESTART ;
}
if ( uAfterClose )
2012-03-31 21:34:02 +00:00
PostMessage ( g_hFrameWindow , uAfterClose , 0 , 0 ) ;
}
2012-05-06 22:14:03 +00:00
bool CPropertySheetHelper : : CheckChangesForRestart ( HWND hWnd )
{
if ( ! HardwareConfigChanged ( hWnd ) )
return false ; // Cancelled
if ( ! IsOkToRestart ( hWnd ) )
return false ; // Cancelled
return true ; // OK
}
2016-03-21 23:48:02 +00:00
# define CONFIG_CHANGED_LOCAL(var) \
( ConfigOld . var ! = ConfigNew . var )
2012-05-06 22:14:03 +00:00
// Apply changes to Registry
2016-03-21 23:48:02 +00:00
void CPropertySheetHelper : : ApplyNewConfig ( const CConfigNeedingRestart & ConfigNew , const CConfigNeedingRestart & ConfigOld )
2012-05-06 22:14:03 +00:00
{
2016-03-21 23:48:02 +00:00
if ( CONFIG_CHANGED_LOCAL ( m_Apple2Type ) )
2012-05-06 22:14:03 +00:00
{
2016-03-21 23:48:02 +00:00
SaveComputerType ( ConfigNew . m_Apple2Type ) ;
2012-05-06 22:14:03 +00:00
}
2016-03-21 23:48:02 +00:00
if ( CONFIG_CHANGED_LOCAL ( m_CpuType ) )
{
SaveCpuType ( ConfigNew . m_CpuType ) ;
}
2012-05-06 22:14:03 +00:00
2016-03-21 23:48:02 +00:00
if ( CONFIG_CHANGED_LOCAL ( m_Slot [ 4 ] ) )
SetSlot4 ( ConfigNew . m_Slot [ 4 ] ) ;
2012-05-06 22:14:03 +00:00
2016-03-21 23:48:02 +00:00
if ( CONFIG_CHANGED_LOCAL ( m_Slot [ 5 ] ) )
SetSlot5 ( ConfigNew . m_Slot [ 5 ] ) ;
2012-05-06 22:14:03 +00:00
2016-03-21 23:48:02 +00:00
if ( CONFIG_CHANGED_LOCAL ( m_bEnhanceDisk ) )
REGSAVE ( TEXT ( REGVALUE_ENHANCE_DISK_SPEED ) , ConfigNew . m_bEnhanceDisk ) ;
if ( CONFIG_CHANGED_LOCAL ( m_bEnableHDD ) )
2012-05-06 22:14:03 +00:00
{
2016-03-21 23:48:02 +00:00
REGSAVE ( TEXT ( REGVALUE_HDD_ENABLED ) , ConfigNew . m_bEnableHDD ? 1 : 0 ) ;
2012-05-06 22:14:03 +00:00
}
2016-03-21 23:48:02 +00:00
if ( CONFIG_CHANGED_LOCAL ( m_bEnableTheFreezesF8Rom ) )
2012-05-06 22:14:03 +00:00
{
2016-03-21 23:48:02 +00:00
REGSAVE ( TEXT ( REGVALUE_THE_FREEZES_F8_ROM ) , ConfigNew . m_bEnableTheFreezesF8Rom ) ;
2012-05-06 22:14:03 +00:00
}
}
2016-03-21 23:48:02 +00:00
void CPropertySheetHelper : : ApplyNewConfig ( void )
{
ApplyNewConfig ( m_ConfigNew , m_ConfigOld ) ;
}
2012-05-06 22:14:03 +00:00
void CPropertySheetHelper : : SaveCurrentConfig ( void )
{
// NB. clone-type is encoded in g_Apple2Type
2016-03-21 23:48:02 +00:00
m_ConfigOld . m_Apple2Type = GetApple2Type ( ) ;
m_ConfigOld . m_CpuType = GetMainCpu ( ) ;
2012-05-06 22:14:03 +00:00
m_ConfigOld . m_Slot [ 4 ] = g_Slot4 ;
m_ConfigOld . m_Slot [ 5 ] = g_Slot5 ;
m_ConfigOld . m_bEnhanceDisk = enhancedisk ;
m_ConfigOld . m_bEnableHDD = HD_CardIsEnabled ( ) ;
m_ConfigOld . m_bEnableTheFreezesF8Rom = sg_PropertySheet . GetTheFreezesF8Rom ( ) ;
// Reset flags each time:
m_ConfigOld . m_uSaveLoadStateMsg = 0 ;
2012-07-08 12:21:15 +00:00
m_bDoBenchmark = false ;
2012-05-06 22:14:03 +00:00
// Setup ConfigNew
m_ConfigNew = m_ConfigOld ;
}
void CPropertySheetHelper : : RestoreCurrentConfig ( void )
{
// NB. clone-type is encoded in g_Apple2Type
2016-03-21 23:48:02 +00:00
SetApple2Type ( m_ConfigOld . m_Apple2Type ) ;
SetMainCpu ( m_ConfigOld . m_CpuType ) ;
2012-05-06 22:14:03 +00:00
g_Slot4 = m_ConfigOld . m_Slot [ 4 ] ;
g_Slot5 = m_ConfigOld . m_Slot [ 5 ] ;
enhancedisk = m_ConfigOld . m_bEnhanceDisk ;
HD_SetEnabled ( m_ConfigOld . m_bEnableHDD ) ;
sg_PropertySheet . SetTheFreezesF8Rom ( m_ConfigOld . m_bEnableTheFreezesF8Rom ) ;
}
2012-07-08 12:21:15 +00:00
bool CPropertySheetHelper : : IsOkToSaveLoadState ( HWND hWnd , const bool bConfigChanged )
{
if ( bConfigChanged )
{
if ( MessageBox ( hWnd ,
TEXT ( " The hardware configuration has changed. Save/Load state will lose these changes. \n \n " )
TEXT ( " Are you sure you want to do this? " ) ,
TEXT ( REG_CONFIG ) ,
MB_ICONQUESTION | MB_OKCANCEL | MB_SETFOREGROUND ) = = IDCANCEL )
return false ;
}
return true ;
}
bool CPropertySheetHelper : : IsOkToRestart ( HWND hWnd )
{
if ( g_nAppMode = = MODE_LOGO )
return true ;
if ( MessageBox ( hWnd ,
TEXT ( " Restarting the emulator will reset the state " )
TEXT ( " of the emulated machine, causing you to lose any " )
TEXT ( " unsaved work. \n \n " )
TEXT ( " Are you sure you want to do this? " ) ,
TEXT ( REG_CONFIG ) ,
MB_ICONQUESTION | MB_OKCANCEL | MB_SETFOREGROUND ) = = IDCANCEL )
return false ;
return true ;
}
2016-03-21 23:48:02 +00:00
# define CONFIG_CHANGED(var) \
( m_ConfigOld . var ! = m_ConfigNew . var )
2012-05-06 22:14:03 +00:00
bool CPropertySheetHelper : : HardwareConfigChanged ( HWND hWnd )
{
std : : string strMsg ( " The emulator needs to restart as the hardware configuration has changed: \n " ) ;
strMsg + = " \n " ;
std : : string strMsgMain ;
{
if ( CONFIG_CHANGED ( m_Apple2Type ) )
strMsgMain + = " . Emulated computer has changed \n " ;
2016-03-21 23:48:02 +00:00
if ( CONFIG_CHANGED ( m_CpuType ) )
strMsgMain + = " . Emulated main CPU has changed \n " ;
2012-05-06 22:14:03 +00:00
if ( CONFIG_CHANGED ( m_Slot [ 4 ] ) )
strMsgMain + = GetSlot ( 4 ) ;
if ( CONFIG_CHANGED ( m_Slot [ 5 ] ) )
strMsgMain + = GetSlot ( 5 ) ;
if ( CONFIG_CHANGED ( m_bEnhanceDisk ) )
strMsgMain + = " . Floppy disk speed setting has changed \n " ;
if ( CONFIG_CHANGED ( m_bEnableHDD ) )
strMsgMain + = " . Harddisk(s) have been plugged/unplugged \n " ;
if ( CONFIG_CHANGED ( m_bEnableTheFreezesF8Rom ) )
strMsgMain + = " . F8 ROM changed (The Freeze's F8 Rom) \n " ;
}
std : : string strMsgPost ( " \n " ) ;
strMsgPost + = " This change will not take effect until the next time you restart the emulator. \n \n " ;
strMsgPost + = " Would you like to restart the emulator now? " ;
strMsg + = strMsgMain ;
strMsg + = strMsgPost ;
if ( MessageBox ( hWnd ,
strMsg . c_str ( ) ,
TEXT ( REG_CONFIG ) ,
MB_ICONQUESTION | MB_OKCANCEL | MB_SETFOREGROUND ) = = IDCANCEL )
return false ;
return true ;
}
std : : string CPropertySheetHelper : : GetSlot ( const UINT uSlot )
{
// strMsg = ". Slot n: ";
std : : string strMsg ( " . Slot " ) ;
strMsg + = ' 0 ' + uSlot ;
strMsg + = " : " ;
const SS_CARDTYPE OldCardType = m_ConfigOld . m_Slot [ uSlot ] ;
const SS_CARDTYPE NewCardType = m_ConfigNew . m_Slot [ uSlot ] ;
if ( ( OldCardType = = CT_Empty ) | | ( NewCardType = = CT_Empty ) )
{
if ( NewCardType = = CT_Empty )
{
strMsg + = GetCardName ( OldCardType ) ;
strMsg + = " card removed \n " ;
}
else
{
strMsg + = GetCardName ( NewCardType ) ;
strMsg + = " card added \n " ;
}
}
else
{
strMsg + = GetCardName ( OldCardType ) ;
strMsg + = " card removed & " ;
strMsg + = GetCardName ( NewCardType ) ;
strMsg + = " card added \n " ;
}
return strMsg ;
}
std : : string CPropertySheetHelper : : GetCardName ( const SS_CARDTYPE CardType )
{
switch ( CardType )
{
case CT_Empty :
return " Empty " ;
case CT_Disk2 : // Apple Disk][
return " Disk][ " ;
case CT_SSC : // Apple Super Serial Card
return " Super Serial " ;
case CT_MockingboardC : // Soundcard
return " Mockingboard " ;
case CT_GenericPrinter :
return " Printer " ;
case CT_GenericHDD : // Hard disk
return " Hard Disk " ;
case CT_GenericClock :
return " Clock " ;
case CT_MouseInterface :
return " Mouse " ;
case CT_Z80 :
return " CP/M " ;
case CT_Phasor : // Soundcard
return " Phasor " ;
case CT_Echo : // Soundcard
return " Echo " ;
case CT_SAM : // Soundcard: Software Automated Mouth
return " SAM " ;
default :
return " Unknown " ;
}
}