001package jmri.jmrit.logixng.expressions.swing;
002
003import java.text.ParseException;
004import java.util.List;
005import java.util.Locale;
006
007import javax.annotation.CheckForNull;
008import javax.annotation.Nonnull;
009import javax.swing.JLabel;
010import javax.swing.JPanel;
011import javax.swing.JTextField;
012
013import jmri.InstanceManager;
014import jmri.jmrit.logixng.Base;
015import jmri.jmrit.logixng.AnalogExpressionManager;
016import jmri.jmrit.logixng.MaleSocket;
017import jmri.jmrit.logixng.expressions.AnalogExpressionConstant;
018import jmri.util.IntlUtilities;
019
020/**
021 * Configures an ActionTurnout object with a Swing JPanel.
022 * 
023 * @author Daniel Bergqvist Copyright 2021
024 */
025public class AnalogExpressionConstantSwing extends AbstractAnalogExpressionSwing {
026
027    private JTextField _constant;
028
029    @Override
030    protected void createPanel(@CheckForNull Base object, @Nonnull JPanel buttonPanel) {
031        AnalogExpressionConstant expression = (AnalogExpressionConstant)object;
032        panel = new JPanel();
033        JLabel label = new JLabel(Bundle.getMessage("AnalogExpressionConstant_Constant"));
034        _constant = new JTextField();
035        _constant.setColumns(10);
036        if (expression != null) {
037            _constant.setText(String.format(Locale.getDefault(), "%1.2f", expression.getValue()));
038        }
039        panel.add(label);
040        panel.add(_constant);
041    }
042
043    /** {@inheritDoc} */
044    @Override
045    public boolean validate(@Nonnull List<String> errorMessages) {
046        if (_constant.getText().isEmpty()) {
047            return true;
048        }
049
050        try {
051            Double d = IntlUtilities.doubleValue(_constant.getText());
052            log.debug("validated number {} passes try / catch", d);
053            return true;
054        } catch (ParseException e) {
055            errorMessages.add(Bundle.getMessage("AnalogExpressionConstant_NotANumber", _constant.getText()));
056            return false;
057        }
058    }
059
060    /** {@inheritDoc} */
061    @Override
062    public MaleSocket createNewObject(@Nonnull String systemName, @CheckForNull String userName) {
063        AnalogExpressionConstant expression = new AnalogExpressionConstant(systemName, userName);
064        updateObject(expression);
065        return InstanceManager.getDefault(AnalogExpressionManager.class).registerExpression(expression);
066    }
067
068    /** {@inheritDoc} */
069    @Override
070    public void updateObject(@Nonnull Base object) {
071        if (!(object instanceof AnalogExpressionConstant)) {
072            throw new IllegalArgumentException("object must be an AnalogExpressionConstant but is a: "
073                + object.getClass().getName());
074        }
075
076        AnalogExpressionConstant expression = (AnalogExpressionConstant)object;
077
078        if (!_constant.getText().isEmpty()) {
079            try {
080                expression.setValue(IntlUtilities.doubleValue(_constant.getText()));
081            } catch (ParseException ex) {
082                log.error("Could not generate Double constant from {}", _constant.getText(), ex);
083            }
084        } else {
085            expression.setValue(0.0);
086        }
087    }
088
089    /** {@inheritDoc} */
090    @Override
091    public String toString() {
092        return Bundle.getMessage("AnalogExpressionConstant_Short");
093    }
094    
095    @Override
096    public void dispose() {
097    }
098
099    private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(AnalogExpressionConstantSwing.class);
100
101}