Implement color choosing and automatic color and name choice
git-svn-id: svn://sunsvr01.isp.uni-luebeck.de/swproj13/trunk@282 72836036-5685-4462-b002-a69064685172
This commit is contained in:
parent
04df1a24d8
commit
cff3180460
1 changed files with 148 additions and 17 deletions
|
@ -7,14 +7,19 @@ import java.awt.FlowLayout;
|
||||||
import java.awt.Font;
|
import java.awt.Font;
|
||||||
import java.awt.GridBagConstraints;
|
import java.awt.GridBagConstraints;
|
||||||
import java.awt.GridBagLayout;
|
import java.awt.GridBagLayout;
|
||||||
|
import java.awt.GridLayout;
|
||||||
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionEvent;
|
||||||
import java.awt.event.ActionListener;
|
import java.awt.event.ActionListener;
|
||||||
|
import java.awt.event.MouseAdapter;
|
||||||
|
import java.awt.event.MouseEvent;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
|
|
||||||
import javax.swing.BoxLayout;
|
import javax.swing.BoxLayout;
|
||||||
|
import javax.swing.Icon;
|
||||||
import javax.swing.JButton;
|
import javax.swing.JButton;
|
||||||
import javax.swing.JLabel;
|
import javax.swing.JLabel;
|
||||||
import javax.swing.JPanel;
|
import javax.swing.JPanel;
|
||||||
|
import javax.swing.JPopupMenu;
|
||||||
import javax.swing.JScrollPane;
|
import javax.swing.JScrollPane;
|
||||||
import javax.swing.JTabbedPane;
|
import javax.swing.JTabbedPane;
|
||||||
import javax.swing.JTextField;
|
import javax.swing.JTextField;
|
||||||
|
@ -32,6 +37,24 @@ import jrummikub.view.ISettingsPanel;
|
||||||
|
|
||||||
@SuppressWarnings("serial")
|
@SuppressWarnings("serial")
|
||||||
class SettingsPanel extends JPanel implements ISettingsPanel {
|
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 playerSetupPanel;
|
||||||
private JPanel playerSettingsViewport;
|
private JPanel playerSettingsViewport;
|
||||||
private JPanel ruleSetupPanel;
|
private JPanel ruleSetupPanel;
|
||||||
|
@ -54,7 +77,34 @@ class SettingsPanel extends JPanel implements ISettingsPanel {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addPlayerSettings() {
|
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);
|
playerSettingsPanels.add(panel);
|
||||||
playerSettingsViewport.add(panel,
|
playerSettingsViewport.add(panel,
|
||||||
playerSettingsViewport.getComponentCount() - 1);
|
playerSettingsViewport.getComponentCount() - 1);
|
||||||
|
@ -135,7 +185,10 @@ class SettingsPanel extends JPanel implements ISettingsPanel {
|
||||||
}
|
}
|
||||||
|
|
||||||
private class PlayerSettingsPanel extends JPanel {
|
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() {
|
private void remove() {
|
||||||
playerSettingsPanels.remove(PlayerSettingsPanel.this);
|
playerSettingsPanels.remove(PlayerSettingsPanel.this);
|
||||||
|
@ -146,14 +199,12 @@ class SettingsPanel extends JPanel implements ISettingsPanel {
|
||||||
settingsChangeEvent.emit(gameSettings);
|
settingsChangeEvent.emit(gameSettings);
|
||||||
}
|
}
|
||||||
|
|
||||||
PlayerSettingsPanel() {
|
private void updateColor() {
|
||||||
setLayout(new BorderLayout());
|
colorButton
|
||||||
|
.setIcon(ImageUtil.createColorIcon(settings.getColor(), 16, 2));
|
||||||
|
}
|
||||||
|
|
||||||
add(new JButton(ImageUtil.createColorIcon(settings.getColor(), 16, 2)),
|
private void setName() {
|
||||||
BorderLayout.WEST);
|
|
||||||
final JTextField nameField = new JTextField(settings.getName());
|
|
||||||
nameField.getDocument().addDocumentListener(new DocumentListener() {
|
|
||||||
private void update() {
|
|
||||||
if (nameField.getText() == settings.getName()) {
|
if (nameField.getText() == settings.getName()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -162,19 +213,56 @@ class SettingsPanel extends JPanel implements ISettingsPanel {
|
||||||
settingsChangeEvent.emit(gameSettings);
|
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
|
@Override
|
||||||
public void insertUpdate(DocumentEvent e) {
|
public void insertUpdate(DocumentEvent e) {
|
||||||
update();
|
setName();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void removeUpdate(DocumentEvent e) {
|
public void removeUpdate(DocumentEvent e) {
|
||||||
update();
|
setName();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void changedUpdate(DocumentEvent e) {
|
public void changedUpdate(DocumentEvent e) {
|
||||||
update();
|
setName();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
add(nameField);
|
add(nameField);
|
||||||
|
@ -201,5 +289,48 @@ class SettingsPanel extends JPanel implements ISettingsPanel {
|
||||||
public Dimension getMaximumSize() {
|
public Dimension getMaximumSize() {
|
||||||
return new Dimension(Integer.MAX_VALUE, getPreferredSize().height);
|
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);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue