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 RunAutomationAction extends Action implements PropertyChangeListener {
017
018    private static final int _code = ActionCodes.RUN_AUTOMATION;
019
020    @Override
021    public int getCode() {
022        return _code;
023    }
024
025    @Override
026    public String getName() {
027        return Bundle.getMessage("RunAutomation");
028    }
029
030    @Override
031    public void doAction() {
032        if (getAutomationItem() != null) {
033            Automation automation = getAutomationItem().getAutomationToRun();
034            if (automation != null) {
035                automation.removePropertyChangeListener(this);
036                automation.addPropertyChangeListener(this);
037                setRunning(true);
038                automation.run();
039            }
040            finishAction(automation != null && automation.getSize() > 0);
041        }
042    }
043
044    @Override
045    public String getStatus() {
046        Automation automation = getAutomationItem().getAutomationToRun();
047        if (getAutomationItem().isActionRan() && getAutomationItem().isActionSuccessful() && automation != null) {
048            // return status of the automation that was selected
049            return automation.getActionStatus();
050        }
051        return super.getStatus();
052    }
053
054    @Override
055    public void cancelAction() {
056        // no cancel for this action
057    }
058
059    @Override
060    public JComboBox<Automation> getComboBox() {
061        if (getAutomationItem() != null) {
062            JComboBox<Automation> cb = InstanceManager.getDefault(AutomationManager.class).getComboBox();
063            cb.setSelectedItem(getAutomationItem().getAutomationToRun());
064            return cb;
065        }
066        return null;
067    }
068
069    private void automationUpdate(PropertyChangeEvent evt) {
070        if (getAutomationItem() != null) {
071            getAutomationItem().firePropertyChange(evt.getPropertyName(), evt.getOldValue(), evt.getNewValue());
072        }
073    }
074
075    @Override
076    public void propertyChange(PropertyChangeEvent evt) {
077        if (Control.SHOW_PROPERTY)
078            log.debug("Property change AutomationItem {}: ({}) old: ({}) new: ({})", getAutomationItem().getId(),
079                    evt.getPropertyName(), evt.getOldValue(), evt.getNewValue());
080        automationUpdate(evt);
081    }
082
083    private static final Logger log = LoggerFactory.getLogger(RunAutomationAction.class);
084}