package games.strategy.triplea.ui.menubar; import java.awt.event.KeyEvent; import java.io.File; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.KeyStroke; import games.strategy.engine.data.GameData; import games.strategy.engine.data.GameStep; import games.strategy.engine.data.PlayerID; import games.strategy.engine.framework.IGame; import games.strategy.engine.framework.system.SystemProperties; import games.strategy.engine.pbem.PBEMMessagePoster; import games.strategy.triplea.delegate.GameStepPropertiesHelper; import games.strategy.triplea.ui.MacQuitMenuWrapper; import games.strategy.triplea.ui.TripleAFrame; import games.strategy.triplea.ui.history.HistoryLog; import games.strategy.ui.SwingAction; public class FileMenu { private final GameData gameData; private final TripleAFrame frame; private final IGame game; public FileMenu(final TripleAMenuBar menuBar, final TripleAFrame frame) { this.frame = frame; game = frame.getGame(); gameData = frame.getGame().getData(); final JMenu fileMenu = new JMenu("File"); fileMenu.setMnemonic(KeyEvent.VK_F); fileMenu.add(createSaveMenu()); if (PBEMMessagePoster.GameDataHasPlayByEmailOrForumMessengers(gameData)) { fileMenu.add(addPostPBEM()); } fileMenu.addSeparator(); addExitMenu(fileMenu); menuBar.add(fileMenu); } private JMenuItem createSaveMenu() { final JMenuItem menuFileSave = new JMenuItem(SwingAction.of("Save", e -> { final File f = TripleAMenuBar.getSaveGameLocationDialog(frame); if (f != null) { game.saveGame(f); JOptionPane.showMessageDialog(frame, "Game Saved", "Game Saved", JOptionPane.INFORMATION_MESSAGE); } })); menuFileSave.setMnemonic(KeyEvent.VK_S); menuFileSave.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_S, java.awt.Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); return menuFileSave; } protected JMenuItem addPostPBEM() { final JMenuItem menuPBEM = new JMenuItem(SwingAction.of("Post PBEM/PBF Gamesave", e -> { if (gameData == null || !PBEMMessagePoster.GameDataHasPlayByEmailOrForumMessengers(gameData)) { return; } final String title = "Manual Gamesave Post"; try { gameData.acquireReadLock(); final GameStep step = gameData.getSequence().getStep(); final PlayerID currentPlayer = (step == null ? PlayerID.NULL_PLAYERID : (step.getPlayerID() == null ? PlayerID.NULL_PLAYERID : step.getPlayerID())); final int round = gameData.getSequence().getRound(); final HistoryLog historyLog = new HistoryLog(); historyLog.printFullTurn(gameData, true, GameStepPropertiesHelper.getTurnSummaryPlayers(gameData)); final PBEMMessagePoster poster = new PBEMMessagePoster(gameData, currentPlayer, round, title); PBEMMessagePoster.postTurn(title, historyLog, true, poster, null, frame, null); } finally { gameData.releaseReadLock(); } })); menuPBEM.setMnemonic(KeyEvent.VK_P); menuPBEM.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_P, java.awt.Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); return menuPBEM; } protected void addExitMenu(final JMenu parentMenu) { final boolean isMac = SystemProperties.isMac(); final JMenuItem leaveGameMenuExit = new JMenuItem(SwingAction.of("Leave Game", e -> frame.leaveGame())); leaveGameMenuExit.setMnemonic(KeyEvent.VK_L); if (isMac) { // On Mac OS X, the command-Q is reserved for the Quit action, // so set the command-L key combo for the Leave Game action leaveGameMenuExit.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_L, java.awt.Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); } else { // On non-Mac operating systems, set the Ctrl-Q key combo for the Leave Game action leaveGameMenuExit.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_Q, java.awt.Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); } parentMenu.add(leaveGameMenuExit); // Mac OS X automatically creates a Quit menu item under the TripleA menu, // so all we need to do is register that menu item with triplea's shutdown mechanism if (isMac) { MacQuitMenuWrapper.registerMacShutdownHandler(frame); } else { // On non-Mac operating systems, we need to manually create an Exit menu item final JMenuItem menuFileExit = new JMenuItem(SwingAction.of("Exit Program", e -> frame.shutdown())); menuFileExit.setMnemonic(KeyEvent.VK_E); parentMenu.add(menuFileExit); } } }