001package jmri.jmrit.logixng.actions;
002
003import java.util.*;
004
005import jmri.*;
006import jmri.jmrit.logixng.*;
007import jmri.jmrit.logixng.util.*;
008import jmri.jmrit.logixng.util.parser.*;
009import jmri.util.ThreadingUtil;
010
011/**
012 * This action sets the lock of a turnout.
013 *
014 * @author Daniel Bergqvist Copyright 2021
015 */
016public class ActionTurnoutLock extends AbstractDigitalAction {
017
018    private final LogixNG_SelectNamedBean<Turnout> _selectNamedBean =
019            new LogixNG_SelectNamedBean<>(
020                    this, Turnout.class, InstanceManager.getDefault(TurnoutManager.class));
021
022    private final LogixNG_SelectEnum<TurnoutLock> _selectEnum =
023            new LogixNG_SelectEnum<>(this, TurnoutLock.values(), TurnoutLock.Unlock);
024
025
026    public ActionTurnoutLock(String sys, String user)
027            throws BadUserNameException, BadSystemNameException {
028        super(sys, user);
029    }
030
031    @Override
032    public Base getDeepCopy(Map<String, String> systemNames, Map<String, String> userNames) throws ParserException {
033        DigitalActionManager manager = InstanceManager.getDefault(DigitalActionManager.class);
034        String sysName = systemNames.get(getSystemName());
035        String userName = userNames.get(getSystemName());
036        if (sysName == null) sysName = manager.getAutoSystemName();
037        ActionTurnoutLock copy = new ActionTurnoutLock(sysName, userName);
038        copy.setComment(getComment());
039        _selectNamedBean.copy(copy._selectNamedBean);
040        _selectEnum.copy(copy._selectEnum);
041        return manager.registerAction(copy);
042    }
043
044    public LogixNG_SelectNamedBean<Turnout> getSelectNamedBean() {
045        return _selectNamedBean;
046    }
047
048    public LogixNG_SelectEnum<TurnoutLock> getSelectEnum() {
049        return _selectEnum;
050    }
051
052    /** {@inheritDoc} */
053    @Override
054    public LogixNG_Category getCategory() {
055        return LogixNG_Category.ITEM;
056    }
057
058    /** {@inheritDoc} */
059    @Override
060    public void execute() throws JmriException {
061        Turnout turnout = _selectNamedBean.evaluateNamedBean(getConditionalNG());
062
063        if (turnout == null) return;
064
065        TurnoutLock lock = _selectEnum.evaluateEnum(getConditionalNG());
066
067        if (lock == TurnoutLock.Toggle) {
068            if (turnout.getLocked(Turnout.CABLOCKOUT)) {
069                lock = TurnoutLock.Unlock;
070            } else {
071                lock = TurnoutLock.Lock;
072            }
073        }
074
075        // Variables used in lambda must be effectively final
076        TurnoutLock theLock = lock;
077
078        ThreadingUtil.runOnLayoutWithJmriException(() -> {
079            if (theLock == TurnoutLock.Lock) {
080                turnout.setLocked(Turnout.CABLOCKOUT + Turnout.PUSHBUTTONLOCKOUT, true);
081            } else if (theLock == TurnoutLock.Unlock) {
082                turnout.setLocked(Turnout.CABLOCKOUT + Turnout.PUSHBUTTONLOCKOUT, false);
083            }
084        });
085    }
086
087    @Override
088    public FemaleSocket getChild(int index) throws IllegalArgumentException, UnsupportedOperationException {
089        throw new UnsupportedOperationException("Not supported.");
090    }
091
092    @Override
093    public int getChildCount() {
094        return 0;
095    }
096
097    @Override
098    public String getShortDescription(Locale locale) {
099        return Bundle.getMessage(locale, "TurnoutLock_Short");
100    }
101
102    @Override
103    public String getLongDescription(Locale locale) {
104        String namedBean = _selectNamedBean.getDescription(locale);
105        String state = _selectEnum.getDescription(locale);
106
107        return Bundle.getMessage(locale, "TurnoutLock_Long", namedBean, state);
108    }
109
110    /** {@inheritDoc} */
111    @Override
112    public void setup() {
113        // Do nothing
114    }
115
116    /** {@inheritDoc} */
117    @Override
118    public void disposeMe() {
119    }
120
121
122    public enum TurnoutLock {
123        Lock(Bundle.getMessage("TurnoutLock_Lock")),
124        Unlock(Bundle.getMessage("TurnoutLock_Unlock")),
125        Toggle(Bundle.getMessage("TurnoutLock_Toggle"));
126
127        private final String _text;
128
129        private TurnoutLock(String text) {
130            this._text = text;
131        }
132
133        @Override
134        public String toString() {
135            return _text;
136        }
137
138    }
139
140    /** {@inheritDoc} */
141    @Override
142    public void getUsageDetail(int level, NamedBean bean, List<NamedBeanUsageReport> report, NamedBean cdl) {
143        _selectNamedBean.getUsageDetail(level, bean, report, cdl, this, LogixNG_SelectNamedBean.Type.Action);
144    }
145
146//    private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(ActionTurnoutLock.class);
147
148}