/*******************************************************************************
* 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
* - Rewritten
* Ruben Moreno Montoliu
* - Added list of paths and buttons for adding and removing directories
*******************************************************************************/
package net.sf.robocode.ui.dialog;
import net.sf.robocode.settings.ISettingsManager;
import net.sf.robocode.ui.CheckList;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* @author Mathew A. Nelson (original)
* @author Flemming N. Larsen (contributor)
* @author Ruben Moreno Montoliu (contributor)
*/
@SuppressWarnings("serial")
public class PreferencesDevelopmentOptionsTab extends WizardPanel {
private JPanel optionsPanel;
private JButton addButton;
private JButton removeButton;
private CheckList pathList;
public final ISettingsManager properties;
private final EventHandler eventHandler = new EventHandler();
private class EventHandler implements ActionListener, ListSelectionListener {
public void actionPerformed(ActionEvent e) {
if (e.getSource() == getAddButton()) {
handleAddAction();
} else if (e.getSource() == getRemoveButton()) {
handleRemoveAction();
}
}
public void valueChanged(ListSelectionEvent e) {
updateRemoveButton();
}
}
public PreferencesDevelopmentOptionsTab(ISettingsManager properties) {
super();
this.properties = properties;
initialize();
}
private void initialize() {
setLayout(new GridLayout(1, 2));
add(getOptionsPanel());
loadPreferences(properties);
}
private JPanel getOptionsPanel() {
if (optionsPanel == null) {
optionsPanel = new JPanel();
optionsPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Development"));
GridBagLayout layout = new GridBagLayout();
optionsPanel.setLayout(layout);
GridBagConstraints c = new GridBagConstraints();
c.insets = new Insets(0, 5, 5, 5);
c.anchor = GridBagConstraints.NORTHWEST;
c.fill = GridBagConstraints.HORIZONTAL;
c.gridwidth = 2;
c.weightx = 0;
c.gridy = 1;
optionsPanel.add(
new JLabel(
"If you are using an external IDE to develop robots, you may enter the classpath(s) to those robots here."),
c);
c.gridy++;
optionsPanel.add(
new JLabel(
"If you are using Eclipse, you can enter the root dir of robot projects inside a workspace as well (recommended)"),
c);
c.gridy++;
optionsPanel.add(new JLabel("Double-click the path(s) the enable or disable it (checked means enabled)"), c);
c.gridwidth = 1;
c.gridy++;
c.insets = new Insets(3, 3, 3, 3);
optionsPanel.add(getAddButton(), c);
c.gridy++;
optionsPanel.add(getRemoveButton(), c);
c.fill = GridBagConstraints.BOTH;
c.weightx = 1;
c.weighty = 1;
c.gridx = 1;
c.gridy--;
c.gridheight = 3;
c.insets = new Insets(5, 5, 5, 5);
JScrollPane pathListScroller = new JScrollPane(getPathList());
optionsPanel.add(pathListScroller, c);
}
return optionsPanel;
}
private JButton getAddButton() {
if (addButton == null) {
addButton = new JButton("Add");
addButton.setDisplayedMnemonicIndex(2);
addButton.addActionListener(eventHandler);
}
return addButton;
}
private JButton getRemoveButton() {
if (removeButton == null) {
removeButton = new JButton("Remove");
removeButton.setDisplayedMnemonicIndex(3);
removeButton.addActionListener(eventHandler);
}
return removeButton;
}
private CheckList getPathList() {
if (pathList == null) {
pathList = new CheckList();
pathList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
pathList.setLayoutOrientation(JList.VERTICAL);
pathList.setVisibleRowCount(-1);
pathList.addListSelectionListener(eventHandler);
}
return pathList;
}
private void loadPreferences(ISettingsManager robocodeProperties) {
getPathList().clear();
for (String path : robocodeProperties.getOptionsDevelopmentPaths()) {
getPathList().add(path);
}
for (String excludedPath : robocodeProperties.getOptionsExcludedDevelopmentPaths()) {
getPathList().setChecked(excludedPath, false);
}
updateRemoveButton();
}
public void storePreferences() {
properties.setOptionsDevelopmentPaths(getPathList().getAll());
properties.setOptionsExcludedDevelopmentPaths(getPathList().getUnchecked());
properties.saveProperties();
}
@Override
public boolean isReady() {
return true;
}
private void handleAddAction() {
JFileChooser chooser = new JFileChooser();
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
if (chooser.showOpenDialog(optionsPanel) == JFileChooser.APPROVE_OPTION) {
String path = chooser.getSelectedFile().getAbsolutePath();
if (!getPathList().contains(path)) {
getPathList().add(path);
getPathList().sort();
}
}
updateRemoveButton();
}
private void handleRemoveAction() {
int[] indices = getPathList().getSelectedIndices();
for (int i = indices.length - 1; i >= 0; i--) {
getPathList().remove(indices[i]);
}
updateRemoveButton();
}
private void updateRemoveButton() {
getRemoveButton().setEnabled(getPathList().getSelectedIndex() >= 0);
}
}