package games.strategy.triplea.ui; import java.awt.Dimension; import java.util.List; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.ScrollPaneConstants; import javax.swing.SwingUtilities; import games.strategy.engine.data.GameData; import games.strategy.triplea.delegate.DiceRoll; import games.strategy.triplea.delegate.Die; public class DicePanel extends JPanel { private static final long serialVersionUID = -7544999867518263506L; private final IUIContext m_uiContext; private final GameData m_data; public DicePanel(final IUIContext uiContext, final GameData data) { m_uiContext = uiContext; m_data = data; setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); } public void clear() { removeAll(); } public void setDiceRollForBombing(final List<Die> dice, final int cost) { removeAll(); add(create(dice)); add(Box.createVerticalGlue()); add(new JLabel("Cost:" + cost)); invalidate(); } public void setDiceRoll(final DiceRoll diceRoll) { if (!SwingUtilities.isEventDispatchThread()) { SwingUtilities.invokeLater(() -> setDiceRoll(diceRoll)); return; } removeAll(); for (int i = 1; i <= m_data.getDiceSides(); i++) { final List<Die> dice = diceRoll.getRolls(i); if (dice.isEmpty()) { continue; } add(new JLabel("Rolled at " + (i) + ":")); add(create(diceRoll.getRolls(i))); } add(Box.createVerticalGlue()); add(new JLabel("Total hits:" + diceRoll.getHits())); validate(); invalidate(); repaint(); } private JComponent create(final List<Die> dice) { final JPanel dicePanel = new JPanel(); dicePanel.setLayout(new BoxLayout(dicePanel, BoxLayout.X_AXIS)); dicePanel.add(Box.createHorizontalStrut(20)); for (final Die die : dice) { final int roll = die.getValue() + 1; dicePanel.add(new JLabel(m_uiContext.getDiceImageFactory().getDieIcon(roll, die.getType()))); dicePanel.add(Box.createHorizontalStrut(2)); } final JScrollPane scroll = new JScrollPane(dicePanel); scroll.setBorder(null); scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER); // we're adding to a box layout, so to prevent the component from // grabbing extra space, set the max height. // allow room for a dice and a scrollbar scroll.setMinimumSize( new Dimension(scroll.getMinimumSize().width, m_uiContext.getDiceImageFactory().DIE_HEIGHT + 17)); scroll.setMaximumSize( new Dimension(scroll.getMaximumSize().width, m_uiContext.getDiceImageFactory().DIE_HEIGHT + 17)); scroll.setPreferredSize( new Dimension(scroll.getPreferredSize().width, m_uiContext.getDiceImageFactory().DIE_HEIGHT + 17)); return scroll; } }