/******************************************************************************* * Copyright (c) 2001, 2010 Mathew A. Nelson and Robocode contributors * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://robocode.sourceforge.net/license/epl-v10.html * * Contributors: * Mathew A. Nelson * - Initial API and implementation * Flemming N. Larsen * - Totally rewritten *******************************************************************************/ package net.sf.robocode.ui.dialog; import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; /** * @author Mathew A. Nelson (original) * @author Flemming N. Larsen (contributor) */ @SuppressWarnings("serial") public class NewBattleBattleFieldTab extends JPanel { private final static int MIN_SIZE = 400; private final static int MAX_SIZE = 5000; private final static int STEP_SIZE = 100; private final EventHandler eventHandler = new EventHandler(); private final SizeButton[] sizeButtons = { new SizeButton(400, 400), new SizeButton(600, 400), new SizeButton(600, 600), new SizeButton(800, 600), new SizeButton(800, 800), new SizeButton(1000, 800), new SizeButton(1000, 1000), new SizeButton(1200, 1200), new SizeButton(2000, 2000), new SizeButton(5000, 5000) }; private final JSlider battleFieldWidthSlider = createBattleFieldWidthSlider(); private final JSlider battleFieldHeightSlider = createBattleFieldHeightSlider(); private final JLabel battleFieldSizeLabel = createBattleFieldSizeLabel(); public NewBattleBattleFieldTab() { super(); JPanel sliderPanel = createSliderPanel(); add(sliderPanel); JPanel buttonsPanel = createButtonsPanel(); add(buttonsPanel); } public int getBattleFieldWidth() { return battleFieldWidthSlider.getValue(); } public void setBattleFieldWidth(int width) { battleFieldWidthSlider.setValue(width); battleFieldSliderValuesChanged(); } public int getBattleFieldHeight() { return battleFieldHeightSlider.getValue(); } public void setBattleFieldHeight(int height) { battleFieldHeightSlider.setValue(height); battleFieldSliderValuesChanged(); } private JPanel createButtonsPanel() { JPanel panel = new JPanel(); panel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Default Sizes")); panel.setLayout(new GridLayout(sizeButtons.length, 1)); for (SizeButton button : sizeButtons) { panel.add(button); } return panel; } private JPanel createSliderPanel() { JPanel panel = new JPanel(); panel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Battlefield Size")); // We want the BorderLayout to put the vertical scrollbar // to the right of the horizontal one... so small hack: panel.setLayout(new BorderLayout()); panel.add(battleFieldHeightSlider, BorderLayout.EAST); JPanel subPanel = new JPanel(); subPanel.setLayout(new BorderLayout()); subPanel.add(battleFieldWidthSlider, BorderLayout.SOUTH); subPanel.add(battleFieldSizeLabel, BorderLayout.CENTER); panel.add(subPanel, BorderLayout.CENTER); return panel; } private JSlider createBattleFieldWidthSlider() { JSlider slider = new JSlider(); slider.setMinimum(MIN_SIZE); slider.setMaximum(MAX_SIZE); slider.setMajorTickSpacing(STEP_SIZE); slider.setSnapToTicks(true); slider.addChangeListener(eventHandler); return slider; } private JSlider createBattleFieldHeightSlider() { JSlider slider = createBattleFieldWidthSlider(); slider.setOrientation(SwingConstants.VERTICAL); return slider; } private JLabel createBattleFieldSizeLabel() { JLabel label = new JLabel(); label.setHorizontalAlignment(SwingConstants.CENTER); return label; } private void battleFieldSliderValuesChanged() { int w = battleFieldWidthSlider.getValue(); int h = battleFieldHeightSlider.getValue(); battleFieldSizeLabel.setText(w + " x " + h); } private class SizeButton extends JButton { final int width; final int height; public SizeButton(int width, int height) { super(width + "x" + height); this.width = width; this.height = height; addActionListener(eventHandler); } } private class EventHandler implements ActionListener, ChangeListener { public void actionPerformed(ActionEvent e) { if (e.getSource() instanceof SizeButton) { SizeButton button = (SizeButton) e.getSource(); battleFieldWidthSlider.setValue(button.width); battleFieldHeightSlider.setValue(button.height); battleFieldSliderValuesChanged(); } } public void stateChanged(ChangeEvent e) { if ((e.getSource() == battleFieldWidthSlider) || (e.getSource() == battleFieldHeightSlider)) { battleFieldSliderValuesChanged(); } } } }