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