package tmcsim.simulationmanager.actions;
import java.awt.event.ActionEvent;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.AbstractAction;
import javax.swing.JComboBox;
import tmcsim.cadmodels.CMSDiversion;
import tmcsim.common.SimulationException;
import tmcsim.simulationmanager.SimulationManagerView;
import tmcsim.simulationmanager.dialogs.CMSDiversionDialog;
/**
* ApplyDiversionAction is an AbstractAction that is used for settings traffic
* diversions in the simulation. When the action is performed, the action gets
* the selected CMS ID from the CMSIDComboBox in the SimulationManagerView.
* The action then calls the SimulationManagerModel to get the current CMSInfo
* for this id. The CMSDiversionDialog is then shown with this CMSInfo. If
* the user updates the diversions at this CMS, the new info is sent to the
* SimulationManagerModel to update the current diversions.
*
*
* The CMS_ID_COMBO_BOX key should be assigned the CMSID JComboBox object
* from the SimulationManagerView object.
*/
@SuppressWarnings("serial")
public class ApplyDiversionAction extends AbstractAction {
/**
* This key string is used to reference the CMSID JComboBox object
* from the SimulationManagerView object.
*/
public static final String CMS_ID_COMBO_BOX = "CMS_ID_COMBO_BOX";
/** Reference to the SimulationManagerView object. */
private SimulationManagerView theSimManagerView = null;
/** CMSDiversionDialog used for updating diversions in the simulation. */
private CMSDiversionDialog theCMSDiversionDialog;
/**
* Constructor.
* @param view View class object for the Simulation Manager.
*/
public ApplyDiversionAction(SimulationManagerView view) {
super("Divert Traffic");
theSimManagerView = view;
theCMSDiversionDialog = new CMSDiversionDialog(theSimManagerView);
}
public void actionPerformed(ActionEvent evt) {
if(getValue(CMS_ID_COMBO_BOX) == null) {
Logger.getLogger("tmcsim.simulationmanager.actions").logp(
Level.WARNING, "ApplyDiversionAction",
"actionPerformed",
"Object for CMS_ID_COMBO_BOX is null.");
return;
}
showDiversionDialog((String)((JComboBox)getValue(CMS_ID_COMBO_BOX)).getSelectedItem());
}
public void showDiversionDialog(final String cms_id) {
Runnable divertRunnable = new Runnable(){
public void run() {
try{
theCMSDiversionDialog.showDialog(
theSimManagerView.getModel().getCMSDiversionInfo(cms_id));
long currentSimTime = theSimManagerView.getCurrentSimTime();
if(theCMSDiversionDialog.theCMSInfo.isUpdated()) {
for(CMSDiversion div : theCMSDiversionDialog.theCMSInfo.possibleDiversions) {
if(div.isUpdated()) {
div.timeApplied = currentSimTime;
theSimManagerView.removeDiversion(theCMSDiversionDialog.theCMSInfo, div);
if(!div.isCleared()) {
theSimManagerView.addDiversion(theCMSDiversionDialog.theCMSInfo, div);
}
}
}
theSimManagerView.getModel().applyDiversions(theCMSDiversionDialog.theCMSInfo);
}
}
catch (SimulationException se) {
theSimManagerView.SimulationExceptionHandler(se);
}
}
};
Thread theThread = new Thread(divertRunnable);
theThread.start();
}
}