package nl.tudelft.bw4t.scenariogui.editor.controller;
import javax.swing.JOptionPane;
import nl.tudelft.bw4t.scenariogui.BW4TClientConfig;
import nl.tudelft.bw4t.scenariogui.ScenarioEditor;
import nl.tudelft.bw4t.scenariogui.editor.gui.ConfigurationPanel;
import nl.tudelft.bw4t.scenariogui.editor.gui.EntityPanel;
import nl.tudelft.bw4t.scenariogui.editor.gui.MainPanel;
import nl.tudelft.bw4t.scenariogui.editor.gui.MenuBar;
/**
* The Controller class is in charge of all events that happen on the GUI.
* It delegates all events to classes implementing ActionListener,
* sending the view along as an argument.
*
*
* @version 0.1
* @since 12-05-2014
*/
public class ScenarioEditorController {
public static final String CONFIRM_SAVE_TXT = "Do you want to save the current configuration?";
private ScenarioEditor view;
private BW4TClientConfig model;
private MainPanel mainPanel;
private ConfigurationPanel configurationPanel;
/**
* Create a controllers object to control all ActionEvents.
*
* @param newView used to call relevant functions by the event listeners.
* @param model The model used.
*/
public ScenarioEditorController(final ScenarioEditor newView, BW4TClientConfig model) {
this.view = newView;
this.model = model;
mainPanel = newView.getMainPanel();
configurationPanel = mainPanel.getConfigurationPanel();
addConfigurationPanelListeners();
addMenuBarListeners();
addEntityPanelListeners();
getMainView().addWindowListener(new WindowExit(getMainView()));
}
private void addConfigurationPanelListeners() {
configurationPanel.addClientIPController(new WriteClientIP(mainPanel));
configurationPanel.addClientPortController(new WriteClientPort(mainPanel));
configurationPanel.addServerIPController(new WriteServerIP(mainPanel));
configurationPanel.addServerPortController(new WriteServerPort(mainPanel));
configurationPanel.addGUIYesCheckboxController(new SelectLaunchGUIYes(mainPanel));
configurationPanel.addGUINoCheckboxController(new SelectLaunchGUINo(mainPanel));
configurationPanel.addPathsYesCheckboxController(new SelectVisualizePathsYes(mainPanel));
configurationPanel.addPathsNoCheckboxController(new SelectVisualizePathsNo(mainPanel));
configurationPanel.addCollisionsYesCheckboxController(new SelectEnableCollisionsYes(mainPanel));
configurationPanel.addCollisionsNoCheckboxController(new SelectEnableCollisionsNo(mainPanel));
configurationPanel.addMapFileController(new WriteMapFile(mainPanel));
configurationPanel.addMapFileButtonController(new ChooseMapFileListener(mainPanel));
}
private void addMenuBarListeners() {
MenuBar menuBar = view.getTopMenuBar();
menuBar.addExitController(new MenuOptionExit(menuBar, this, getModel()));
menuBar.addNewController(new MenuOptionNew(menuBar, this, getModel()));
menuBar.addOpenController(new MenuOptionOpen(menuBar, this, getModel()));
menuBar.addSaveController(new MenuOptionSave(menuBar, this, getModel()));
menuBar.addSaveAsController(new MenuOptionSaveAs(menuBar, this, getModel()));
menuBar.addExportController(new MenuOptionExport(menuBar, this, getModel()));
}
private void addEntityPanelListeners() {
EntityPanel entityPanel = mainPanel.getEntityPanel();
entityPanel.addNewBotController(new AddNewBot(mainPanel, getModel()));
entityPanel.addModifyBotController(new ModifyBot(mainPanel, getModel()));
entityPanel.addDeleteBotController(new DeleteBot(mainPanel, getModel()));
entityPanel.addNewEpartnerController(new AddNewEPartner(mainPanel, getModel()));
entityPanel.addModifyEpartnerController(new ModifyEPartner(mainPanel, getModel()));
entityPanel.addDeleteEpartnerController(new DeleteEPartner(mainPanel, getModel()));
entityPanel.addDropDownController(new BotDropDownButton(mainPanel));
addStandardBotDropDownListeners();
entityPanel.addBotTableModelController(new UpdateBotCount(mainPanel, getModel()));
entityPanel.addEpartnerTableModelController(new UpdateEPartnerCount(mainPanel, getModel()));
entityPanel.addBotTableController(new EditBotTable(getMainView().getMainPanel(), getModel()));
entityPanel.addEpartnerTableController(new EditEPartnerTable(getMainView().getMainPanel(), getModel()));
}
/**
* Adds the listeners for the default bot dropdown menu.
*/
private void addStandardBotDropDownListeners() {
EntityPanel entityPanel = mainPanel.getEntityPanel();
entityPanel.addNewStandardBotController(new AddNewBot(mainPanel, getModel()));
entityPanel.addNewStandardBotBigController(new AddNewStandardBotBig(mainPanel, getModel()));
entityPanel.addNewStandardBotGripperController(new AddNewStandardBotGripper(mainPanel, getModel()));
entityPanel.addNewStandardBotBigGripperController(new AddNewStandardBotBigGripper(mainPanel, getModel()));
entityPanel.addNewStandardBotSeeerController(new AddNewStandardBotSeeer(mainPanel, getModel()));
entityPanel.addNewStandardBotBigSeeerController(new AddNewStandardBotBigSeeer(mainPanel, getModel()));
entityPanel.addNewStandardBotCommunicatorController(new AddNewStandardBotCommunicator(mainPanel, getModel()));
entityPanel.addNewStandardBotBigCommunicatorController(new AddNewStandardBotBigCommunicator(mainPanel, getModel()));
}
/**
* Return the view being controlled.
*
* @return The JFrame being controlled.
*/
public final ScenarioEditor getMainView() {
return view;
}
/**
* Return the BW4TClientConfig model.
*
* @return The BW4TClientConfig model.
*/
public final BW4TClientConfig getModel() {
return model;
}
/**
* Checks if the configuration has been changed.
* @return returns true if either the configuration, the bot list or the epartners list has been changed.
*/
public boolean hasConfigBeenModified() {
boolean configurationEqual = configurationPanel.getOldValues().equals(configurationPanel.getCurrentValues());
boolean botsEqual = model.compareBotConfigs(model.getOldBots());
boolean epartnersEqual = model.compareEpartnerConfigs(model.getOldEpartners());
return !(configurationEqual && botsEqual && epartnersEqual);
}
/**
* Ask the user if (s)he wishes to save the scenario.
* @return True if the user wishes to save the scenario.
*/
public boolean promptUserToSave() {
// Check if user wants to save current configuration
int response = ScenarioEditor.getOptionPrompt().showConfirmDialog(
null, ScenarioEditorController.CONFIRM_SAVE_TXT, "",
JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
return response == JOptionPane.YES_OPTION;
}
}