Search in sources :

Example 1 with HistorySynchronizer

use of games.strategy.engine.framework.HistorySynchronizer in project triplea by triplea-game.

the class TripleAFrame method showHistory.

private void showHistory() {
    inHistory = true;
    inGame = false;
    setWidgetActivation();
    final GameData clonedGameData;
    data.acquireReadLock();
    try {
        // we want to use a clone of the data, so we can make changes to it
        // as we walk up and down the history
        clonedGameData = GameDataUtils.cloneGameData(data);
        if (clonedGameData == null) {
            return;
        }
        data.removeDataChangeListener(dataChangeListener);
        clonedGameData.testLocksOnRead();
        if (historySyncher != null) {
            throw new IllegalStateException("Two history synchers?");
        }
        historySyncher = new HistorySynchronizer(clonedGameData, game);
        clonedGameData.addDataChangeListener(dataChangeListener);
    } finally {
        data.releaseReadLock();
    }
    statsPanel.setGameData(clonedGameData);
    economyPanel.setGameData(clonedGameData);
    if (objectivePanel != null && !objectivePanel.isEmpty()) {
        objectivePanel.setGameData(clonedGameData);
    }
    details.setGameData(clonedGameData);
    mapPanel.setGameData(clonedGameData);
    final HistoryDetailsPanel historyDetailPanel = new HistoryDetailsPanel(clonedGameData, mapPanel);
    tabsPanel.removeAll();
    tabsPanel.add("History", historyDetailPanel);
    addTab("Players", statsPanel, 'P');
    addTab("Resources", economyPanel, 'R');
    if (objectivePanel != null && !objectivePanel.isEmpty()) {
        addTab(objectivePanel.getName(), objectivePanel, 'O');
    }
    addTab("Notes", notesPanel, 'N');
    addTab("Territory", details, 'T');
    if (getEditMode()) {
        tabsPanel.add("Edit", editPanel);
    }
    if (actionButtons.getCurrent() != null) {
        actionButtons.getCurrent().setActive(false);
    }
    historyComponent.removeAll();
    historyComponent.setLayout(new BorderLayout());
    // create history tree context menu
    // actions need to clear the history panel popup state when done
    final JPopupMenu popup = new JPopupMenu();
    popup.add(new AbstractAction("Show Summary Log") {

        private static final long serialVersionUID = -6730966512179268157L;

        @Override
        public void actionPerformed(final ActionEvent ae) {
            final HistoryLog historyLog = new HistoryLog();
            historyLog.printRemainingTurn(historyPanel.getCurrentPopupNode(), false, data.getDiceSides(), null);
            historyLog.printTerritorySummary(historyPanel.getCurrentPopupNode(), clonedGameData);
            historyLog.printProductionSummary(clonedGameData);
            historyPanel.clearCurrentPopupNode();
            historyLog.setVisible(true);
        }
    });
    popup.add(new AbstractAction("Show Detailed Log") {

        private static final long serialVersionUID = -8709762764495294671L;

        @Override
        public void actionPerformed(final ActionEvent ae) {
            final HistoryLog historyLog = new HistoryLog();
            historyLog.printRemainingTurn(historyPanel.getCurrentPopupNode(), true, data.getDiceSides(), null);
            historyLog.printTerritorySummary(historyPanel.getCurrentPopupNode(), clonedGameData);
            historyLog.printProductionSummary(clonedGameData);
            historyPanel.clearCurrentPopupNode();
            historyLog.setVisible(true);
        }
    });
    popup.add(new AbstractAction("Export Map Snapshot") {

        private static final long serialVersionUID = 1222760138263428443L;

        @Override
        public void actionPerformed(final ActionEvent ae) {
            ScreenshotExporter.exportScreenshot(TripleAFrame.this, data, historyPanel.getCurrentPopupNode());
            historyPanel.clearCurrentPopupNode();
        }
    });
    popup.add(new AbstractAction("Save Game at this point (BETA)") {

        private static final long serialVersionUID = 1430512376199927896L;

        @Override
        public void actionPerformed(final ActionEvent ae) {
            JOptionPane.showMessageDialog(TripleAFrame.this, "Please first left click on the spot you want to save from, Then right click and select 'Save Game From " + "History'" + "\n\nIt is recommended that when saving the game from the History panel:" + "\n * Your CURRENT GAME is at the start of some player's turn, and that no moves have been made and " + "no actions taken yet." + "\n * The point in HISTORY that you are trying to save at, is at the beginning of a player's turn, " + "or the beginning of a round." + "\nSaving at any other point, could potentially create errors." + "\nFor example, saving while your current game is in the middle of a move or battle phase will " + "always create errors in the savegame." + "\nAnd you will also get errors in the savegame if you try to create a save at a point in history " + "such as a move or battle phase.", "Save Game from History", JOptionPane.INFORMATION_MESSAGE);
            data.acquireReadLock();
            try {
                final File f = TripleAMenuBar.getSaveGameLocation(TripleAFrame.this);
                if (f != null) {
                    try (FileOutputStream fout = new FileOutputStream(f)) {
                        final GameData datacopy = GameDataUtils.cloneGameData(data, true);
                        datacopy.getHistory().gotoNode(historyPanel.getCurrentPopupNode());
                        datacopy.getHistory().removeAllHistoryAfterNode(historyPanel.getCurrentPopupNode());
                        // TODO: the saved current delegate is still the current delegate,
                        // rather than the delegate at that history popup node
                        // TODO: it still shows the current round number, rather than the round at the history popup node
                        // TODO: this could be solved easily if rounds/steps were changes,
                        // but that could greatly increase the file size :(
                        // TODO: this also does not undo the runcount of each delegate step
                        @SuppressWarnings("unchecked") final Enumeration<TreeNode> enumeration = ((DefaultMutableTreeNode) datacopy.getHistory().getRoot()).preorderEnumeration();
                        enumeration.nextElement();
                        int round = 0;
                        String stepDisplayName = datacopy.getSequence().getStep(0).getDisplayName();
                        PlayerID currentPlayer = datacopy.getSequence().getStep(0).getPlayerId();
                        while (enumeration.hasMoreElements()) {
                            final HistoryNode node = (HistoryNode) enumeration.nextElement();
                            if (node instanceof Round) {
                                round = Math.max(0, ((Round) node).getRoundNo() - datacopy.getSequence().getRoundOffset());
                                currentPlayer = null;
                                stepDisplayName = node.getTitle();
                            } else if (node instanceof Step) {
                                currentPlayer = ((Step) node).getPlayerId();
                                stepDisplayName = node.getTitle();
                            }
                        }
                        datacopy.getSequence().setRoundAndStep(round, stepDisplayName, currentPlayer);
                        GameDataManager.saveGame(fout, datacopy);
                        JOptionPane.showMessageDialog(TripleAFrame.this, "Game Saved", "Game Saved", JOptionPane.INFORMATION_MESSAGE);
                    } catch (final IOException e) {
                        ClientLogger.logQuietly("Failed to save game: " + f.getAbsolutePath(), e);
                    }
                }
            } finally {
                data.releaseReadLock();
            }
            historyPanel.clearCurrentPopupNode();
        }
    });
    final JSplitPane split = new JSplitPane();
    split.setOneTouchExpandable(true);
    split.setDividerSize(8);
    historyPanel = new HistoryPanel(clonedGameData, historyDetailPanel, popup, uiContext);
    split.setLeftComponent(historyPanel);
    split.setRightComponent(gameCenterPanel);
    split.setDividerLocation(150);
    historyComponent.add(split, BorderLayout.CENTER);
    historyComponent.add(gameSouthPanel, BorderLayout.SOUTH);
    getContentPane().removeAll();
    getContentPane().add(historyComponent, BorderLayout.CENTER);
    validate();
}
Also used : PlayerID(games.strategy.engine.data.PlayerID) GameData(games.strategy.engine.data.GameData) Enumeration(java.util.Enumeration) ActionEvent(java.awt.event.ActionEvent) HistorySynchronizer(games.strategy.engine.framework.HistorySynchronizer) HistoryLog(games.strategy.triplea.ui.history.HistoryLog) Step(games.strategy.engine.history.Step) IOException(java.io.IOException) HistoryPanel(games.strategy.triplea.ui.history.HistoryPanel) JPopupMenu(javax.swing.JPopupMenu) BorderLayout(java.awt.BorderLayout) HistoryNode(games.strategy.engine.history.HistoryNode) FileOutputStream(java.io.FileOutputStream) Round(games.strategy.engine.history.Round) HistoryDetailsPanel(games.strategy.triplea.ui.history.HistoryDetailsPanel) JSplitPane(javax.swing.JSplitPane) AbstractAction(javax.swing.AbstractAction) File(java.io.File)

Aggregations

GameData (games.strategy.engine.data.GameData)1 PlayerID (games.strategy.engine.data.PlayerID)1 HistorySynchronizer (games.strategy.engine.framework.HistorySynchronizer)1 HistoryNode (games.strategy.engine.history.HistoryNode)1 Round (games.strategy.engine.history.Round)1 Step (games.strategy.engine.history.Step)1 HistoryDetailsPanel (games.strategy.triplea.ui.history.HistoryDetailsPanel)1 HistoryLog (games.strategy.triplea.ui.history.HistoryLog)1 HistoryPanel (games.strategy.triplea.ui.history.HistoryPanel)1 BorderLayout (java.awt.BorderLayout)1 ActionEvent (java.awt.event.ActionEvent)1 File (java.io.File)1 FileOutputStream (java.io.FileOutputStream)1 IOException (java.io.IOException)1 Enumeration (java.util.Enumeration)1 AbstractAction (javax.swing.AbstractAction)1 JPopupMenu (javax.swing.JPopupMenu)1 JSplitPane (javax.swing.JSplitPane)1