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}