From 570187c95000afd1ac9f6d6e8bb5cab30b984e87 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Mon, 13 Jun 2011 22:29:28 +0200 Subject: Implemented most of network settings control git-svn-id: svn://sunsvr01.isp.uni-luebeck.de/swproj13/trunk@425 72836036-5685-4462-b002-a69064685172 --- src/jrummikub/view/impl/SettingsPanel.java | 198 +++++++++++++++++------------ 1 file changed, 114 insertions(+), 84 deletions(-) (limited to 'src/jrummikub/view/impl/SettingsPanel.java') diff --git a/src/jrummikub/view/impl/SettingsPanel.java b/src/jrummikub/view/impl/SettingsPanel.java index 0292d2c..1d3e1b5 100644 --- a/src/jrummikub/view/impl/SettingsPanel.java +++ b/src/jrummikub/view/impl/SettingsPanel.java @@ -16,10 +16,10 @@ import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; @@ -60,12 +60,13 @@ import jrummikub.util.Event2; import jrummikub.util.IEvent; import jrummikub.util.IEvent1; import jrummikub.util.IEvent2; -import jrummikub.util.Pair; import jrummikub.view.ISettingsPanel; @SuppressWarnings("serial") class SettingsPanel extends JPanel implements ISettingsPanel { - private List> playerTypeChoices = new ArrayList>(); + private List> playerTypeChoices = Collections.emptyList(); + private List removeButtonsEnabled = Collections.emptyList(); + private List playerNamesEditable = Collections.emptyList(); private JTabbedPane tabbedPane; private JPanel playerSetupPanel; @@ -74,8 +75,8 @@ class SettingsPanel extends JPanel implements ISettingsPanel { private JButton addPlayerButton; private JLabel errorMessageLabel; private JButton startButton; + private JButton offerButton; - private boolean removeButtonsEnabled = true; private List playerSettingsPanels = new ArrayList(); private JButton setVariantDefaultButton; @@ -98,6 +99,8 @@ class SettingsPanel extends JPanel implements ISettingsPanel { private Event startGameEvent = new Event(); private Event loadGameEvent = new Event(); private Event networkGameEvent = new Event(); + private Event offerGameEvent = new Event(); + private Event backEvent = new Event(); private Event addPlayerEvent = new Event(); private Event1 removePlayerEvent = new Event1(); private Event2 changePlayerColorEvent = new Event2(); @@ -113,13 +116,17 @@ class SettingsPanel extends JPanel implements ISettingsPanel { private Event1 changeNoLimitsEvent = new Event1(); private Event setVariantDefaultEvent = new Event(); private Event setVariantChildrenEvent = new Event(); - private Event backEvent = new Event(); @Override public IEvent getStartGameEvent() { return startGameEvent; } + @Override + public IEvent getOfferGameEvent() { + return offerGameEvent; + } + IEvent getLoadGameEvent() { return loadGameEvent; } @@ -216,37 +223,37 @@ class SettingsPanel extends JPanel implements ISettingsPanel { @Override public void setError(SettingsError error) { switch (error) { - case NO_ERROR: - errorMessageLabel.setText(" "); - break; - case DUPLICATE_PLAYER_NAME_ERROR: - errorMessageLabel - .setText("Jeder Spielername darf nur einmal verwendet werden."); - errorMessageLabel.setForeground(Color.RED); - break; - case NO_PLAYER_NAME_ERROR: - errorMessageLabel.setText("Jeder Spieler muss einen Namen haben."); - errorMessageLabel.setForeground(Color.RED); - break; - case NOT_ENOUGH_STONES_ERROR: - errorMessageLabel - .setText("Es gibt nicht genug Steine f\u00fcr die gew\u00e4hlte Spieleranzahl."); - errorMessageLabel.setForeground(Color.RED); - break; - case NOT_ENOUGH_COLORS_ERROR: - errorMessageLabel - .setText("Es m\u00fcssen mindestens drei Farben ausgew\u00e4hlt werden."); - errorMessageLabel.setForeground(Color.RED); - break; - case COMPUTER_PLAYERS_ONLY_WARNING: - errorMessageLabel.setText("Es gibt keinen menschlichen Spieler."); - errorMessageLabel.setForeground(Color.ORANGE.darker()); - break; - case TOO_HIGH_THRESHOLD_WARNING: - errorMessageLabel - .setText("Die gew\u00e4hlte Schranke ist m\u00f6glicherweise zu hoch"); - errorMessageLabel.setForeground(Color.ORANGE.darker()); - break; + case NO_ERROR: + errorMessageLabel.setText(" "); + break; + case DUPLICATE_PLAYER_NAME_ERROR: + errorMessageLabel + .setText("Jeder Spielername darf nur einmal verwendet werden."); + errorMessageLabel.setForeground(Color.RED); + break; + case NO_PLAYER_NAME_ERROR: + errorMessageLabel.setText("Jeder Spieler muss einen Namen haben."); + errorMessageLabel.setForeground(Color.RED); + break; + case NOT_ENOUGH_STONES_ERROR: + errorMessageLabel + .setText("Es gibt nicht genug Steine f\u00fcr die gew\u00e4hlte Spieleranzahl."); + errorMessageLabel.setForeground(Color.RED); + break; + case NOT_ENOUGH_COLORS_ERROR: + errorMessageLabel + .setText("Es m\u00fcssen mindestens drei Farben ausgew\u00e4hlt werden."); + errorMessageLabel.setForeground(Color.RED); + break; + case COMPUTER_PLAYERS_ONLY_WARNING: + errorMessageLabel.setText("Es gibt keinen menschlichen Spieler."); + errorMessageLabel.setForeground(Color.ORANGE.darker()); + break; + case TOO_HIGH_THRESHOLD_WARNING: + errorMessageLabel + .setText("Die gew\u00e4hlte Schranke ist m\u00f6glicherweise zu hoch"); + errorMessageLabel.setForeground(Color.ORANGE.darker()); + break; } } @@ -262,17 +269,35 @@ class SettingsPanel extends JPanel implements ISettingsPanel { } @Override - public void enableRemovePlayerButtons(boolean enable) { + public void enableRemovePlayerButtons(List enable) { removeButtonsEnabled = enable; + Iterator it = enable.iterator(); + for (PlayerSettingsPanel psp : playerSettingsPanels) { + if (!it.hasNext()) { + psp.enableRemoveButton(false); + } else { + psp.enableRemoveButton(it.next()); + } + } + } + + @Override + public void setPlayerNamesEditable(List editable) { + playerNamesEditable = editable; + + Iterator it = editable.iterator(); for (PlayerSettingsPanel psp : playerSettingsPanels) { - psp.enableRemoveButton(enable); + if (!it.hasNext()) { + psp.setPlayerNameEditable(true); + } else { + psp.setPlayerNameEditable(it.next()); + } } } @Override public void setGameSettings(GameSettings gameSettings) { - while (playerSettingsPanels.size() > gameSettings.getPlayerList() - .size()) { + while (playerSettingsPanels.size() > gameSettings.getPlayerList().size()) { removePlayerSettingsPanel(); } @@ -281,16 +306,14 @@ class SettingsPanel extends JPanel implements ISettingsPanel { if (i < playerTypeChoices.size()) { choices = playerTypeChoices.get(i); } - updatePlayerSettingsPanel(i, gameSettings.getPlayerList().get(i), - choices); + updatePlayerSettingsPanel(i, gameSettings.getPlayerList().get(i), choices); } - initialMeldThresholdSpinner.setValue(gameSettings - .getInitialMeldThreshold()); + initialMeldThresholdSpinner + .setValue(gameSettings.getInitialMeldThreshold()); stoneSetNumberSpinner.setValue(gameSettings.getStoneSetNumber()); highestValueSpinner.setValue(gameSettings.getHighestValue()); - numberOfStonesDealtSpinner.setValue(gameSettings - .getNumberOfStonesDealt()); + numberOfStonesDealtSpinner.setValue(gameSettings.getNumberOfStonesDealt()); jokerNumberSpinner.setValue(gameSettings.getJokerNumber()); timeSpinner.setValue(gameSettings.getTotalTime()); noLimitsBox.setSelected(gameSettings.isNoLimits()); @@ -315,16 +338,17 @@ class SettingsPanel extends JPanel implements ISettingsPanel { private void addPlayerSettingsPanel(int i, PlayerSettings settings, List choices) { - PlayerSettingsPanel panel = new PlayerSettingsPanel(i, settings, - choices); + PlayerSettingsPanel panel = new PlayerSettingsPanel(i, settings, choices); playerSettingsPanels.add(panel); playerSettingsViewport.add(panel, playerSettingsViewport.getComponentCount() - 1); + enableRemovePlayerButtons(removeButtonsEnabled); + setPlayerNamesEditable(playerNamesEditable); } private void removePlayerSettingsPanel() { - PlayerSettingsPanel p = playerSettingsPanels - .remove(playerSettingsPanels.size() - 1); + PlayerSettingsPanel p = playerSettingsPanels.remove(playerSettingsPanels + .size() - 1); playerSettingsViewport.remove(p); } @@ -346,8 +370,7 @@ class SettingsPanel extends JPanel implements ISettingsPanel { playerSettingsViewport.add(addPlayerPanel); addPlayerButton = new JButton("+"); - addPlayerButton - .setFont(addPlayerButton.getFont().deriveFont(Font.BOLD)); + addPlayerButton.setFont(addPlayerButton.getFont().deriveFont(Font.BOLD)); addPlayerButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -512,8 +535,8 @@ class SettingsPanel extends JPanel implements ISettingsPanel { 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 + .setPreferredSize(new Dimension(60, spinner.getMinimumSize().height)); spinner.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { @@ -535,7 +558,6 @@ class SettingsPanel extends JPanel implements ISettingsPanel { optionsPanel.add(label, c); } - // TODO wiederfinden SettingsPanel() { setLayout(new GridBagLayout()); @@ -566,15 +588,16 @@ class SettingsPanel extends JPanel implements ISettingsPanel { add(buttonPanel, c); startButton = createButton("Spiel starten", startGameEvent); - loadButton = createButton("Spiel laden...", loadGameEvent); networkButton = createButton("Netzwerkspiel...", networkGameEvent); + + offerButton = createButton("Spiel anbieten", offerGameEvent); backButton = createButton("Zur\u00fcck", backEvent); addDefaultButtons(); - setBorder(new CompoundBorder(new LineBorder(Color.BLACK), - new EmptyBorder(10, 10, 10, 10))); + setBorder(new CompoundBorder(new LineBorder(Color.BLACK), new EmptyBorder( + 10, 10, 10, 10))); } void resetTabbedPane() { @@ -609,7 +632,7 @@ class SettingsPanel extends JPanel implements ISettingsPanel { c.weightx = 1; c.weighty = 1; - buttonPanel.add(startButton, c); + buttonPanel.add(offerButton, c); c.weightx = 0; buttonPanel.add(Box.createHorizontalStrut(10), c); c.weightx = 1; @@ -643,19 +666,23 @@ class SettingsPanel extends JPanel implements ISettingsPanel { private JTextField nameField; private JButton removeButton; private JComboBox playerType; + private List playerTypeChoices; public void setSettings(PlayerSettings settings) { if (!nameField.getText().equals(settings.getName())) { nameField.setText(settings.getName()); } - // playerType.setSelectedIndex(0); - int index = Arrays.binarySearch(Type.values(), - settings.getTurnControlType()); - if (index != playerType.getSelectedIndex()) { + int index = playerTypeChoices.indexOf(settings.getType()); + if (index != playerType.getSelectedIndex() && index >= 0 + && index < playerType.getModel().getSize()) { playerType.setSelectedIndex(index); } - colorButton.setIcon(ImageUtil.createColorIcon(settings.getColor(), - 16, 2)); + colorButton + .setIcon(ImageUtil.createColorIcon(settings.getColor(), 16, 2)); + } + + public void setPlayerNameEditable(boolean editable) { + nameField.setEditable(editable); } public void enableRemoveButton(boolean enable) { @@ -691,18 +718,20 @@ class SettingsPanel extends JPanel implements ISettingsPanel { } public void setChoices(List playerTypeChoices) { + this.playerTypeChoices = playerTypeChoices; + Vector choices = new Vector(); for (Type t : playerTypeChoices) { switch (t) { - case COMPUTER: - choices.add("Computer"); - break; - case HUMAN: - choices.add("Mensch"); - break; - case NETWORK: - choices.add("Netzwerk"); - break; + case COMPUTER: + choices.add("Computer"); + break; + case HUMAN: + choices.add("Mensch"); + break; + case NETWORK: + choices.add("Netzwerk"); + break; } } playerType.setModel(new DefaultComboBoxModel(choices)); @@ -723,8 +752,7 @@ class SettingsPanel extends JPanel implements ISettingsPanel { c.gridy = 0; add(colorButton, c); - nameField.getDocument().addDocumentListener( - new NameChangeListener()); + nameField.getDocument().addDocumentListener(new NameChangeListener()); c2.gridy = 0; c2.weightx = 1; c2.fill = GridBagConstraints.HORIZONTAL; @@ -737,6 +765,10 @@ class SettingsPanel extends JPanel implements ISettingsPanel { changeType(); } }); + playerType.setPreferredSize(new Dimension(120, playerType + .getPreferredSize().height)); + playerType.setMinimumSize(new Dimension(120, + playerType.getMinimumSize().height)); add(playerType, c); removeButton = new JButton("\u00d7"); @@ -747,7 +779,7 @@ class SettingsPanel extends JPanel implements ISettingsPanel { remove(); } }); - removeButton.setEnabled(removeButtonsEnabled); + add(removeButton, c); } @@ -755,9 +787,8 @@ class SettingsPanel extends JPanel implements ISettingsPanel { public Dimension getPreferredSize() { Dimension preferredSize = super.getPreferredSize(); for (Component component : this.getComponents()) { - preferredSize.setSize( - preferredSize.width, - Math.max(preferredSize.height, + preferredSize + .setSize(preferredSize.width, Math.max(preferredSize.height, component.getPreferredSize().height)); } return preferredSize; @@ -767,9 +798,8 @@ class SettingsPanel extends JPanel implements ISettingsPanel { public Dimension getMaximumSize() { Dimension preferredSize = super.getPreferredSize(); for (Component component : this.getComponents()) { - preferredSize.setSize( - Integer.MAX_VALUE, - Math.max(preferredSize.height, + preferredSize + .setSize(Integer.MAX_VALUE, Math.max(preferredSize.height, component.getPreferredSize().height)); } return preferredSize; @@ -785,7 +815,7 @@ class SettingsPanel extends JPanel implements ISettingsPanel { private void changeType() { changePlayerTypeEvent.emit(playerNumber, - Type.values()[playerType.getSelectedIndex()]); + playerTypeChoices.get(playerType.getSelectedIndex())); } private void remove() { -- cgit v1.2.3