package games.strategy.triplea.ui; import java.awt.Component; import java.awt.Dimension; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.Collection; import javax.swing.DefaultListCellRenderer; import javax.swing.ImageIcon; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.ListSelectionModel; import games.strategy.engine.data.PlayerID; import games.strategy.engine.data.PlayerList; import games.strategy.ui.SwingComponents; import games.strategy.ui.Util; public class PlayerChooser extends JOptionPane { private static final long serialVersionUID = -7272867474891641839L; private JList<PlayerID> m_list; private final PlayerList m_players; private final PlayerID m_defaultPlayer; private final IUIContext m_uiContext; private final boolean m_allowNeutral; // private JOptionPane m_pane; /** Creates new PlayerChooser. */ public PlayerChooser(final PlayerList players, final IUIContext uiContext, final boolean allowNeutral) { this(players, null, uiContext, allowNeutral); } /** Creates new PlayerChooser. */ public PlayerChooser(final PlayerList players, final PlayerID defaultPlayer, final IUIContext uiContext, final boolean allowNeutral) { setMessageType(JOptionPane.PLAIN_MESSAGE); setOptionType(JOptionPane.OK_CANCEL_OPTION); setIcon(null); m_players = players; m_defaultPlayer = defaultPlayer; m_uiContext = uiContext; m_allowNeutral = allowNeutral; createComponents(); } private void createComponents() { final Collection<PlayerID> players = new ArrayList<>(m_players.getPlayers()); if (m_allowNeutral) { players.add(PlayerID.NULL_PLAYERID); } m_list = new JList<>(players.toArray(new PlayerID[players.size()])); m_list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); m_list.setSelectedValue(m_defaultPlayer, true); m_list.setFocusable(false); m_list.setCellRenderer(new PlayerChooserRenderer(m_uiContext)); m_list.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(final MouseEvent evt) { if (evt.getClickCount() == 2) { // set OK_OPTION on DoubleClick, this fires a property change which causes the dialog to close() setValue(OK_OPTION); } } }); setMessage(SwingComponents.newJScrollPane(m_list)); final int maxSize = 700; final int suggestedSize = m_players.size() * 40; final int actualSize = suggestedSize > maxSize ? maxSize : suggestedSize; setPreferredSize(new Dimension(300, actualSize)); } /** * Returns the selected player or null, or null if the dialog was closed. * * @return the player or null */ public PlayerID getSelected() { if (getValue() != null && getValue().equals(JOptionPane.OK_OPTION)) { return m_list.getSelectedValue(); } return null; } } class PlayerChooserRenderer extends DefaultListCellRenderer { private static final long serialVersionUID = -2185921124436293304L; private final IUIContext m_uiContext; PlayerChooserRenderer(final IUIContext uiContext) { m_uiContext = uiContext; } @Override public Component getListCellRendererComponent(final JList<?> list, final Object value, final int index, final boolean isSelected, final boolean cellHasFocus) { super.getListCellRendererComponent(list, ((PlayerID) value).getName(), index, isSelected, cellHasFocus); if (m_uiContext == null || value == PlayerID.NULL_PLAYERID) { setIcon(new ImageIcon(Util.createImage(32, 32, true))); } else { setIcon(new ImageIcon(m_uiContext.getFlagImageFactory().getFlag((PlayerID) value))); } return this; } }