/******************************************************************************* * 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 * - Added visible ground, visible explosions, and visible explosion debris * option * - Changed some keyboard mnemonics * - Changed from using FPS into using TPS (Turns per Second), but added a * "Display FPS in titlebar" option * - Added propery listener for getting TPS updated from TPS slider * - Removed "Allow color changes" as this is always possible with the * current rendering engine * - Code cleanup * Matthew Reeder * - Added keyboard mnemonics to buttons and other controls *******************************************************************************/ package net.sf.robocode.ui.dialog; import net.sf.robocode.settings.ISettingsListener; import net.sf.robocode.settings.ISettingsManager; import javax.swing.*; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; /** * @author Mathew A. Nelson (original) * @author Flemming N. Larsen (contributor) * @author Matthew Reeder (contributor) */ @SuppressWarnings("serial") public class PreferencesViewOptionsTab extends WizardPanel { private static final int MIN_TPS = 1; private static final int DEFAULT_TPS = 30; private static final int FAST_TPS = 45; private static final int MAX_TPS = 10000; private final EventHandler eventHandler = new EventHandler(); private JCheckBox visibleRobotEnergyCheckBox; private JCheckBox visibleRobotNameCheckBox; private JCheckBox visibleScanArcsCheckBox; private JCheckBox visibleExplosionsCheckBox; private JCheckBox visibleGroundCheckBox; private JCheckBox visibleExplosionDebrisCheckBox; private JButton defaultViewOptionsButton; private JButton enableAllViewOptionsButton; private JButton disableAllViewOptionsButton; private JTextField desiredTpsTextField; private JLabel desiredTpsLabel; private JCheckBox displayFpsCheckBox; private JCheckBox displayTpsCheckBox; private JPanel visibleOptionsPanel; private JPanel tpsOptionsPanel; private JButton minTpsButton; private JButton defaultTpsButton; private JButton fastTpsButton; private JButton maxTpsButton; private JCheckBox preventSpeedupWhenMinimizedCheckBox; private final ISettingsManager properties; private class EventHandler implements ActionListener, DocumentListener { public void actionPerformed(ActionEvent e) { Object src = e.getSource(); if (src == enableAllViewOptionsButton) { setAllViewOptionsButtonsEnabled(true); } else if (src == disableAllViewOptionsButton) { setAllViewOptionsButtonsEnabled(false); } else if (src == defaultViewOptionsButton) { defaultViewOptionsButtonActionPerformed(); } else if (src == defaultTpsButton) { defaultTpsButtonActionPerformed(); } else if (src == minTpsButton) { minTpsButtonActionPerformed(); } else if (src == fastTpsButton) { fastTpsButtonActionPerformed(); } else if (src == maxTpsButton) { maxTpsButtonActionPerformed(); } } public void changedUpdate(DocumentEvent e) { fireStateChanged(); } public void insertUpdate(DocumentEvent e) { fireStateChanged(); } public void removeUpdate(DocumentEvent e) { fireStateChanged(); } } public PreferencesViewOptionsTab(ISettingsManager properties) { super(); this.properties = properties; initialize(); } private void defaultViewOptionsButtonActionPerformed() { setAllViewOptionsButtonsEnabled(true); getVisibleScanArcsCheckBox().setSelected(false); } private void setAllViewOptionsButtonsEnabled(boolean enabled) { getVisibleRobotEnergyCheckBox().setSelected(enabled); getVisibleRobotNameCheckBox().setSelected(enabled); getVisibleScanArcsCheckBox().setSelected(enabled); getVisibleExplosionsCheckBox().setSelected(enabled); getVisibleGroundCheckBox().setSelected(enabled); getVisibleExplosionDebrisCheckBox().setSelected(enabled); } private void maxTpsButtonActionPerformed() { getDesiredTpsTextField().setText("" + MAX_TPS); } private void minTpsButtonActionPerformed() { getDesiredTpsTextField().setText("" + MIN_TPS); } private void fastTpsButtonActionPerformed() { getDesiredTpsTextField().setText("" + FAST_TPS); } private void defaultTpsButtonActionPerformed() { getDesiredTpsTextField().setText("" + DEFAULT_TPS); } private JButton getDefaultViewOptionsButton() { if (defaultViewOptionsButton == null) { defaultViewOptionsButton = new JButton("Defaults"); defaultViewOptionsButton.setMnemonic('u'); defaultViewOptionsButton.setDisplayedMnemonicIndex(4); defaultViewOptionsButton.addActionListener(eventHandler); } return defaultViewOptionsButton; } private JButton getEnableAllViewOptionsButton() { if (enableAllViewOptionsButton == null) { enableAllViewOptionsButton = new JButton("Enable all"); enableAllViewOptionsButton.setMnemonic('a'); enableAllViewOptionsButton.setDisplayedMnemonicIndex(7); enableAllViewOptionsButton.addActionListener(eventHandler); } return enableAllViewOptionsButton; } private JButton getDisableAllViewOptionsButton() { if (disableAllViewOptionsButton == null) { disableAllViewOptionsButton = new JButton("Disable all"); disableAllViewOptionsButton.setMnemonic('i'); disableAllViewOptionsButton.setDisplayedMnemonicIndex(1); disableAllViewOptionsButton.addActionListener(eventHandler); } return disableAllViewOptionsButton; } private JLabel getDesiredTpsLabel() { if (desiredTpsLabel == null) { desiredTpsLabel = new JLabel("Desired TPS (" + MIN_TPS + '-' + MAX_TPS + "): "); } return desiredTpsLabel; } private JTextField getDesiredTpsTextField() { if (desiredTpsTextField == null) { desiredTpsTextField = new JTextField(); desiredTpsTextField.setColumns(5); desiredTpsTextField.getDocument().addDocumentListener(eventHandler); desiredTpsTextField.setInputVerifier( new InputVerifier() { @Override public boolean verify(JComponent c) { String text = desiredTpsTextField.getText(); int inputTps; try { inputTps = new Integer(text); } catch (NumberFormatException e) { inputTps = -1; } return inputTps >= MIN_TPS && inputTps <= MAX_TPS; } public boolean shouldYieldFocus(JComponent input) { if (verify(input)) { return true; } JOptionPane.showMessageDialog(null, "The specified value for 'Desired TPS' (" + MIN_TPS + '-' + MAX_TPS + ") is invalid.", "Invalid input", JOptionPane.ERROR_MESSAGE); return false; } }); } return desiredTpsTextField; } private JCheckBox getDisplayFpsCheckBox() { if (displayFpsCheckBox == null) { displayFpsCheckBox = new JCheckBox("Display FPS in titlebar"); displayFpsCheckBox.setMnemonic('P'); displayFpsCheckBox.setDisplayedMnemonicIndex(9); } return displayFpsCheckBox; } private JCheckBox getDisplayTpsCheckBox() { if (displayTpsCheckBox == null) { displayTpsCheckBox = new JCheckBox("Display TPS in titlebar"); displayTpsCheckBox.setMnemonic('T'); displayTpsCheckBox.setDisplayedMnemonicIndex(8); } return displayTpsCheckBox; } private JButton getDefaultTpsButton() { if (defaultTpsButton == null) { defaultTpsButton = new JButton("Default"); defaultTpsButton.addActionListener(eventHandler); } return defaultTpsButton; } private JButton getMinTpsButton() { if (minTpsButton == null) { minTpsButton = new JButton("Minimum"); minTpsButton.addActionListener(eventHandler); } return minTpsButton; } private JButton getMaxTpsButton() { if (maxTpsButton == null) { maxTpsButton = new JButton("Max"); maxTpsButton.addActionListener(eventHandler); } return maxTpsButton; } private JButton getFastTpsButton() { if (fastTpsButton == null) { fastTpsButton = new JButton("Fast"); fastTpsButton.addActionListener(eventHandler); } return fastTpsButton; } private JCheckBox getPreventSpeedupWhenMinimizedCheckBox() { if (preventSpeedupWhenMinimizedCheckBox == null) { preventSpeedupWhenMinimizedCheckBox = new JCheckBox("Prevent speedup when minimized"); } return preventSpeedupWhenMinimizedCheckBox; } private JPanel getTpsOptionsPanel() { if (tpsOptionsPanel == null) { tpsOptionsPanel = new JPanel(); tpsOptionsPanel.setBorder( BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Turns Per Second (TPS)")); tpsOptionsPanel.setLayout(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); c.anchor = GridBagConstraints.NORTHWEST; c.gridwidth = 4; tpsOptionsPanel.add(getDisplayTpsCheckBox(), c); c.gridy = 1; tpsOptionsPanel.add(getDisplayFpsCheckBox(), c); JPanel tpsPanel = new JPanel(); tpsPanel.add(getDesiredTpsLabel()); tpsPanel.add(getDesiredTpsTextField()); c.fill = GridBagConstraints.VERTICAL; c.gridy = 2; c.insets = new Insets(10, 0, 0, 0); tpsOptionsPanel.add(tpsPanel, c); c.fill = GridBagConstraints.NONE; c.gridx = 0; c.gridy = 3; c.gridwidth = 1; c.weightx = 0.25; tpsOptionsPanel.add(getMinTpsButton(), c); c.gridx = 1; tpsOptionsPanel.add(getDefaultTpsButton(), c); c.gridx = 2; tpsOptionsPanel.add(getFastTpsButton(), c); c.gridx = 3; tpsOptionsPanel.add(getMaxTpsButton(), c); c.insets = new Insets(20, 0, 0, 0); c.gridwidth = 4; c.gridx = 0; c.gridy = 4; c.weighty = 1; tpsOptionsPanel.add(getPreventSpeedupWhenMinimizedCheckBox(), c); } return tpsOptionsPanel; } private JPanel getVisibleOptionsPanel() { if (visibleOptionsPanel == null) { visibleOptionsPanel = new JPanel(); visibleOptionsPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Arena")); visibleOptionsPanel.setLayout(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); c.anchor = GridBagConstraints.NORTHWEST; c.gridwidth = GridBagConstraints.REMAINDER; c.weightx = 1; visibleOptionsPanel.add(getVisibleRobotEnergyCheckBox(), c); visibleOptionsPanel.add(getVisibleRobotNameCheckBox(), c); visibleOptionsPanel.add(getVisibleScanArcsCheckBox(), c); visibleOptionsPanel.add(getVisibleExplosionsCheckBox(), c); visibleOptionsPanel.add(getVisibleGroundCheckBox(), c); visibleOptionsPanel.add(getVisibleExplosionDebrisCheckBox(), c); c.insets = new Insets(10, 0, 0, 10); c.gridwidth = 1; c.fill = GridBagConstraints.NONE; c.weighty = 1; c.weightx = 0; visibleOptionsPanel.add(getEnableAllViewOptionsButton(), c); visibleOptionsPanel.add(getDisableAllViewOptionsButton(), c); visibleOptionsPanel.add(getDefaultViewOptionsButton(), c); } return visibleOptionsPanel; } private JCheckBox getVisibleRobotEnergyCheckBox() { if (visibleRobotEnergyCheckBox == null) { visibleRobotEnergyCheckBox = new JCheckBox("Visible Robot Energy"); visibleRobotEnergyCheckBox.setMnemonic('y'); visibleRobotEnergyCheckBox.setDisplayedMnemonicIndex(19); } return visibleRobotEnergyCheckBox; } private JCheckBox getVisibleRobotNameCheckBox() { if (visibleRobotNameCheckBox == null) { visibleRobotNameCheckBox = new JCheckBox("Visible Robot Name"); visibleRobotNameCheckBox.setMnemonic('V'); } return visibleRobotNameCheckBox; } private JCheckBox getVisibleScanArcsCheckBox() { if (visibleScanArcsCheckBox == null) { visibleScanArcsCheckBox = new JCheckBox("Visible Scan Arcs"); visibleScanArcsCheckBox.setMnemonic('b'); visibleScanArcsCheckBox.setDisplayedMnemonicIndex(4); } return visibleScanArcsCheckBox; } private JCheckBox getVisibleExplosionsCheckBox() { if (visibleExplosionsCheckBox == null) { visibleExplosionsCheckBox = new JCheckBox("Visible Explosions"); visibleExplosionsCheckBox.setMnemonic('x'); visibleExplosionsCheckBox.setDisplayedMnemonicIndex(9); } return visibleExplosionsCheckBox; } private JCheckBox getVisibleGroundCheckBox() { if (visibleGroundCheckBox == null) { visibleGroundCheckBox = new JCheckBox("Visible Ground"); visibleGroundCheckBox.setMnemonic('G'); visibleGroundCheckBox.setDisplayedMnemonicIndex(8); } return visibleGroundCheckBox; } private JCheckBox getVisibleExplosionDebrisCheckBox() { if (visibleExplosionDebrisCheckBox == null) { visibleExplosionDebrisCheckBox = new JCheckBox("Visible Explosion Debris"); visibleExplosionDebrisCheckBox.setMnemonic('E'); visibleExplosionDebrisCheckBox.setDisplayedMnemonicIndex(8); } return visibleExplosionDebrisCheckBox; } private void initialize() { setLayout(new GridLayout(1, 2)); add(getVisibleOptionsPanel()); add(getTpsOptionsPanel()); final ISettingsManager props = properties; loadPreferences(props); props.addPropertyListener(new ISettingsListener() { public void settingChanged(String property) { if (property.equals(ISettingsManager.OPTIONS_BATTLE_DESIREDTPS)) { PreferencesViewOptionsTab.this.desiredTpsTextField.setText("" + props.getOptionsBattleDesiredTPS()); } } }); } private void loadPreferences(ISettingsManager robocodeProperties) { getDisplayFpsCheckBox().setSelected(robocodeProperties.getOptionsViewFPS()); getDisplayTpsCheckBox().setSelected(robocodeProperties.getOptionsViewTPS()); getVisibleRobotNameCheckBox().setSelected(robocodeProperties.getOptionsViewRobotNames()); getVisibleRobotEnergyCheckBox().setSelected(robocodeProperties.getOptionsViewRobotEnergy()); getVisibleScanArcsCheckBox().setSelected(robocodeProperties.getOptionsViewScanArcs()); getVisibleExplosionsCheckBox().setSelected(robocodeProperties.getOptionsViewExplosions()); getVisibleGroundCheckBox().setSelected(robocodeProperties.getOptionsViewGround()); getVisibleExplosionDebrisCheckBox().setSelected(robocodeProperties.getOptionsViewExplosionDebris()); getDesiredTpsTextField().setText("" + robocodeProperties.getOptionsBattleDesiredTPS()); getPreventSpeedupWhenMinimizedCheckBox().setSelected( robocodeProperties.getOptionsViewPreventSpeedupWhenMinimized()); } public void storePreferences() { ISettingsManager props = properties; props.setOptionsViewFPS(getDisplayFpsCheckBox().isSelected()); props.setOptionsViewTPS(getDisplayTpsCheckBox().isSelected()); props.setOptionsViewRobotNames(getVisibleRobotNameCheckBox().isSelected()); props.setOptionsViewRobotEnergy(getVisibleRobotEnergyCheckBox().isSelected()); props.setOptionsViewScanArcs(getVisibleScanArcsCheckBox().isSelected()); props.setOptionsViewExplosions(getVisibleExplosionsCheckBox().isSelected()); props.setOptionsViewGround(getVisibleGroundCheckBox().isSelected()); props.setOptionsViewExplosionDebris(getVisibleExplosionDebrisCheckBox().isSelected()); props.setOptionsBattleDesiredTPS(Integer.parseInt(getDesiredTpsTextField().getText())); props.setOptionsViewPreventSpeedupWhenMinimized(getPreventSpeedupWhenMinimizedCheckBox().isSelected()); properties.saveProperties(); } @Override public boolean isReady() { try { int tps = Integer.parseInt(getDesiredTpsTextField().getText()); return (tps >= MIN_TPS && tps <= MAX_TPS); } catch (Exception e) { return false; } } }