//============================================================================
//----------------------------------------------------------------------------
// Menu.c
//----------------------------------------------------------------------------
//============================================================================
#include "PLDrivers.h"
#include "PLNumberFormatting.h"
#include "PLKeyEncoding.h"
#include "PLHacks.h"
#include "PLMenus.h"
#include "PLPasStr.h"
#include "DialogManager.h"
#include "DialogUtils.h"
#include "Externs.h"
#include "Environ.h"
#include "House.h"
#include "IGpSystemServices.h"
#include "MenuManager.h"
#include "ObjectEdit.h"
#define kSheWantsNewGame 1
#define kSheWantsResumeGame 2
void UpdateMenusEditMode (void);
void UpdateMenusNonEditMode (void);
void UpdateMenusHouseOpen (void);
void UpdateMenusHouseClosed (void);
void HeyYourPissingAHighScore (void);
MenuHandle appleMenu, gameMenu, optionsMenu, houseMenu, exportMenu;
Boolean menusUp, resumedSavedGame;
extern long incrementModeTime;
extern short demoHouseIndex, wasHouseVersion;
extern short splashOriginH, splashOriginV, numberRooms;
extern Boolean quitting, noRoomAtAll, twoPlayerGame;
extern Boolean isMapOpen, isToolsOpen, isPlayMusicIdle;
extern Boolean isCoordOpen, failedMusic, splashDrawn;
extern Boolean houseOpen;
//============================================================== Functions
//-------------------------------------------------------------- UpdateMenusEditMode
// Sets the menus to reflect that user is in edit mode.
void UpdateMenusEditMode (void)
{
DisableMenuItem(gameMenu, iNewGame);
DisableMenuItem(gameMenu, iTwoPlayer);
DisableMenuItem(gameMenu, iOpenSavedGame);
DisableMenuItem(optionsMenu, iHighScores);
DisableMenuItem(optionsMenu, iHelp);
CheckMenuItem(optionsMenu, iEditor, true);
}
//-------------------------------------------------------------- UpdateMenusNonEditMode
// Sets the menus to reflect that user is NOT in edit mode.
void UpdateMenusNonEditMode (void)
{
if ((noRoomAtAll) || (!houseOpen) || (numberRooms <= 0))
{
DisableMenuItem(gameMenu, iNewGame);
DisableMenuItem(gameMenu, iTwoPlayer);
DisableMenuItem(gameMenu, iOpenSavedGame);
if (houseOpen)
{
EnableMenuItem(optionsMenu, iEditor);
EnableMenuItem(optionsMenu, iHighScores);
}
else
{
DisableMenuItem(optionsMenu, iEditor);
DisableMenuItem(optionsMenu, iHighScores);
}
}
else
{
EnableMenuItem(gameMenu, iNewGame);
EnableMenuItem(gameMenu, iTwoPlayer);
EnableMenuItem(gameMenu, iOpenSavedGame);
EnableMenuItem(optionsMenu, iEditor);
EnableMenuItem(optionsMenu, iHighScores);
}
if (demoHouseIndex == -1)
DisableMenuItem(optionsMenu, iHelp);
else
EnableMenuItem(optionsMenu, iHelp);
CheckMenuItem(optionsMenu, iEditor, false);
}
//-------------------------------------------------------------- UpdateMenusHouseOpen
// Sets the menus to reflect that a house is currently open.
void UpdateMenusHouseOpen (void)
{
EnableMenuItem(gameMenu, iLoadHouse);
if ((fileDirty) && (houseUnlocked))
EnableMenuItem(houseMenu, iSave);
else
DisableMenuItem(houseMenu, iSave);
if (houseUnlocked)
{
// EnableMenuItem(houseMenu, iSaveAs);
EnableMenuItem(houseMenu, iHouse);
}
else
{
// DisableMenuItem(houseMenu, iSaveAs);
DisableMenuItem(houseMenu, iHouse);
}
if ((noRoomAtAll) || (!houseUnlocked))
DisableMenuItem(houseMenu, iRoom);
else
EnableMenuItem(houseMenu, iRoom);
if ((objActive == kNoObjectSelected) || (!houseUnlocked))
{
DisableMenuItem(houseMenu, iObject);
DisableMenuItem(houseMenu, iBringForward);
DisableMenuItem(houseMenu, iSendBack);
}
else
{
EnableMenuItem(houseMenu, iObject);
if ((objActive == kInitialGliderSelected) ||
(objActive == kLeftGliderSelected) ||
(objActive == kRightGliderSelected))
{
DisableMenuItem(houseMenu, iBringForward);
DisableMenuItem(houseMenu, iSendBack);
}
else
{
EnableMenuItem(houseMenu, iBringForward);
EnableMenuItem(houseMenu, iSendBack);
}
}
if (houseUnlocked)
{
EnableMenuItem(exportMenu, iExportGliderPROHouse);
if (PLDrivers::GetSystemServices()->GetOperatingSystem() == GpOperatingSystems::kWeb)
EnableMenuItem(exportMenu, iDownloadHouse);
}
else
{
DisableMenuItem(exportMenu, iExportGliderPROHouse);
if (PLDrivers::GetSystemServices()->GetOperatingSystem() == GpOperatingSystems::kWeb)
DisableMenuItem(exportMenu, iDownloadHouse);
}
}
//-------------------------------------------------------------- UpdateMenusHouseClosed
// Sets the menus to reflect that a house is NOT currently open.
void UpdateMenusHouseClosed (void)
{
DisableMenuItem(gameMenu, iLoadHouse);
DisableMenuItem(houseMenu, iSave);
// DisableMenuItem(houseMenu, iSaveAs);
DisableMenuItem(houseMenu, iHouse);
DisableMenuItem(houseMenu, iRoom);
DisableMenuItem(houseMenu, iObject);
DisableMenuItem(houseMenu, iCut);
DisableMenuItem(houseMenu, iCopy);
DisableMenuItem(houseMenu, iPaste);
DisableMenuItem(houseMenu, iClear);
DisableMenuItem(houseMenu, iDuplicate);
DisableMenuItem(exportMenu, iExportGliderPROHouse);
}
//-------------------------------------------------------------- UpdateClipboardMenus
// Set the Cut/Copy/Paste menus to reflect if we have data in theÉ
// Mac's "clipboard" or not.
void UpdateClipboardMenus (void)
{
Str255 title;
if (!houseOpen)
return;
PortabilityLayer::MenuManager *mm = PortabilityLayer::MenuManager::GetInstance();
if (houseUnlocked)
{
if (objActive > kNoObjectSelected)
{
GetLocalizedString(36, title);
mm->SetItemText(houseMenu, iCut - 1, title);
GetLocalizedString(37, title);
mm->SetItemText(houseMenu, iCopy - 1, title);
GetLocalizedString(38, title);
mm->SetItemText(houseMenu, iClear - 1, title);
mm->SetItemEnabled(houseMenu, iDuplicate - 1, true);
}
else
{
GetLocalizedString(39, title);
mm->SetItemText(houseMenu, iCut - 1, title);
GetLocalizedString(40, title);
mm->SetItemText(houseMenu, iCopy - 1, title);
GetLocalizedString(41, title);
mm->SetItemText(houseMenu, iClear - 1, title);
mm->SetItemEnabled(houseMenu, iDuplicate - 1, false);
}
mm->SetItemEnabled(houseMenu, iCut - 1, true);
mm->SetItemEnabled(houseMenu, iCopy - 1, true);
if (hasScrap)
{
EnableMenuItem(houseMenu, iPaste);
if (scrapIsARoom)
{
GetLocalizedString(42, title);
SetMenuItemText(houseMenu, iPaste, title);
}
else
{
GetLocalizedString(43, title);
SetMenuItemText(houseMenu, iPaste, title);
}
}
else
{
mm->SetItemEnabled(houseMenu, iPaste - 1, false);
GetLocalizedString(44, title);
mm->SetItemText(houseMenu, iPaste - 1, title);
}
mm->SetItemEnabled(houseMenu, iClear - 1, true);
mm->SetItemEnabled(houseMenu, iGoToRoom - 1, true);
mm->SetItemEnabled(houseMenu, iMapWindow - 1, true);
mm->SetItemEnabled(houseMenu, iObjectWindow - 1, true);
mm->SetItemEnabled(houseMenu, iCoordinateWindow - 1, true);
}
else
{
mm->SetItemEnabled(houseMenu, iCut - 1, false);
mm->SetItemEnabled(houseMenu, iCopy - 1, false);
mm->SetItemEnabled(houseMenu, iPaste - 1, false);
mm->SetItemEnabled(houseMenu, iClear - 1, false);
mm->SetItemEnabled(houseMenu, iDuplicate - 1, false);
mm->SetItemEnabled(houseMenu, iGoToRoom - 1, false);
mm->SetItemEnabled(houseMenu, iMapWindow - 1, false);
mm->SetItemEnabled(houseMenu, iObjectWindow - 1, false);
mm->SetItemEnabled(houseMenu, iCoordinateWindow - 1, false);
}
}
//-------------------------------------------------------------- UpdateMenus
// Called whenever a significant change to the environment has takenÉ
// place and some of the menu states may have changes (for example,É
// a menui was grayed out before becuase it wasn't an option - nowÉ
// perhaps the situation has changed and we want the menu to be "usable").
void UpdateMenus (Boolean newMode)
{
if (!menusUp)
return;
if (newMode)
{
PortabilityLayer::MenuManager *mm = PortabilityLayer::MenuManager::GetInstance();
if (theMode == kEditMode)
{
InsertMenu(houseMenu, 0);
InsertMenu(exportMenu, 0);
}
else
{
THandle