001package jmri.jmrit.logixng.util.swing;
002
003import java.util.List;
004
005import javax.annotation.Nonnull;
006import javax.swing.*;
007
008import jmri.*;
009import jmri.jmrit.logixng.*;
010import jmri.jmrit.logixng.swing.SwingConfiguratorInterface;
011import jmri.jmrit.logixng.util.LogixNG_SelectDouble;
012import jmri.jmrit.logixng.util.parser.ParserException;
013import jmri.util.swing.BeanSelectPanel;
014
015/**
016 * Swing class for jmri.jmrit.logixng.util.LogixNG_SelectDouble.
017 *
018 * @author Daniel Bergqvist (C) 2022
019 */
020public class LogixNG_SelectDoubleSwing {
021
022    private final JDialog _dialog;
023    private final LogixNG_SelectTableSwing _selectTableSwing;
024
025    private JTabbedPane _tabbedPane;
026    private JTextField _valueTextField;
027    private JPanel _panelDirect;
028    private JPanel _panelReference;
029    private JPanel _panelMemory;
030    private JPanel _panelLocalVariable;
031    private JPanel _panelFormula;
032    private JPanel _panelTable;
033    private JTextField _referenceTextField;
034    private BeanSelectPanel<Memory> _memoryPanel;
035    private JTextField _localVariableTextField;
036    private JTextField _formulaTextField;
037
038
039    public LogixNG_SelectDoubleSwing(
040            @Nonnull JDialog dialog,
041            @Nonnull SwingConfiguratorInterface swi) {
042        _dialog = dialog;
043        _selectTableSwing = new LogixNG_SelectTableSwing(_dialog, swi);
044    }
045
046    public JPanel createPanel(@Nonnull LogixNG_SelectDouble selectDouble) {
047
048        LogixNG_SelectDouble.FormatterParserValidator _formatterParserValidator
049                = selectDouble.getFormatterParserValidator();
050
051        JPanel panel = new JPanel();
052
053        _tabbedPane = new JTabbedPane();
054        _panelDirect = new javax.swing.JPanel();
055        _panelReference = new javax.swing.JPanel();
056        _panelMemory = new JPanel();
057        _panelLocalVariable = new javax.swing.JPanel();
058        _panelFormula = new javax.swing.JPanel();
059        _panelTable = _selectTableSwing.createPanel(selectDouble.getSelectTable());
060
061        _memoryPanel = new BeanSelectPanel<>(InstanceManager.getDefault(MemoryManager.class), null);
062
063        _panelMemory.setLayout(new BoxLayout(_panelMemory, BoxLayout.Y_AXIS));
064        _panelMemory.add(_memoryPanel);
065
066        _tabbedPane.addTab(NamedBeanAddressing.Direct.toString(), _panelDirect);
067        _tabbedPane.addTab(NamedBeanAddressing.Reference.toString(), _panelReference);
068        _tabbedPane.addTab(NamedBeanAddressing.Memory.toString(), _panelMemory);
069        _tabbedPane.addTab(NamedBeanAddressing.LocalVariable.toString(), _panelLocalVariable);
070        _tabbedPane.addTab(NamedBeanAddressing.Formula.toString(), _panelFormula);
071        _tabbedPane.addTab(NamedBeanAddressing.Table.toString(), _panelTable);
072
073        _valueTextField = new JTextField(30);
074        _valueTextField.setText(_formatterParserValidator.format(
075                _formatterParserValidator.getInitialValue()));
076        _panelDirect.add(_valueTextField);
077
078        _referenceTextField = new JTextField();
079        _referenceTextField.setColumns(30);
080        _panelReference.add(_referenceTextField);
081
082        _localVariableTextField = new JTextField();
083        _localVariableTextField.setColumns(30);
084        _panelLocalVariable.add(_localVariableTextField);
085
086        _formulaTextField = new JTextField();
087        _formulaTextField.setColumns(30);
088        _panelFormula.add(_formulaTextField);
089
090
091        switch (selectDouble.getAddressing()) {
092            case Direct: _tabbedPane.setSelectedComponent(_panelDirect); break;
093            case Reference: _tabbedPane.setSelectedComponent(_panelReference); break;
094            case Memory: _tabbedPane.setSelectedComponent(_panelMemory); break;
095            case LocalVariable: _tabbedPane.setSelectedComponent(_panelLocalVariable); break;
096            case Formula: _tabbedPane.setSelectedComponent(_panelFormula); break;
097            case Table: _tabbedPane.setSelectedComponent(_panelTable); break;
098            default: throw new IllegalArgumentException("invalid _addressing state: " + selectDouble.getAddressing().name());
099        }
100        _valueTextField.setText(_formatterParserValidator.format(selectDouble.getValue()));
101        _referenceTextField.setText(selectDouble.getReference());
102        _memoryPanel.setDefaultNamedBean(selectDouble.getMemory());
103        _localVariableTextField.setText(selectDouble.getLocalVariable());
104        _formulaTextField.setText(selectDouble.getFormula());
105
106        panel.add(_tabbedPane);
107        return panel;
108    }
109
110    public boolean validate(
111            @Nonnull LogixNG_SelectDouble selectDouble,
112            @Nonnull List<String> errorMessages) {
113
114        if (_tabbedPane.getSelectedComponent() == _panelDirect) {
115            String result = selectDouble.getFormatterParserValidator()
116                    .validate(_valueTextField.getText());
117            if (result != null) errorMessages.add(result);
118        }
119
120        try {
121            if (_tabbedPane.getSelectedComponent() == _panelReference) {
122                selectDouble.setReference(_referenceTextField.getText());
123            }
124        } catch (IllegalArgumentException e) {
125            errorMessages.add(e.getMessage());
126            return false;
127        }
128
129        try {
130            selectDouble.setFormula(_formulaTextField.getText());
131            if (_tabbedPane.getSelectedComponent() == _panelDirect) {
132                selectDouble.setAddressing(NamedBeanAddressing.Direct);
133            } else if (_tabbedPane.getSelectedComponent() == _panelReference) {
134                selectDouble.setAddressing(NamedBeanAddressing.Reference);
135            } else if (_tabbedPane.getSelectedComponent() == _panelMemory) {
136                selectDouble.setAddressing(NamedBeanAddressing.Memory);
137            } else if (_tabbedPane.getSelectedComponent() == _panelLocalVariable) {
138                selectDouble.setAddressing(NamedBeanAddressing.LocalVariable);
139            } else if (_tabbedPane.getSelectedComponent() == _panelFormula) {
140                selectDouble.setAddressing(NamedBeanAddressing.Formula);
141            } else if (_tabbedPane.getSelectedComponent() == _panelTable) {
142                selectDouble.setAddressing(NamedBeanAddressing.Table);
143            } else {
144                throw new IllegalArgumentException("_tabbedPane has unknown selection");
145            }
146        } catch (ParserException e) {
147            errorMessages.add("Cannot parse formula: " + e.getMessage());
148            return false;
149        }
150
151        _selectTableSwing.validate(selectDouble.getSelectTable(), errorMessages);
152
153        return errorMessages.isEmpty();
154    }
155
156    public void updateObject(@Nonnull LogixNG_SelectDouble selectDouble) {
157
158        if (_tabbedPane.getSelectedComponent() == _panelDirect) {
159            selectDouble.setValue(selectDouble.getFormatterParserValidator()
160                    .parse(_valueTextField.getText()));
161        }
162
163        try {
164            if (_tabbedPane.getSelectedComponent() == _panelDirect) {
165                selectDouble.setAddressing(NamedBeanAddressing.Direct);
166            } else if (_tabbedPane.getSelectedComponent() == _panelReference) {
167                selectDouble.setAddressing(NamedBeanAddressing.Reference);
168                selectDouble.setReference(_referenceTextField.getText());
169            } else if (_tabbedPane.getSelectedComponent() == _panelMemory) {
170                selectDouble.setAddressing(NamedBeanAddressing.Memory);
171                selectDouble.setMemory(_memoryPanel.getNamedBean());
172            } else if (_tabbedPane.getSelectedComponent() == _panelLocalVariable) {
173                selectDouble.setAddressing(NamedBeanAddressing.LocalVariable);
174                selectDouble.setLocalVariable(_localVariableTextField.getText());
175            } else if (_tabbedPane.getSelectedComponent() == _panelFormula) {
176                selectDouble.setAddressing(NamedBeanAddressing.Formula);
177                selectDouble.setFormula(_formulaTextField.getText());
178            } else if (_tabbedPane.getSelectedComponent() == _panelTable) {
179                selectDouble.setAddressing(NamedBeanAddressing.Table);
180            } else {
181                throw new IllegalArgumentException("_tabbedPaneEnum has unknown selection");
182            }
183        } catch (ParserException e) {
184            throw new RuntimeException("ParserException: "+e.getMessage(), e);
185        }
186
187        _selectTableSwing.updateObject(selectDouble.getSelectTable());
188    }
189
190    public void dispose() {
191        _selectTableSwing.dispose();
192    }
193
194}