package nl.tudelft.bw4t.scenariogui.botstore.gui;
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.text.DecimalFormat;
import javax.swing.BoxLayout;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import nl.tudelft.bw4t.map.EntityType;
import nl.tudelft.bw4t.scenariogui.BW4TClientConfig;
import nl.tudelft.bw4t.scenariogui.BotConfig;
import nl.tudelft.bw4t.scenariogui.botstore.controller.BatteryDischargeUpdater;
import nl.tudelft.bw4t.scenariogui.botstore.controller.BotController;
import nl.tudelft.bw4t.scenariogui.botstore.controller.CancelButton;
import nl.tudelft.bw4t.scenariogui.botstore.controller.GoalFileButton;
import nl.tudelft.bw4t.scenariogui.botstore.controller.ResetButton;
import nl.tudelft.bw4t.scenariogui.botstore.controller.SaveButton;
import nl.tudelft.bw4t.scenariogui.botstore.controller.SliderEnabler;
import nl.tudelft.bw4t.scenariogui.editor.gui.MainPanel;
/**
* BotEditorPanel which serves as the content pane for the BotEditor frame
*/
public class BotEditorPanel extends JPanel implements BotStoreViewInterface {
private static final long serialVersionUID = 1850617931893202292L;
public static final DecimalFormat dischargeRateFormatter = new DecimalFormat(
"0.0000");
private JPanel botCheckables = new JPanel();
private JPanel botSliders = new JPanel();
private JPanel botInfo = new JPanel();
private JButton saveButton = new JButton("Save");
private JButton resetButton = new JButton("Reset");
private JButton cancelButton = new JButton("Cancel");
private JButton fileButton = new JButton("Use existing GOAL file");
private JComboBox<String> botControllerSelector = new JComboBox<String>();
private JTextField botNameField = new JTextField();
private JTextField botAmountTextField = new JTextField();
private JCheckBox gripperCheckbox = new JCheckBox("Gripper Disabled");
private JCheckBox colorblindCheckbox = new JCheckBox("Color Blind Handicap");
private JCheckBox customSizeCheckbox = new JCheckBox("Custom Bot Size");
private JCheckBox movespeedCheckbox = new JCheckBox("Custom Bot Speed");
private JCheckBox batteryEnabledCheckbox = new JCheckBox(
"Battery Capacity enabled");
private JTextField fileNameField = new JTextField(
BotConfig.DEFAULT_GOAL_FILENAME);
private JTextField botReferenceField = new JTextField(
BotConfig.DEFAULT_GOAL_FILENAME_REFERENCE);
private JSlider sizeSlider = new JSlider();
private JSlider speedSlider = new JSlider();
private JSlider batterySlider = new JSlider();
private JSlider numberOfGrippersSlider = new JSlider();
private JLabel batteryUseValueLabel = new JLabel("0");
private MainPanel mainPanel;
private BotEditor botEditor;
private BotController controller;
private BW4TClientConfig model;
/**
* Create the botEditorPanel.
*
* @param controller
* is the controller that will control this view
*/
public BotEditorPanel(BotController controller) {
setLayout(new BorderLayout(20, 20));
this.setController(controller);
mainPanel = controller.getMainPanel();
model = controller.getBW4TClientConfig();
createBotInfoPanel();
createBotCheckablesPanel();
createBotSlidersPanel();
add(botInfo, BorderLayout.NORTH);
add(botSliders, BorderLayout.EAST);
add(botCheckables, BorderLayout.WEST);
getResetButton().addActionListener(new ResetButton(this));
getSaveButton().addActionListener(new SaveButton(this));
getCancelButton().addActionListener(new CancelButton(this));
getFile().addActionListener(new GoalFileButton(this));
final BatteryDischargeUpdater bdu = new BatteryDischargeUpdater(this);
getSpeedSlider().addMouseListener(bdu);
getSizeSlider().addMouseListener(bdu);
final SliderEnabler su = new SliderEnabler(this);
getGripperCheckbox().addActionListener(su);
getCustomSizeCheckbox().addActionListener(su);
getCustomSizeCheckbox().addActionListener(bdu);
getMovespeedCheckbox().addActionListener(su);
getMovespeedCheckbox().addActionListener(bdu);
getBatteryEnabledCheckbox().addActionListener(su);
getBatteryEnabledCheckbox().addActionListener(bdu);
controller.addView(this);
setVisible(true);
}
private void createBotInfoPanel() {
botInfo.setLayout(new GridLayout(10, 0));
botControllerSelector.setModel(new DefaultComboBoxModel<String>(
new String[] { EntityType.AGENT.toString(),
EntityType.HUMAN.toString() }));
botInfo.add(new JLabel("Bot name:"));
botInfo.add(botNameField);
JPanel controllerpanel = new JPanel();
controllerpanel.setLayout(new GridLayout(1, 0));
controllerpanel.add(botControllerSelector);
controllerpanel.add(new JLabel(" Amount of this type:"));
controllerpanel.add(botAmountTextField);
botInfo.add(controllerpanel);
createGOALOptions();
}
private void createGOALOptions() {
botInfo.add(new JLabel(""));
JLabel goalLabel = new JLabel("GOAL options");
goalLabel.setFont(new Font("Tahoma", Font.PLAIN, 14));
botInfo.add(goalLabel);
botInfo.add(new JLabel("Bot reference name:"));
botInfo.add(botReferenceField);
botInfo.add(new JLabel("GOAL file name:"));
botInfo.add(fileNameField);
botInfo.add(fileButton);
}
private void createBotCheckablesPanel() {
botCheckables.setLayout(new GridLayout(2, 1));
JLabel checkablesLabel = new JLabel("Specs");
checkablesLabel.setFont(new Font("Tahoma", Font.PLAIN, 18));
JPanel checkablesPanel = new JPanel();
checkablesPanel.setLayout(new BoxLayout(checkablesPanel,
BoxLayout.PAGE_AXIS));
checkablesPanel.add(checkablesLabel);
checkablesPanel.add(new JLabel("Handicaps:"));
checkablesPanel.add(gripperCheckbox);
checkablesPanel.add(colorblindCheckbox);
checkablesPanel.add(new JLabel("Other options:"));
checkablesPanel.add(customSizeCheckbox);
checkablesPanel.add(movespeedCheckbox);
checkablesPanel.add(batteryEnabledCheckbox);
botCheckables.add(checkablesPanel);
}
private void updateCheckBoxesModel() {
gripperCheckbox.setSelected(controller.getGripperHandicap());
colorblindCheckbox.setSelected(controller.getColorBlindHandicap());
customSizeCheckbox.setSelected(controller.getSizeOverloadHandicap());
movespeedCheckbox.setSelected(controller.getMoveSpeedHandicap());
batteryEnabledCheckbox.setSelected(controller.isBatteryEnabled());
}
private void createBotSlidersPanel() {
botSliders.setLayout(new GridLayout(6, 1));
createSliders();
addGripperPanel();
addSizePanel();
addSpeedPanel();
addBatteryPanel();
addBatteryCapPanel();
addButtonPanel();
}
private void addBatteryCapPanel() {
JPanel batteryCapPanel = new JPanel();
JLabel batteryUseLabel = new JLabel("Battery use:");
batteryUseLabel.setHorizontalAlignment(SwingConstants.CENTER);
batteryCapPanel.add(batteryUseLabel);
batteryCapPanel.add(batteryUseValueLabel);
batteryCapPanel.add(new JLabel("per tick"));
botSliders.add(batteryCapPanel);
}
private void addButtonPanel() {
JPanel buttonPanel = new JPanel();
buttonPanel.add(saveButton);
buttonPanel.add(resetButton);
buttonPanel.add(cancelButton);
botSliders.add(buttonPanel);
}
private void addGripperPanel() {
JPanel gripperPanel = new JPanel();
gripperPanel
.setLayout(new BoxLayout(gripperPanel, BoxLayout.PAGE_AXIS));
JLabel numberOfGrippersLabel = new JLabel("Number of Grippers");
numberOfGrippersLabel.setHorizontalAlignment(SwingConstants.CENTER);
numberOfGrippersLabel.setToolTipText("default is 1");
gripperPanel.add(numberOfGrippersLabel);
gripperPanel.add(numberOfGrippersSlider);
botSliders.add(gripperPanel);
}
private void addSizePanel() {
JPanel sizePanel = new JPanel();
sizePanel.setLayout(new BoxLayout(sizePanel, BoxLayout.PAGE_AXIS));
JLabel sizeLabel = new JLabel("Bot Size");
sizeLabel.setHorizontalAlignment(SwingConstants.CENTER);
sizeLabel.setToolTipText("default is 2");
sizePanel.add(sizeLabel);
sizePanel.add(sizeSlider);
botSliders.add(sizePanel);
}
private void addSpeedPanel() {
JPanel speedPanel = new JPanel();
speedPanel.setLayout(new BoxLayout(speedPanel, BoxLayout.PAGE_AXIS));
JLabel speedLabel = new JLabel("Bot speed");
speedLabel
.setToolTipText("Speed multiplier. The default is 50%. Top speed is 100%");
speedLabel.setHorizontalAlignment(SwingConstants.CENTER);
speedPanel.add(speedLabel);
if (controller.getMoveSpeedHandicap()) {
speedSlider.setEnabled(true);
}
speedPanel.add(speedSlider);
botSliders.add(speedPanel);
}
private void addBatteryPanel() {
JPanel batteryPanel = new JPanel();
batteryPanel
.setLayout(new BoxLayout(batteryPanel, BoxLayout.PAGE_AXIS));
JLabel batteryCapacity = new JLabel("Battery Capacity");
batteryCapacity.setHorizontalAlignment(SwingConstants.CENTER);
batteryCapacity.setToolTipText("Max capacity on a scale of 10-100");
batteryPanel.add(batteryCapacity);
batteryPanel.add(batterySlider);
botSliders.add(batteryPanel);
}
private void createSliders() {
createGripperSlider();
createSizeSlider();
createSpeedSlider();
createBatterySlider();
}
private void createGripperSlider() {
numberOfGrippersSlider.setMajorTickSpacing(1);
numberOfGrippersSlider.setMaximum(5);
numberOfGrippersSlider.setMinimum(1);
numberOfGrippersSlider.setPaintTicks(true);
numberOfGrippersSlider.setPaintLabels(true);
numberOfGrippersSlider.setSnapToTicks(true);
numberOfGrippersSlider.setValue(1);
numberOfGrippersSlider.setValueIsAdjusting(true);
}
private void createSizeSlider() {
sizeSlider.setMajorTickSpacing(1);
sizeSlider.setMaximum(5);
sizeSlider.setMinimum(1);
sizeSlider.setPaintTicks(true);
sizeSlider.setPaintLabels(true);
sizeSlider.setSnapToTicks(true);
sizeSlider.setValue(2);
sizeSlider.setEnabled(false);
sizeSlider.setValueIsAdjusting(true);
}
private void createSpeedSlider() {
speedSlider.setMajorTickSpacing(10);
speedSlider.setMaximum(100);
speedSlider.setMinimum(10);
speedSlider.setPaintLabels(true);
speedSlider.setPaintTicks(true);
speedSlider.setSnapToTicks(true);
speedSlider.setValue(50);
speedSlider.setEnabled(false);
speedSlider.setValueIsAdjusting(true);
}
private void createBatterySlider() {
batterySlider = new JSlider();
batterySlider.setMinimum(10);
batterySlider.setMaximum(100);
batterySlider.setValue(10);
batterySlider.setSnapToTicks(true);
batterySlider.setPaintTicks(true);
batterySlider.setPaintLabels(true);
batterySlider.setEnabled(false);
batterySlider.setMajorTickSpacing(10);
}
public JButton getSaveButton() {
return saveButton;
}
public JButton getResetButton() {
return resetButton;
}
public JButton getCancelButton() {
return cancelButton;
}
public JCheckBox getGripperCheckbox() {
return gripperCheckbox;
}
public JCheckBox getColorblindCheckbox() {
return colorblindCheckbox;
}
public JCheckBox getsizeoverloadCheckbox() {
return customSizeCheckbox;
}
public JSlider getSizeSlider() {
return sizeSlider;
}
public JSlider getSpeedSlider() {
return speedSlider;
}
public JSlider getBatterySlider() {
return batterySlider;
}
public JCheckBox getBatteryEnabledCheckbox() {
return batteryEnabledCheckbox;
}
public JLabel getBatteryUseValueLabel() {
return batteryUseValueLabel;
}
public JSlider getNumberOfGrippersSlider() {
return numberOfGrippersSlider;
}
public JTextField getFileNameField() {
return fileNameField;
}
public JTextField getBotNameField() {
return botNameField;
}
public JCheckBox getCustomSizeCheckbox() {
return customSizeCheckbox;
}
public JComboBox getBotControllerSelector() {
return botControllerSelector;
}
public JTextField getBotAmountTextField() {
return botAmountTextField;
}
public JTextField getBotReferenceField() {
return botReferenceField;
}
public BotEditor getBotEditor() {
return botEditor;
}
@Override
public boolean getGripperHandicap() {
return gripperCheckbox.isSelected();
}
@Override
public boolean getColorBlindHandicap() {
return colorblindCheckbox.isSelected();
}
@Override
public boolean getMoveSpeedHandicap() {
return movespeedCheckbox.isSelected();
}
@Override
public boolean getSizeOverloadHandicap() {
return customSizeCheckbox.isSelected();
}
@Override
public int getBotSize() {
return sizeSlider.getValue();
}
@Override
public int getBotSpeed() {
return speedSlider.getValue();
}
@Override
public int getBotBatteryCapacity() {
return batterySlider.getValue();
}
@Override
public boolean isBatteryEnabled() {
return batteryEnabledCheckbox.isSelected();
}
@Override
public double getBotBatteryDischargeRate() {
return Double.parseDouble(batteryUseValueLabel.getText());
}
@Override
public int getGrippers() {
return numberOfGrippersSlider.getValue();
}
@Override
public String getFileName() {
return fileNameField.getText();
}
@Override
public String getBotName() {
return botNameField.getText();
}
public JButton getFile() {
return fileButton;
}
public int getBotAmount() {
return Integer.parseInt(botAmountTextField.getText());
}
public String getReferenceName() {
return botReferenceField.getText();
}
public void setBotEditor(BotEditor editor) {
this.botEditor = editor;
}
public MainPanel getMainPanel() {
return mainPanel;
}
/**
* Update the view with the values from the controller.
*/
public void updateView() {
botControllerSelector.setSelectedItem(controller.getBotController()
.toString());
botNameField.setText(controller.getBotName());
botAmountTextField.setText(Integer.toString(controller.getBotAmount()));
updateCheckBoxesModel();
updateSliders();
fileNameField.setText(controller.getFileName());
botReferenceField.setText(controller.getReferenceName());
numberOfGrippersSlider.setValue(controller.getGrippers());
speedSlider.setValue(controller.getBotSpeed());
sizeSlider.setValue(controller.getBotSize());
batterySlider.setValue(controller.getBotBatteryCapacity());
updateDischargeRate();
}
/**
* Update the sliders so they are enabled properly.
*/
public void updateSliders() {
sizeSlider.setEnabled(getSizeOverloadHandicap());
numberOfGrippersSlider.setEnabled(!getGripperHandicap());
batterySlider.setEnabled(isBatteryEnabled());
speedSlider.setEnabled(getMoveSpeedHandicap());
}
/**
* Update the discharge rate.
*/
public void updateDischargeRate() {
double dr = 0.0;
if (isBatteryEnabled()) {
dr = BotConfig.calculateDischargeRate(getBotSize(), getBotSpeed());
}
batteryUseValueLabel.setText(dischargeRateFormatter.format(dr));
}
public BotController getBotController() {
return controller;
}
public void setController(BotController bsc) {
this.controller = bsc;
}
@Override
public void dispose() {
controller.removeView(this);
}
public void setBatterySliderEnabled(boolean enabled) {
batterySlider.setEnabled(enabled);
}
public void setGripperSliderEnabled(boolean enabled) {
numberOfGrippersSlider.setEnabled(enabled);
}
public void setSpeedSliderEnabled(boolean enabled) {
speedSlider.setEnabled(enabled);
}
public void setSizeSliderEnabled(boolean enabled) {
sizeSlider.setEnabled(enabled);
}
public JCheckBox getMovespeedCheckbox() {
return movespeedCheckbox;
}
}