package nl.tudelft.bw4t.scenariogui.editor.gui;
import java.awt.Checkbox;
import java.awt.CheckboxGroup;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionListener;
import java.awt.event.ItemListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.Border;
import javax.swing.border.EtchedBorder;
import javax.swing.border.TitledBorder;
import javax.swing.event.DocumentListener;
import nl.tudelft.bw4t.scenariogui.DefaultConfigurationValues;
import nl.tudelft.bw4t.scenariogui.util.FileFilters;
import nl.tudelft.bw4t.scenariogui.util.Format;
import nl.tudelft.bw4t.scenariogui.util.MapSpec;
/**
* The ConfigurationPanel class represents the left pane of the MainPanel. It
* shows the options the user can configure.
*
*/
public class ConfigurationPanel extends JPanel {
private static final long serialVersionUID = 2925174902776539436L;
private static final String FONT_NAME = "Sans-Serif";
private static final int INSET = 8;
private static final double GRID_BAG_CONSTRAINTS_WEIGHT = 0.5;
private static final int TEXT_FIELD_COLUMN_SIZE_BIG = 15;
private static final int TEXT_FIELD_COLUMN_SIZE_SMALL = 6;
private MapSpec mapSpec;
private JTextField clientIP = new JTextField(
DefaultConfigurationValues.DEFAULT_CLIENT_IP.getValue(),
TEXT_FIELD_COLUMN_SIZE_BIG);
private JTextField clientPort = new JTextField(
DefaultConfigurationValues.DEFAULT_CLIENT_PORT.getValue(),
TEXT_FIELD_COLUMN_SIZE_SMALL);
{
Format.addIntegerDocumentFilterForTextField(clientPort);
}
private JTextField serverIP = new JTextField(
DefaultConfigurationValues.DEFAULT_SERVER_IP.getValue(),
TEXT_FIELD_COLUMN_SIZE_BIG);
private JTextField serverPort = new JTextField(
DefaultConfigurationValues.DEFAULT_SERVER_PORT.getValue(),
TEXT_FIELD_COLUMN_SIZE_SMALL);
{
Format.addIntegerDocumentFilterForTextField(serverPort);
}
private JTextField mapFileTextField = new JTextField(
DefaultConfigurationValues.MAP_FILE.getValue());
private CheckboxGroup guiCheckBox = new CheckboxGroup();
private Checkbox guiYes = new Checkbox("Yes",
DefaultConfigurationValues.USE_GUI.getBooleanValue(), guiCheckBox);
private Checkbox guiNo = new Checkbox("No",
!DefaultConfigurationValues.USE_GUI.getBooleanValue(), guiCheckBox);
private CheckboxGroup pathsCheckBox = new CheckboxGroup();
private Checkbox pathsYes = new Checkbox("Yes",
DefaultConfigurationValues.USE_GUI.getBooleanValue(), pathsCheckBox);
private Checkbox pathsNo = new Checkbox("No",
!DefaultConfigurationValues.USE_GUI.getBooleanValue(), pathsCheckBox);
private CheckboxGroup collisionsCheckBox = new CheckboxGroup();
private Checkbox collisionsYes = new Checkbox("Yes",
DefaultConfigurationValues.USE_GUI.getBooleanValue(), collisionsCheckBox);
private Checkbox collisionsNo = new Checkbox("No",
!DefaultConfigurationValues.USE_GUI.getBooleanValue(), collisionsCheckBox);
private JButton chooseMapFile = new JButton("Open File");
private JFileChooser fileChooser;
private GridBagConstraints c;
private static final int FONT_SIZE = 16;
private static final int FONT_SIZE_SMALL = 14;
private String oldClientIP = clientIP.getText();
private String oldClientPort = clientPort.getText();
private String oldServerIP = serverIP.getText();
private String oldServerPort = serverPort.getText();
private Checkbox oldGui = guiCheckBox.getSelectedCheckbox();
private String oldMapFile = mapFileTextField.getText();
/**
* Create a ConfigurationPanel object.
*/
public ConfigurationPanel() {
fileChooser = new JFileChooser();
fileChooser.setFileFilter(FileFilters.mapFilter());
setLayout(new GridBagLayout());
c = new GridBagConstraints();
c.fill = GridBagConstraints.HORIZONTAL;
Border loweredetched = BorderFactory
.createEtchedBorder(EtchedBorder.LOWERED);
TitledBorder title = BorderFactory.createTitledBorder(loweredetched,
"Configuration ");
title.setTitleJustification(TitledBorder.LEFT);
title.setTitleFont(new Font(FONT_NAME, Font.BOLD, FONT_SIZE));
setBorder(title);
mapSpec = new MapSpec(DefaultConfigurationValues.MAP_FILE.getValue());
showClientOptions();
showServerOptions();
showGuiOptions();
visualizePathsOptions();
enableCollisionsOptions();
showMapOptions();
}
private void showClientOptions() {
c.insets = new Insets(INSET, INSET, 0, 0);
c.gridx = 0;
c.gridy += 1;
JLabel client = new JLabel("Client");
client.setFont(new Font(FONT_NAME, Font.BOLD, FONT_SIZE_SMALL));
add(client, c);
c.insets = new Insets(0, INSET, 0, 0);
showClientBoxContent();
}
private void showClientBoxContent() {
c.weightx = GRID_BAG_CONSTRAINTS_WEIGHT;
c.gridx = 0;
c.gridy += 1;
add(new JLabel("IP "), c);
c.gridx = 1;
c.weightx = 2;
c.weighty = 1;
add(clientIP, c);
c.weightx = GRID_BAG_CONSTRAINTS_WEIGHT;
c.gridx = 0;
c.gridy += 1;
add(new JLabel("Port "), c);
c.gridx = 1;
c.weightx = 2;
c.weighty = 1;
add(clientPort, c);
}
private void showServerOptions() {
c.insets = new Insets(INSET, INSET, 0, 0);
c.gridx = 0;
c.gridy += 1;
JLabel server = new JLabel("Server");
server.setFont(new Font(FONT_NAME, Font.BOLD, FONT_SIZE_SMALL));
add(server, c);
showServerBoxContent();
}
private void showServerBoxContent() {
c.insets = new Insets(0, INSET, 0, 0);
c.weightx = GRID_BAG_CONSTRAINTS_WEIGHT;
c.gridx = 0;
c.gridy += 1;
add(new JLabel("IP"), c);
c.gridx = 1;
c.weightx = 2;
c.weighty = 1;
add(serverIP, c);
c.weightx = GRID_BAG_CONSTRAINTS_WEIGHT;
c.gridx = 0;
c.gridy += 1;
add(new JLabel("Port"), c);
c.gridx = 1;
c.weightx = 2;
c.weighty = 1;
add(serverPort, c);
}
private void showGuiOptions() {
c.insets = new Insets(INSET, INSET, 0, 0);
c.gridx = 0;
c.gridy += 1;
JLabel gui = new JLabel("Launch GUI");
gui.setFont(new Font(FONT_NAME, Font.BOLD, FONT_SIZE_SMALL));
add(gui, c);
c.insets = new Insets(0, INSET, 0, 0);
c.gridx = 0;
c.gridy += 1;
add(guiYes, c);
c.gridx = 1;
add(guiNo, c);
}
private void visualizePathsOptions() {
c.insets = new Insets(INSET, INSET, 0, 0);
c.gridx = 0;
c.gridy += 1;
JLabel gui = new JLabel("Visualize Paths");
gui.setFont(new Font(FONT_NAME, Font.BOLD, FONT_SIZE_SMALL));
add(gui, c);
c.insets = new Insets(INSET / 2, INSET, INSET, INSET);
c.gridx = 0;
c.gridy += 1;
add(pathsYes, c);
c.gridx = 1;
add(pathsNo, c);
}
private void enableCollisionsOptions() {
c.insets = new Insets(INSET, INSET, 0, 0);
c.gridx = 0;
c.gridy += 1;
JLabel gui = new JLabel("Enable Collisions");
gui.setFont(new Font(FONT_NAME, Font.BOLD, FONT_SIZE_SMALL));
add(gui, c);
c.insets = new Insets(INSET / 2, INSET, INSET, INSET);
c.gridx = 0;
c.gridy += 1;
add(collisionsYes, c);
c.gridx = 1;
add(collisionsNo, c);
}
private void showMapOptions() {
c.insets = new Insets(INSET, INSET, 0, 0);
c.gridx = 0;
c.gridy += 1;
JLabel map = new JLabel("Map File");
map.setFont(new Font(FONT_NAME, Font.BOLD, FONT_SIZE_SMALL));
add(map, c);
c.insets = new Insets(INSET / 2, INSET, INSET, INSET);
c.gridx = 0;
c.gridwidth = 2;
c.gridy += 1;
add(mapFileTextField, c);
mapFileTextField.setPreferredSize(chooseMapFile.getPreferredSize());
c.gridx = 2;
c.gridwidth = 1;
add(chooseMapFile, c);
}
public final String getClientIP() {
return clientIP.getText();
}
public final void setClientIP(final String newClientIP) {
this.clientIP.setText(newClientIP);
}
public final int getClientPort() {
return Integer.parseInt(clientPort.getText());
}
public final void setClientPort(final String newClientPort) {
this.clientPort.setText(newClientPort);
}
public final String getServerIP() {
return serverIP.getText();
}
public final void setServerIP(final String newServerIP) {
this.serverIP.setText(newServerIP);
}
public final int getServerPort() {
return Integer.parseInt(serverPort.getText());
}
public final void setServerPort(final String newServerPort) {
this.serverPort.setText(newServerPort);
}
public final boolean useGui() {
return guiCheckBox.getSelectedCheckbox() == guiYes;
}
public final void setUseGui(final boolean useGui) {
if (useGui) {
guiCheckBox.setSelectedCheckbox(guiYes);
} else {
guiCheckBox.setSelectedCheckbox(guiNo);
}
}
public final boolean isVisualizePaths() {
return pathsCheckBox.getSelectedCheckbox() == pathsYes;
}
public final void setVisualizePaths(final boolean visualizePaths) {
if (visualizePaths) {
pathsCheckBox.setSelectedCheckbox(pathsYes);
} else {
pathsCheckBox.setSelectedCheckbox(pathsNo);
}
}
public final boolean isEnableCollisions() {
return collisionsCheckBox.getSelectedCheckbox() == collisionsYes;
}
public final void setEnableCollisions(final boolean enableCollisions) {
if (enableCollisions) {
collisionsCheckBox.setSelectedCheckbox(collisionsYes);
} else {
collisionsCheckBox.setSelectedCheckbox(collisionsNo);
}
}
public final JButton getChooseMapFile() {
return chooseMapFile;
}
public final String getMapFile() {
return mapFileTextField.getText();
}
public final void setMapFile(final String mapFile) {
mapSpec.setMapFileLocation(mapFile);
this.mapFileTextField.setText(mapFile);
}
public final JFileChooser getFileChooser() {
return fileChooser;
}
public final void setFileChooser(final JFileChooser newFileChooser) {
fileChooser = newFileChooser;
}
/**
* Returns if changes has been made to the default configuration.
*
* @return whether changes have been made.
*/
public final boolean isDefault() {
return this.getClientIP().equals(DefaultConfigurationValues.DEFAULT_CLIENT_IP.getValue())
&& this.getClientPort() == DefaultConfigurationValues.DEFAULT_CLIENT_PORT.getIntValue()
&& this.getServerIP().equals(DefaultConfigurationValues.DEFAULT_SERVER_IP.getValue())
&& this.getServerPort() == DefaultConfigurationValues.DEFAULT_SERVER_PORT.getIntValue()
&& this.useGui() == DefaultConfigurationValues.USE_GUI.getBooleanValue()
&& this.isVisualizePaths() == DefaultConfigurationValues.VISUALIZE_PATHS.getBooleanValue()
&& this.isEnableCollisions() == DefaultConfigurationValues.ENABLE_COLLISIONS.getBooleanValue()
&& this.getMapFile().equals(DefaultConfigurationValues.MAP_FILE.getValue());
}
public String getOldValues() {
return this.oldClientIP + this.oldClientPort
+ this.oldServerIP + this.oldServerPort + this.oldGui
+ this.oldMapFile;
}
/**
* Updates the "old" values after a file has been saved.
*/
public void updateOldValues() {
this.oldClientIP = clientIP.getText();
this.oldClientPort = clientPort.getText();
this.oldServerIP = serverIP.getText();
this.oldServerPort = serverPort.getText();
this.oldGui = guiCheckBox.getSelectedCheckbox();
this.oldMapFile = mapFileTextField.getText();
}
public String getCurrentValues() {
return this.clientIP.getText()
+ this.clientPort.getText()
+ this.serverIP.getText() + this.serverPort.getText()
+ this.guiCheckBox.getSelectedCheckbox()
+ this.mapFileTextField.getText();
}
public MapSpec getMapSpecifications() {
return mapSpec;
}
public JTextField getClientIPTextField() {
return clientIP;
}
public JTextField getClientPortTextField() {
return clientPort;
}
public JTextField getServerIPTextField() {
return serverIP;
}
public JTextField getServerPortTextField() {
return serverPort;
}
public Checkbox getGUIYesCheckbox() {
return guiYes;
}
public Checkbox getGUINoCheckbox() {
return guiNo;
}
public Checkbox getPathsYesCheckbox() {
return pathsYes;
}
public Checkbox getPathsNoCheckbox() {
return pathsNo;
}
public Checkbox getCollisionsYesCheckbox() {
return pathsYes;
}
public Checkbox getCollisionsNoCheckbox() {
return pathsNo;
}
public JTextField getMapFileTextField() {
return mapFileTextField;
}
public void addClientIPController(DocumentListener controller) {
getClientIPTextField().getDocument().addDocumentListener(controller);
}
public void addClientPortController(DocumentListener controller) {
getClientPortTextField().getDocument().addDocumentListener(controller);
}
public void addServerIPController(DocumentListener controller) {
getServerIPTextField().getDocument().addDocumentListener(controller);
}
public void addServerPortController(DocumentListener controller) {
getServerPortTextField().getDocument().addDocumentListener(controller);
}
public void addGUIYesCheckboxController(ItemListener controller) {
getGUIYesCheckbox().addItemListener(controller);
}
public void addGUINoCheckboxController(ItemListener controller) {
getGUINoCheckbox().addItemListener(controller);
}
public void addPathsYesCheckboxController(ItemListener controller) {
getPathsYesCheckbox().addItemListener(controller);
}
public void addPathsNoCheckboxController(ItemListener controller) {
getPathsNoCheckbox().addItemListener(controller);
}
public void addCollisionsYesCheckboxController(ItemListener controller) {
getCollisionsYesCheckbox().addItemListener(controller);
}
public void addCollisionsNoCheckboxController(ItemListener controller) {
getCollisionsNoCheckbox().addItemListener(controller);
}
public void addMapFileController(DocumentListener controller) {
getMapFileTextField().getDocument().addDocumentListener(controller);
}
public void addMapFileButtonController(ActionListener controller) {
getChooseMapFile().addActionListener(controller);
}
}