diff options
-rw-r--r-- | src/jrummikub/view/impl/SettingsPanel.java | 165 |
1 files changed, 148 insertions, 17 deletions
diff --git a/src/jrummikub/view/impl/SettingsPanel.java b/src/jrummikub/view/impl/SettingsPanel.java index fa00a0a..9164942 100644 --- a/src/jrummikub/view/impl/SettingsPanel.java +++ b/src/jrummikub/view/impl/SettingsPanel.java @@ -7,14 +7,19 @@ import java.awt.FlowLayout; import java.awt.Font; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; +import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; import java.util.LinkedList; import javax.swing.BoxLayout; +import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; +import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.JTextField; @@ -32,6 +37,24 @@ import jrummikub.view.ISettingsPanel; @SuppressWarnings("serial") class SettingsPanel extends JPanel implements ISettingsPanel { + private final static Color[] PLAYER_COLORS = { new Color(1.0f, 0, 0), // red + new Color(0, 1.0f, 0), // lime + new Color(1.0f, 1.0f, 0), // yellow + new Color(0, 0, 1.0f), // blue + new Color(1.0f, 0, 1.0f), // fuchsia + new Color(0, 1.0f, 1.0f), // aqua + new Color(0.5f, 0, 0), // maroon + new Color(0, 0.5f, 0), // green + new Color(0.5f, 0.5f, 0), // olive + new Color(0, 0, 0.5f), // navy + new Color(0.5f, 0, 0.5f), // purple + new Color(0, 0.5f, 0.5f), // teal + new Color(0, 0, 0), // black + new Color(0.5f, 0.5f, 0.5f), // gray + new Color(0.75f, 0.75f, 0.75f), // silver + new Color(1.0f, 1.0f, 1.0f), // white + }; + private JPanel playerSetupPanel; private JPanel playerSettingsViewport; private JPanel ruleSetupPanel; @@ -54,7 +77,34 @@ class SettingsPanel extends JPanel implements ISettingsPanel { } private void addPlayerSettings() { - PlayerSettingsPanel panel = new PlayerSettingsPanel(); + // Find unused player name + int num = playerSettingsPanels.size(); + + nameLoop: while (true) { + num++; + String playerName = "Spieler " + num; + + for (PlayerSettings player : gameSettings.getPlayerList()) { + if (playerName.equals(player.getName())) { + continue nameLoop; + } + } + break; + } + + // Next, find unused color + Color color = null; + colorLoop: for (Color c : PLAYER_COLORS) { + color = c; + for (PlayerSettings player : gameSettings.getPlayerList()) { + if (c == player.getColor()) { + continue colorLoop; + } + } + break; + } + + PlayerSettingsPanel panel = new PlayerSettingsPanel("Spieler " + num, color); playerSettingsPanels.add(panel); playerSettingsViewport.add(panel, playerSettingsViewport.getComponentCount() - 1); @@ -135,7 +185,10 @@ class SettingsPanel extends JPanel implements ISettingsPanel { } private class PlayerSettingsPanel extends JPanel { - private PlayerSettings settings = new PlayerSettings("Player", Color.RED); + private JTextField nameField; + private JButton colorButton; + + private PlayerSettings settings; private void remove() { playerSettingsPanels.remove(PlayerSettingsPanel.this); @@ -146,35 +199,70 @@ class SettingsPanel extends JPanel implements ISettingsPanel { settingsChangeEvent.emit(gameSettings); } - PlayerSettingsPanel() { - setLayout(new BorderLayout()); + private void updateColor() { + colorButton + .setIcon(ImageUtil.createColorIcon(settings.getColor(), 16, 2)); + } - add(new JButton(ImageUtil.createColorIcon(settings.getColor(), 16, 2)), - BorderLayout.WEST); - final JTextField nameField = new JTextField(settings.getName()); - nameField.getDocument().addDocumentListener(new DocumentListener() { - private void update() { - if (nameField.getText() == settings.getName()) { - return; - } + private void setName() { + if (nameField.getText() == settings.getName()) { + return; + } - settings.setName(nameField.getText()); - settingsChangeEvent.emit(gameSettings); + settings.setName(nameField.getText()); + settingsChangeEvent.emit(gameSettings); + } + + private void setColor(Color c) { + if (c == settings.getColor()) { + return; + } + + // Exchange colors if the color is already used + for (PlayerSettingsPanel other : playerSettingsPanels) { + if (other.settings.getColor() == c) { + other.settings.setColor(settings.getColor()); + other.updateColor(); + break; } + } + + settings.setColor(c); + updateColor(); + settingsChangeEvent.emit(gameSettings); + } + + PlayerSettingsPanel(String name, Color color) { + settings = new PlayerSettings(name, color); + + setLayout(new BorderLayout()); + + colorButton = new JButton(); + updateColor(); + colorButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + new ColorMenu(); + } + }); + add(colorButton, BorderLayout.WEST); + + nameField = new JTextField(settings.getName()); + nameField.getDocument().addDocumentListener(new DocumentListener() { @Override public void insertUpdate(DocumentEvent e) { - update(); + setName(); } @Override public void removeUpdate(DocumentEvent e) { - update(); + setName(); } @Override public void changedUpdate(DocumentEvent e) { - update(); + setName(); } }); add(nameField); @@ -201,5 +289,48 @@ class SettingsPanel extends JPanel implements ISettingsPanel { public Dimension getMaximumSize() { return new Dimension(Integer.MAX_VALUE, getPreferredSize().height); } + + private class ColorMenu extends JPanel { + ColorMenu() { + setLayout(new GridLayout(4, 4, 1, 1)); + + JPopupMenu menu = new JPopupMenu(); + + for (Color c : PLAYER_COLORS) { + add(new ColorButton(c, menu)); + } + + menu.setLayout(new BorderLayout()); + menu.add(this); + menu.show(colorButton, 0, colorButton.getHeight()); + } + + private class ColorButton extends JLabel { + ColorButton(final Color c, final JPopupMenu menu) { + final Icon normalIcon = ImageUtil.createColorIcon(c, 16, 1); + final Icon hoverIcon = ImageUtil.createColorIcon(c, 16, 2); + + setIcon(normalIcon); + + addMouseListener(new MouseAdapter() { + @Override + public void mouseEntered(MouseEvent e) { + setIcon(hoverIcon); + } + + @Override + public void mouseExited(MouseEvent e) { + setIcon(normalIcon); + } + + @Override + public void mouseClicked(MouseEvent e) { + menu.setVisible(false); + setColor(c); + } + }); + } + } + } } } |