001package jmri.jmrit.operations.automation.actions;
002
003import java.beans.PropertyChangeEvent;
004import java.beans.PropertyChangeListener;
005
006import javax.swing.JComboBox;
007
008import org.slf4j.Logger;
009import org.slf4j.LoggerFactory;
010
011import jmri.InstanceManager;
012import jmri.jmrit.operations.automation.Automation;
013import jmri.jmrit.operations.automation.AutomationManager;
014import jmri.jmrit.operations.setup.Control;
015
016public class WaitAutomationAction extends Action implements PropertyChangeListener {
017
018    private static final int _code = ActionCodes.WAIT_AUTOMATION;
019
020    @Override
021    public int getCode() {
022        return _code;
023    }
024
025    @Override
026    public String getName() {
027        return Bundle.getMessage("WaitAutomation");
028    }
029
030    @Override
031    public boolean isConcurrentAction() {
032        return true;
033    }
034
035    @Override
036    public void doAction() {
037        if (getAutomationItem() != null) {
038            Automation automation = getAutomationItem().getAutomationToRun();
039            if (automation != null) {
040                automation.addPropertyChangeListener(this);
041                if (automation.isRunning()) {
042                    setRunning(true);
043                } else {
044                    automation.removePropertyChangeListener(this);
045                    finishAction(automation.getActionStatus().equals(getActionSuccessfulString()));
046                }
047            } else {
048                finishAction(false);
049            }
050        }
051    }
052
053    /**
054     * Wait for automation to complete.
055     *
056     */
057    private void automationUpdate(PropertyChangeEvent evt) {
058        if (getAutomationItem() != null) {
059            if (evt.getPropertyName().equals(Automation.RUNNING_CHANGED_PROPERTY)) {
060                Automation automation = getAutomationItem().getAutomationToRun();
061                automation.removePropertyChangeListener(this);
062                finishAction(automation.getActionStatus().equals(getActionSuccessfulString()));
063            }
064        }
065    }
066
067    @Override
068    public void cancelAction() {
069        if (getAutomationItem() != null) {
070            setRunning(false);
071            Automation automation = getAutomationItem().getAutomationToRun();
072            if (automation != null) {
073                automation.removePropertyChangeListener(this);
074            }
075        }
076    }
077    
078    @Override
079    public JComboBox<Automation> getComboBox() {
080        if (getAutomationItem() != null) {
081            JComboBox<Automation> cb = InstanceManager.getDefault(AutomationManager.class).getComboBox();
082            cb.setSelectedItem(getAutomationItem().getAutomationToRun());
083            return cb;
084        }
085        return null;
086    }
087
088    @Override
089    public void propertyChange(PropertyChangeEvent evt) {
090        if (Control.SHOW_PROPERTY)
091            log.debug("Property change AutomationItem {}: ({}) old: ({}) new: ({})", getAutomationItem().getId(),
092                    evt.getPropertyName(), evt.getOldValue(), evt.getNewValue());
093        automationUpdate(evt);
094    }
095
096    private static final Logger log = LoggerFactory.getLogger(WaitAutomationAction.class);
097
098}