Added player type selection to the settings panel

git-svn-id: svn://sunsvr01.isp.uni-luebeck.de/swproj13/trunk@315 72836036-5685-4462-b002-a69064685172
This commit is contained in:
Jannis Harder 2011-05-29 21:49:03 +02:00
parent 08e9b28f3b
commit 43ace4c18a
4 changed files with 155 additions and 88 deletions

View file

@ -6,6 +6,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
import jrummikub.control.turn.ITurnControl; import jrummikub.control.turn.ITurnControl;
import jrummikub.control.turn.TurnControlFactory;
import jrummikub.model.Hand; import jrummikub.model.Hand;
import jrummikub.model.IHand; import jrummikub.model.IHand;
import jrummikub.model.IPlayer; import jrummikub.model.IPlayer;
@ -94,8 +95,8 @@ public class RoundControl {
view.getPlayerPanel().setEndTurnMode(inspectOnly, mayRedeal); view.getPlayerPanel().setEndTurnMode(inspectOnly, mayRedeal);
ITurnControl turnControl = roundState.getActivePlayer() ITurnControl turnControl = TurnControlFactory.getFactory(roundState.getActivePlayer()
.getPlayerSettings().getTurnControlFactory().create(); .getPlayerSettings().getTurnControlType()).create();
turnControl.setup(roundState.getActivePlayer().getHand(), clonedTable, turnControl.setup(roundState.getActivePlayer().getHand(), clonedTable,
view, inspectOnly, mayRedeal); view, inspectOnly, mayRedeal);
turnControl.getEndOfTurnEvent().add(new IListener() { turnControl.getEndOfTurnEvent().add(new IListener() {

View file

@ -4,6 +4,26 @@ import jrummikub.model.IHand;
import jrummikub.model.ITable; import jrummikub.model.ITable;
import jrummikub.view.IView; import jrummikub.view.IView;
public interface TurnControlFactory { public abstract class TurnControlFactory {
public ITurnControl create(); /**
* Type of turn control.
*/
public enum Type {
/** */
HUMAN,
/** */
COMPUTER
};
public abstract ITurnControl create();
static public TurnControlFactory getFactory(Type type) {
switch(type) {
case HUMAN:
return HumanTurnControl.getFactory();
case COMPUTER:
return BaseAIControl.getFactory();
}
return null;
}
} }

View file

@ -2,7 +2,6 @@ package jrummikub.model;
import java.awt.Color; import java.awt.Color;
import jrummikub.control.turn.HumanTurnControl;
import jrummikub.control.turn.TurnControlFactory; import jrummikub.control.turn.TurnControlFactory;
/** /**
@ -11,7 +10,7 @@ import jrummikub.control.turn.TurnControlFactory;
public class PlayerSettings { public class PlayerSettings {
private String name; private String name;
private Color color; private Color color;
private TurnControlFactory turnControlFactory; private TurnControlFactory.Type turnControlType;
/** /**
* Create a new player * Create a new player
@ -27,7 +26,7 @@ public class PlayerSettings {
TurnControlFactory turnControlFactory) { TurnControlFactory turnControlFactory) {
this.name = name; this.name = name;
this.color = color; this.color = color;
this.turnControlFactory = turnControlFactory; this.turnControlType = TurnControlFactory.Type.HUMAN;
} }
/** /**
@ -41,7 +40,7 @@ public class PlayerSettings {
public PlayerSettings(String name, Color color) { public PlayerSettings(String name, Color color) {
this.name = name; this.name = name;
this.color = color; this.color = color;
this.turnControlFactory = HumanTurnControl.getFactory(); this.turnControlType = TurnControlFactory.Type.HUMAN;
} }
/** /**
@ -83,21 +82,21 @@ public class PlayerSettings {
} }
/** /**
* Set the player's TurnControlFactory * Set the player's TurnControlFactory type
* *
* @param turnControlFactory * @param turnControlType
* player's TurnControlFactory * player's TurnControlFactory type
*/ */
public void setTurnControlFactory(TurnControlFactory turnControlFactory) { public void setTurnControlType(TurnControlFactory.Type turnControlType) {
this.turnControlFactory = turnControlFactory; this.turnControlType = turnControlType;
} }
/** /**
* Get the player's TurnControlFactory * Get the player's TurnControlFactory type
* *
* @return player's TurnControlFactory * @return player's TurnControlFactory type
*/ */
public TurnControlFactory getTurnControlFactory() { public TurnControlFactory.Type getTurnControlType() {
return turnControlFactory; return turnControlType;
} }
} }

View file

@ -2,6 +2,7 @@ package jrummikub.view.impl;
import java.awt.BorderLayout; import java.awt.BorderLayout;
import java.awt.Color; import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.FlowLayout; import java.awt.FlowLayout;
import java.awt.Font; import java.awt.Font;
@ -14,12 +15,14 @@ import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter; import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import javax.swing.Box; import javax.swing.Box;
import javax.swing.BoxLayout; import javax.swing.BoxLayout;
import javax.swing.Icon; import javax.swing.Icon;
import javax.swing.JButton; import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent; import javax.swing.JComponent;
import javax.swing.JLabel; import javax.swing.JLabel;
import javax.swing.JPanel; import javax.swing.JPanel;
@ -37,6 +40,7 @@ import javax.swing.event.ChangeListener;
import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener; import javax.swing.event.DocumentListener;
import jrummikub.control.turn.TurnControlFactory;
import jrummikub.model.GameSettings; import jrummikub.model.GameSettings;
import jrummikub.model.PlayerSettings; import jrummikub.model.PlayerSettings;
import jrummikub.util.Event; import jrummikub.util.Event;
@ -67,6 +71,7 @@ class SettingsPanel extends JPanel implements ISettingsPanel {
private Event1<Integer> removePlayerEvent = new Event1<Integer>(); private Event1<Integer> removePlayerEvent = new Event1<Integer>();
private Event2<Integer, Color> changePlayerColorEvent = new Event2<Integer, Color>(); private Event2<Integer, Color> changePlayerColorEvent = new Event2<Integer, Color>();
private Event2<Integer, String> changePlayerNameEvent = new Event2<Integer, String>(); private Event2<Integer, String> changePlayerNameEvent = new Event2<Integer, String>();
private Event2<Integer, TurnControlFactory.Type> changePlayerTypeEvent = new Event2<Integer, TurnControlFactory.Type>();
private Event1<Integer> changeInitialMeldThresholdEvent = new Event1<Integer>(); private Event1<Integer> changeInitialMeldThresholdEvent = new Event1<Integer>();
private Event1<Integer> changeJokerNumberEvent = new Event1<Integer>(); private Event1<Integer> changeJokerNumberEvent = new Event1<Integer>();
@ -208,62 +213,57 @@ class SettingsPanel extends JPanel implements ISettingsPanel {
GridBagLayout layout = new GridBagLayout(); GridBagLayout layout = new GridBagLayout();
optionsPanel.setLayout(layout); optionsPanel.setLayout(layout);
GridBagConstraints labelC = new GridBagConstraints(); makeOptionLabel(0, "Auslegeschranke:");
GridBagConstraints optionC = new GridBagConstraints(); initialMeldThresholdSpinner = makeOptionSpinner(0, 1, 999, 1,
changeInitialMeldThresholdEvent);
labelC.anchor = GridBagConstraints.EAST; makeOptionLabel(1, "Jokeranzahl:");
labelC.gridx = 0; jokerNumberSpinner = makeOptionSpinner(1, 1, 999, 1,
labelC.insets = new Insets(4, 4, 4, 4); changeJokerNumberEvent);
optionC.anchor = GridBagConstraints.WEST;
optionC.gridx = 1;
optionC.insets = new Insets(2, 2, 2, 2);
JLabel label = new JLabel("Auslegeschranke:"); GridBagConstraints c = new GridBagConstraints();
labelC.gridy = 0; c.gridx = 1;
optionsPanel.add(label, labelC); c.gridy = 2;
c.fill = GridBagConstraints.BOTH;
initialMeldThresholdSpinner = new JSpinner(); c.weightx = 1;
initialMeldThresholdSpinner.setModel(new SpinnerNumberModel(1, 1, 999, c.weighty = 1;
1)); optionsPanel.add(makeFiller(), c);
initialMeldThresholdSpinner.setPreferredSize(new Dimension(60,
initialMeldThresholdSpinner.getMinimumSize().height));
initialMeldThresholdSpinner.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
changeInitialMeldThresholdEvent
.emit((Integer) initialMeldThresholdSpinner.getValue());
}
});
optionC.gridy = 0;
optionsPanel.add(initialMeldThresholdSpinner, optionC);
label = new JLabel("Jokeranzahl:");
labelC.gridx = 0;
labelC.gridy = 1;
optionsPanel.add(label, labelC);
jokerNumberSpinner = new JSpinner();
jokerNumberSpinner.setModel(new SpinnerNumberModel(0, 0, 999, 1));
jokerNumberSpinner.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
changeJokerNumberEvent.emit((Integer) jokerNumberSpinner
.getValue());
}
});
optionC.gridy = 1;
optionsPanel.add(jokerNumberSpinner, optionC);
labelC.gridx = 1;
labelC.gridy = 2;
labelC.fill = GridBagConstraints.BOTH;
labelC.weightx = 1;
labelC.weighty = 1;
optionsPanel.add(makeFiller(), labelC);
// TODO Knöpfe für Dinge // TODO Knöpfe für Dinge
} }
private JSpinner makeOptionSpinner(int row, int min, int max, int step,
final Event1<Integer> targetEvent) {
GridBagConstraints c = new GridBagConstraints();
c.anchor = GridBagConstraints.WEST;
c.gridx = 1;
c.gridy = row;
c.insets = new Insets(2, 2, 2, 2);
final JSpinner spinner = new JSpinner();
spinner.setModel(new SpinnerNumberModel(min, min, max, step));
spinner.setPreferredSize(new Dimension(60,
spinner.getMinimumSize().height));
spinner.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
targetEvent.emit((Integer) spinner.getValue());
}
});
optionsPanel.add(spinner, c);
return spinner;
}
private void makeOptionLabel(int row, String name) {
GridBagConstraints c = new GridBagConstraints();
c.anchor = GridBagConstraints.EAST;
c.gridx = 0;
c.gridy = row;
c.insets = new Insets(4, 4, 4, 4);
JLabel label = new JLabel(name);
optionsPanel.add(label, c);
}
SettingsPanel() { SettingsPanel() {
setLayout(new GridBagLayout()); setLayout(new GridBagLayout());
@ -305,11 +305,16 @@ class SettingsPanel extends JPanel implements ISettingsPanel {
private JButton colorButton; private JButton colorButton;
private JTextField nameField; private JTextField nameField;
private JButton removeButton; private JButton removeButton;
private JComboBox playerType;
public void setSettings(PlayerSettings settings) { public void setSettings(PlayerSettings settings) {
if (!nameField.getText().equals(settings.getName())) { if (!nameField.getText().equals(settings.getName())) {
nameField.setText(settings.getName()); nameField.setText(settings.getName());
} }
// playerType.setSelectedIndex(0);
playerType.setSelectedIndex(Arrays.binarySearch(
TurnControlFactory.Type.values(),
settings.getTurnControlType()));
colorButton.setIcon(ImageUtil.createColorIcon(settings.getColor(), colorButton.setIcon(ImageUtil.createColorIcon(settings.getColor(),
16, 2)); 16, 2));
@ -319,15 +324,37 @@ class SettingsPanel extends JPanel implements ISettingsPanel {
removeButton.setEnabled(enable); removeButton.setEnabled(enable);
} }
class NameChangeListener implements DocumentListener {
@Override
public void insertUpdate(DocumentEvent e) {
changeName();
}
@Override
public void removeUpdate(DocumentEvent e) {
changeName();
}
@Override
public void changedUpdate(DocumentEvent e) {
changeName();
}
}
public PlayerSettingsPanel(int playerNumber, PlayerSettings settings) { public PlayerSettingsPanel(int playerNumber, PlayerSettings settings) {
setLayout(new BorderLayout()); setLayout(new GridBagLayout());
this.playerNumber = playerNumber; this.playerNumber = playerNumber;
createControls(settings);
colorButton = new JButton();
nameField = new JTextField(settings.getName());
setSettings(settings); setSettings(settings);
}
private void createControls(PlayerSettings settings) {
GridBagConstraints c = new GridBagConstraints();
GridBagConstraints c2 = new GridBagConstraints();
colorButton = new JButton();
nameField = new JTextField(settings.getName());
colorButton.addActionListener(new ActionListener() { colorButton.addActionListener(new ActionListener() {
@Override @Override
@ -335,25 +362,26 @@ class SettingsPanel extends JPanel implements ISettingsPanel {
new ColorMenu(); new ColorMenu();
} }
}); });
add(colorButton, BorderLayout.WEST); c.gridy = 0;
add(colorButton, c);
nameField.getDocument().addDocumentListener(new DocumentListener() { nameField.getDocument().addDocumentListener(
@Override new NameChangeListener());
public void insertUpdate(DocumentEvent e) { c2.gridy = 0;
changeName(); c2.weightx = 1;
} c2.fill = GridBagConstraints.HORIZONTAL;
add(nameField, c2);
@Override String[] choices = { "Mensch", "Computer" };
public void removeUpdate(DocumentEvent e) {
changeName();
}
playerType = new JComboBox(choices);
playerType.addActionListener(new ActionListener() {
@Override @Override
public void changedUpdate(DocumentEvent e) { public void actionPerformed(ActionEvent e) {
changeName(); changeType();
} }
}); });
add(nameField); add(playerType, c);
removeButton = new JButton("\u00d7"); removeButton = new JButton("\u00d7");
removeButton.setFont(removeButton.getFont().deriveFont(Font.BOLD)); removeButton.setFont(removeButton.getFont().deriveFont(Font.BOLD));
@ -364,17 +392,31 @@ class SettingsPanel extends JPanel implements ISettingsPanel {
} }
}); });
removeButton.setEnabled(removeButtonsEnabled); removeButton.setEnabled(removeButtonsEnabled);
add(removeButton, BorderLayout.EAST); add(removeButton, c);
} }
@Override @Override
public Dimension getPreferredSize() { public Dimension getPreferredSize() {
return getComponent(1).getPreferredSize(); Dimension preferredSize = super.getPreferredSize();
for (Component component : this.getComponents()) {
preferredSize.setSize(
preferredSize.width,
Math.max(preferredSize.height,
component.getPreferredSize().height));
}
return preferredSize;
} }
@Override @Override
public Dimension getMaximumSize() { public Dimension getMaximumSize() {
return new Dimension(Integer.MAX_VALUE, getPreferredSize().height); Dimension preferredSize = super.getPreferredSize();
for (Component component : this.getComponents()) {
preferredSize.setSize(
Integer.MAX_VALUE,
Math.max(preferredSize.height,
component.getPreferredSize().height));
}
return preferredSize;
} }
private void changeName() { private void changeName() {
@ -385,6 +427,11 @@ class SettingsPanel extends JPanel implements ISettingsPanel {
changePlayerColorEvent.emit(playerNumber, c); changePlayerColorEvent.emit(playerNumber, c);
} }
private void changeType() {
changePlayerTypeEvent.emit(playerNumber, TurnControlFactory.Type
.values()[playerType.getSelectedIndex()]);
}
private void remove() { private void remove() {
removePlayerEvent.emit(playerNumber); removePlayerEvent.emit(playerNumber);
} }