package jrummikub.view.impl; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.LinkedList; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.JTextField; import javax.swing.border.CompoundBorder; import javax.swing.border.EmptyBorder; import javax.swing.border.LineBorder; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import jrummikub.model.GameSettings; import jrummikub.model.PlayerSettings; import jrummikub.util.Event1; import jrummikub.util.IEvent1; import jrummikub.view.ISettingsPanel; @SuppressWarnings("serial") class SettingsPanel extends JPanel implements ISettingsPanel { private JPanel playerSetupPanel; private JPanel playerSettingsViewport; private JPanel ruleSetupPanel; private GameSettings gameSettings = new GameSettings(); private LinkedList playerSettingsPanels = new LinkedList(); private Event1 settingsChangeEvent = new Event1(); private Event1 startGameEvent = new Event1(); @Override public IEvent1 getSettingsChangeEvent() { return settingsChangeEvent; } @Override public IEvent1 getStartGameEvent() { return startGameEvent; } private void addPlayerSettings() { PlayerSettingsPanel panel = new PlayerSettingsPanel(); playerSettingsPanels.add(panel); playerSettingsViewport.add(panel, playerSettingsViewport.getComponentCount() - 1); settingsChangeEvent.emit(gameSettings); } private void createPlayerSetupPanel() { playerSetupPanel = new JPanel(); playerSetupPanel.setLayout(new BorderLayout()); playerSettingsViewport = new JPanel(); playerSettingsViewport.setLayout(new BoxLayout(playerSettingsViewport, BoxLayout.Y_AXIS)); JScrollPane scrollPane = new JScrollPane(playerSettingsViewport, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); playerSetupPanel.add(scrollPane); JPanel addPlayerPanel = new JPanel(); addPlayerPanel.setLayout(new FlowLayout(FlowLayout.TRAILING, 0, 2)); playerSettingsViewport.add(addPlayerPanel); JButton addPlayerButton = new JButton("+"); addPlayerButton.setFont(addPlayerButton.getFont().deriveFont(Font.BOLD)); addPlayerButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { addPlayerSettings(); playerSettingsViewport.revalidate(); } }); addPlayerPanel.add(addPlayerButton); addPlayerSettings(); addPlayerSettings(); } private void createRuleSetupPanel() { ruleSetupPanel = new JPanel(); } SettingsPanel() { setLayout(new GridBagLayout()); final JTabbedPane tabbedPane = new JTabbedPane(); createPlayerSetupPanel(); tabbedPane.addTab("Spieler", playerSetupPanel); createRuleSetupPanel(); tabbedPane.addTab("Regeln", ruleSetupPanel); GridBagConstraints c = new GridBagConstraints(); c.fill = GridBagConstraints.BOTH; c.gridwidth = GridBagConstraints.REMAINDER; c.weightx = 1; c.weighty = 1; add(tabbedPane, c); JLabel errorMessageLabel = new JLabel("Fehler: Implementierung fehlt!"); errorMessageLabel.setForeground(Color.RED); c.weighty = 0; add(errorMessageLabel, c); JButton startButton = new JButton("Spiel starten"); startButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { startGameEvent.emit(gameSettings); } }); add(startButton, c); setBorder(new CompoundBorder(new LineBorder(Color.BLACK), new EmptyBorder( 10, 10, 10, 10))); } private class PlayerSettingsPanel extends JPanel { private PlayerSettings settings = new PlayerSettings("Player", Color.RED); private void remove() { playerSettingsPanels.remove(PlayerSettingsPanel.this); playerSettingsViewport.remove(PlayerSettingsPanel.this); playerSettingsViewport.revalidate(); gameSettings.getPlayerList().remove(settings); settingsChangeEvent.emit(gameSettings); } PlayerSettingsPanel() { setLayout(new BorderLayout()); 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; } settings.setName(nameField.getText()); settingsChangeEvent.emit(gameSettings); } @Override public void insertUpdate(DocumentEvent e) { update(); } @Override public void removeUpdate(DocumentEvent e) { update(); } @Override public void changedUpdate(DocumentEvent e) { update(); } }); add(nameField); JButton removeButton = new JButton("\u00d7"); removeButton.setFont(removeButton.getFont().deriveFont(Font.BOLD)); removeButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { remove(); } }); add(removeButton, BorderLayout.EAST); gameSettings.getPlayerList().add(settings); } @Override public Dimension getPreferredSize() { return getComponent(1).getPreferredSize(); } @Override public Dimension getMaximumSize() { return new Dimension(Integer.MAX_VALUE, getPreferredSize().height); } } }