001package jmri.jmrit.logixng.expressions;
002
003import java.beans.PropertyChangeEvent;
004import java.beans.PropertyChangeListener;
005import java.util.*;
006
007import jmri.*;
008import jmri.jmrit.logixng.*;
009import jmri.jmrit.logixng.util.LogixNG_SelectNamedBean;
010
011/**
012 * Reads a Memory.
013 *
014 * @author Daniel Bergqvist Copyright 2018
015 */
016public class AnalogExpressionMemory extends AbstractAnalogExpression
017        implements PropertyChangeListener {
018
019    private final LogixNG_SelectNamedBean<Memory> _selectNamedBean =
020            new LogixNG_SelectNamedBean<>(
021                    this, Memory.class, InstanceManager.getDefault(MemoryManager.class));
022
023    public AnalogExpressionMemory(String sys, String user)
024            throws BadUserNameException, BadSystemNameException {
025
026        super(sys, user);
027    }
028
029    @Override
030    public Base getDeepCopy(Map<String, String> systemNames, Map<String, String> userNames) throws JmriException {
031        AnalogExpressionManager manager = InstanceManager.getDefault(AnalogExpressionManager.class);
032        String sysName = systemNames.get(getSystemName());
033        String userName = userNames.get(getSystemName());
034        if (sysName == null) sysName = manager.getAutoSystemName();
035        AnalogExpressionMemory copy = new AnalogExpressionMemory(sysName, userName);
036        copy.setComment(getComment());
037        _selectNamedBean.copy(copy._selectNamedBean);
038        return manager.registerExpression(copy).deepCopyChildren(this, systemNames, userNames);
039    }
040
041    public LogixNG_SelectNamedBean<Memory> getSelectNamedBean() {
042        return _selectNamedBean;
043    }
044
045    /** {@inheritDoc} */
046    @Override
047    public LogixNG_Category getCategory() {
048        return LogixNG_Category.ITEM;
049    }
050
051    /** {@inheritDoc} */
052    @Override
053    public double evaluate() throws JmriException {
054        Memory memory = _selectNamedBean.evaluateNamedBean(getConditionalNG());
055        if (memory != null) {
056            return jmri.util.TypeConversionUtil.convertToDouble(memory.getValue(), false);
057        } else {
058            return 0.0;
059        }
060    }
061
062    /** {@inheritDoc} */
063    @Override
064    public FemaleSocket getChild(int index)
065            throws IllegalArgumentException, UnsupportedOperationException {
066        throw new UnsupportedOperationException("Not supported.");
067    }
068
069    /** {@inheritDoc} */
070    @Override
071    public int getChildCount() {
072        return 0;
073    }
074
075    /** {@inheritDoc} */
076    @Override
077    public String getShortDescription(Locale locale) {
078        return Bundle.getMessage(locale, "AnalogExpressionMemory_Short");
079    }
080
081    /** {@inheritDoc} */
082    @Override
083    public String getLongDescription(Locale locale) {
084        return Bundle.getMessage(locale, "AnalogExpressionMemory_Long", _selectNamedBean.getDescription(locale));
085    }
086
087    /** {@inheritDoc} */
088    @Override
089    public void setup() {
090        // Do nothing
091    }
092
093    /** {@inheritDoc} */
094    @Override
095    public void registerListenersForThisClass() {
096        if (!_listenersAreRegistered) {
097            _selectNamedBean.addPropertyChangeListener("value", this);
098            _listenersAreRegistered = true;
099        }
100    }
101
102    /** {@inheritDoc} */
103    @Override
104    public void unregisterListenersForThisClass() {
105        if (_listenersAreRegistered) {
106            _selectNamedBean.removePropertyChangeListener("value", this);
107            _listenersAreRegistered = false;
108        }
109    }
110
111    /** {@inheritDoc} */
112    @Override
113    public void propertyChange(PropertyChangeEvent evt) {
114        if (getTriggerOnChange()) {
115            getConditionalNG().execute();
116        }
117    }
118
119    /** {@inheritDoc} */
120    @Override
121    public void disposeMe() {
122    }
123
124    /** {@inheritDoc} */
125    @Override
126    public void getUsageDetail(int level, NamedBean bean, List<NamedBeanUsageReport> report, NamedBean cdl) {
127        log.debug("getUsageReport :: AnalogExpressionMemory: bean = {}, report = {}", cdl, report);
128        _selectNamedBean.getUsageDetail(level, bean, report, cdl, this, LogixNG_SelectNamedBean.Type.Expression);
129    }
130
131    private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(AnalogExpressionMemory.class);
132
133}