package games.strategy.triplea.ui.history; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.util.Collection; import java.util.Iterator; import javax.swing.Box; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import games.strategy.engine.data.GameData; import games.strategy.engine.data.Territory; import games.strategy.engine.data.Unit; import games.strategy.engine.history.HistoryNode; import games.strategy.engine.history.Renderable; import games.strategy.triplea.delegate.DiceRoll; import games.strategy.triplea.delegate.dataObjects.MoveDescription; import games.strategy.triplea.delegate.dataObjects.PlacementDescription; import games.strategy.triplea.ui.DicePanel; import games.strategy.triplea.ui.MapPanel; import games.strategy.triplea.ui.SimpleUnitPanel; import games.strategy.triplea.util.UnitCategory; import games.strategy.triplea.util.UnitSeperator; public class HistoryDetailsPanel extends JPanel implements IHistoryDetailsPanel { private static final long serialVersionUID = 5092004144144006960L; private final GameData m_data; private final JTextArea m_title = new JTextArea(); private final JScrollPane m_scroll = new JScrollPane(m_title); private final MapPanel m_mapPanel; public HistoryDetailsPanel(final GameData data, final MapPanel mapPanel) { m_data = data; setLayout(new GridBagLayout()); m_title.setWrapStyleWord(true); m_title.setBackground(this.getBackground()); m_title.setLineWrap(true); m_title.setBorder(null); m_title.setEditable(false); m_scroll.setBorder(null); m_mapPanel = mapPanel; } @Override @SuppressWarnings("unchecked") public void render(final HistoryNode node) { removeAll(); m_mapPanel.setRoute(null); final Insets insets = new Insets(5, 0, 0, 0); m_title.setText(node.getTitle()); add(m_scroll, new GridBagConstraints(0, 0, 1, 1, 1, 0.1, GridBagConstraints.NORTH, GridBagConstraints.BOTH, insets, 0, 0)); final GridBagConstraints mainConstraints = new GridBagConstraints(0, 1, 1, 1, 1, 0.9, GridBagConstraints.NORTH, GridBagConstraints.BOTH, insets, 0, 0); if (node instanceof Renderable) { final Object details = ((Renderable) node).getRenderingData(); if (details instanceof DiceRoll) { final DicePanel dicePanel = new DicePanel(m_mapPanel.getUIContext(), m_data); dicePanel.setDiceRoll((DiceRoll) details); add(dicePanel, mainConstraints); } else if (details instanceof MoveDescription) { final MoveDescription moveMessage = (MoveDescription) details; renderUnits(mainConstraints, moveMessage.getUnits()); m_mapPanel.setRoute(moveMessage.getRoute()); if (!m_mapPanel.isShowing(moveMessage.getRoute().getEnd())) { m_mapPanel.centerOn(moveMessage.getRoute().getEnd()); } } else if (details instanceof PlacementDescription) { final PlacementDescription placeMessage = (PlacementDescription) details; renderUnits(mainConstraints, placeMessage.getUnits()); if (!m_mapPanel.isShowing(placeMessage.getTerritory())) { m_mapPanel.centerOn(placeMessage.getTerritory()); } } else if (details instanceof Collection) { final Collection<Object> objects = (Collection<Object>) details; final Iterator<Object> objIter = objects.iterator(); if (objIter.hasNext()) { final Object obj = objIter.next(); if (obj instanceof Unit) { final Collection<Unit> units = (Collection<Unit>) details; renderUnits(mainConstraints, units); } } } else if (details instanceof Territory) { final Territory t = (Territory) details; if (!m_mapPanel.isShowing(t)) { m_mapPanel.centerOn(t); } } } add(Box.createGlue()); validate(); repaint(); } private void renderUnits(final GridBagConstraints mainConstraints, final Collection<Unit> units) { final Collection<UnitCategory> unitsCategories = UnitSeperator.categorize(units); final SimpleUnitPanel unitsPanel = new SimpleUnitPanel(m_mapPanel.getUIContext()); unitsPanel.setUnitsFromCategories(unitsCategories, m_data); add(unitsPanel, mainConstraints); } }