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}