001package jmri.jmrit.logixng.expressions.swing;
002
003import javax.annotation.CheckForNull;
004import javax.annotation.Nonnull;
005import javax.swing.JPanel;
006
007import jmri.*;
008import jmri.jmrit.logixng.*;
009import jmri.jmrit.logixng.implementation.DefaultSymbolTable;
010import jmri.jmrit.logixng.swing.AbstractSwingConfigurator;
011import jmri.util.swing.JmriJOptionPane;
012
013/**
014 * Abstract class for SwingConfiguratorInterface
015 *
016 * @author Daniel Bergqvist Copyright 2021
017 */
018public abstract class AbstractStringExpressionSwing extends AbstractSwingConfigurator {
019
020    protected JPanel panel;
021
022    /** {@inheritDoc} */
023    @Override
024    public String getExecuteEvaluateMenuText() {
025        return Bundle.getMessage("MenuText_ExecuteEvaluate");
026    }
027
028    /** {@inheritDoc} */
029    @Override
030    public void executeEvaluate(@Nonnull Base object) {
031        ConditionalNG conditionalNG = object.getConditionalNG();
032        if (conditionalNG == null) throw new RuntimeException("Not supported yet");
033
034        SymbolTable symbolTable = new DefaultSymbolTable();
035        getAllSymbols(object, symbolTable);
036
037        conditionalNG.getCurrentThread().runOnLogixNGEventually(() -> {
038            SymbolTable oldSymbolTable = conditionalNG.getSymbolTable();
039
040            try {
041                conditionalNG.setCurrentConditionalNG(conditionalNG);
042                conditionalNG.setSymbolTable(symbolTable);
043                String result = ((StringExpression)object).evaluate();
044                jmri.util.ThreadingUtil.runOnGUIEventually(() -> {
045                    JmriJOptionPane.showMessageDialog(null,
046                            Bundle.getMessage("ExecuteEvaluate_EvaluationCompleted", result),
047                            Bundle.getMessage("ExecuteEvaluate_Title"),
048                            JmriJOptionPane.PLAIN_MESSAGE);
049                });
050            } catch (JmriException | RuntimeException e) {
051                log.warn("ConditionalNG {} got an exception during execute: {}",
052                        conditionalNG.getSystemName(), e, e);
053            }
054
055            conditionalNG.setSymbolTable(oldSymbolTable);
056        });
057    }
058
059    /** {@inheritDoc} */
060    @Override
061    public BaseManager<? extends NamedBean> getManager() {
062        return InstanceManager.getDefault(StringExpressionManager.class);
063    }
064
065    /** {@inheritDoc} */
066    @Override
067    public JPanel getConfigPanel(@Nonnull JPanel buttonPanel) throws IllegalArgumentException {
068        createPanel(null, buttonPanel);
069        return panel;
070    }
071
072    /** {@inheritDoc} */
073    @Override
074    public JPanel getConfigPanel(@Nonnull Base object, @Nonnull JPanel buttonPanel) throws IllegalArgumentException {
075        createPanel(object, buttonPanel);
076        return panel;
077    }
078
079    protected abstract void createPanel(@CheckForNull Base object, @Nonnull JPanel buttonPanel);
080
081    /** {@inheritDoc} */
082    @Override
083    public String getExampleSystemName() {
084        return InstanceManager.getDefault(StringExpressionManager.class).getSystemNamePrefix() + "SE10";
085    }
086
087    /** {@inheritDoc} */
088    @Override
089    public String getAutoSystemName() {
090        return InstanceManager.getDefault(StringExpressionManager.class).getAutoSystemName();
091    }
092
093
094    private final static org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(AbstractStringExpressionSwing.class);
095
096}