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:
parent
08e9b28f3b
commit
43ace4c18a
4 changed files with 155 additions and 88 deletions
|
@ -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() {
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue