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}