001package jmri.jmrit.logixng.expressions.swing; 002 003import java.util.List; 004 005import javax.annotation.CheckForNull; 006import javax.annotation.Nonnull; 007import javax.swing.*; 008 009import jmri.*; 010import jmri.jmrit.logixng.*; 011import jmri.jmrit.logixng.expressions.ExpressionSection; 012import jmri.jmrit.logixng.expressions.ExpressionSection.SectionState; 013import jmri.jmrit.logixng.swing.SwingConfiguratorInterface; 014import jmri.jmrit.logixng.util.swing.LogixNG_SelectNamedBeanSwing; 015import jmri.jmrit.logixng.util.swing.LogixNG_SelectEnumSwing; 016import jmri.util.swing.JComboBoxUtil; 017 018/** 019 * Configures an ExpressionSection object with a Swing JPanel. 020 * 021 * @author Dave Sand Copyright 2023 022 */ 023public class ExpressionSectionSwing extends AbstractDigitalExpressionSwing { 024 025 private LogixNG_SelectNamedBeanSwing<Section> _selectNamedBeanSwing; 026 private LogixNG_SelectEnumSwing<SectionState> _selectSectionStateSwing; 027 028 private JComboBox<Is_IsNot_Enum> _is_IsNot_ComboBox; 029 030 031 @Override 032 protected void createPanel(@CheckForNull Base object, @Nonnull JPanel buttonPanel) { 033 ExpressionSection expression = (ExpressionSection)object; 034 035 panel = new JPanel(); 036 037 _selectNamedBeanSwing = new LogixNG_SelectNamedBeanSwing<>( 038 InstanceManager.getDefault(SectionManager.class), getJDialog(), this); 039 040 _selectSectionStateSwing = new LogixNG_SelectEnumSwing<>(getJDialog(), this); 041 042 JPanel tabbedPaneNamedBean; 043 JPanel tabbedPaneSectionState; 044 045 if (expression != null) { 046 tabbedPaneNamedBean = _selectNamedBeanSwing.createPanel(expression.getSelectNamedBean()); 047 tabbedPaneSectionState = _selectSectionStateSwing.createPanel(expression.getSelectEnum(), SectionState.values()); 048 } else { 049 tabbedPaneNamedBean = _selectNamedBeanSwing.createPanel(null); 050 tabbedPaneSectionState = _selectSectionStateSwing.createPanel(null, SectionState.values()); 051 } 052 053 _is_IsNot_ComboBox = new JComboBox<>(); 054 for (Is_IsNot_Enum e : Is_IsNot_Enum.values()) { 055 _is_IsNot_ComboBox.addItem(e); 056 } 057 JComboBoxUtil.setupComboBoxMaxRows(_is_IsNot_ComboBox); 058 059 _selectSectionStateSwing.addAddressingListener(e -> { setDataPanelState(); }); 060 _selectSectionStateSwing.addEnumListener(e -> { setDataPanelState(); }); 061 062 setDataPanelState(); 063 064 if (expression != null) { 065 _is_IsNot_ComboBox.setSelectedItem(expression.get_Is_IsNot()); 066 } 067 068 JComponent[] components = new JComponent[]{ 069 tabbedPaneNamedBean, 070 _is_IsNot_ComboBox, 071 tabbedPaneSectionState}; 072 073 List<JComponent> componentList = SwingConfiguratorInterface.parseMessage( 074 Bundle.getMessage("ExpressionSection_Components"), components); 075 076 for (JComponent c : componentList) panel.add(c); 077 } 078 079 private void setDataPanelState() { 080// boolean newState = (_selectSectionStateSwing.getAddressing() != NamedBeanAddressing.Direct) 081// || (_selectSectionStateSwing.getEnum() == BlockState.ValueMatches); 082 } 083 084 /** {@inheritDoc} */ 085 @Override 086 public boolean validate(@Nonnull List<String> errorMessages) { 087 ExpressionSection expression = new ExpressionSection("IQDE1", null); 088 _selectNamedBeanSwing.validate(expression.getSelectNamedBean(), errorMessages); 089 _selectSectionStateSwing.validate(expression.getSelectEnum(), errorMessages); 090 091 // The Occupied option requires a Direct bean reference. 092 if (_selectSectionStateSwing.getEnum() == SectionState.Occupied) { 093 if (_selectNamedBeanSwing.getAddressing() == NamedBeanAddressing.Direct) { 094 if (_selectNamedBeanSwing.getBean() == null) { 095 errorMessages.add(Bundle.getMessage("ExpressionSection_BeanNameError")); 096 } 097 } else { 098 errorMessages.add(Bundle.getMessage("ExpressionSection_RequireDirect")); 099 } 100 } 101 102 return errorMessages.isEmpty(); 103 } 104 105 /** {@inheritDoc} */ 106 @Override 107 public String getAutoSystemName() { 108 return InstanceManager.getDefault(DigitalExpressionManager.class).getAutoSystemName(); 109 } 110 111 /** {@inheritDoc} */ 112 @Override 113 public MaleSocket createNewObject(@Nonnull String systemName, @CheckForNull String userName) { 114 ExpressionSection expression = new ExpressionSection(systemName, userName); 115 updateObject(expression); 116 return InstanceManager.getDefault(DigitalExpressionManager.class).registerExpression(expression); 117 } 118 119 /** {@inheritDoc} */ 120 @Override 121 public void updateObject(@Nonnull Base object) { 122 if (! (object instanceof ExpressionSection)) { 123 throw new IllegalArgumentException("object must be an ExpressionBlock but is a: "+object.getClass().getName()); 124 } 125 126 ExpressionSection expression = (ExpressionSection) object; 127 128 _selectNamedBeanSwing.updateObject(expression.getSelectNamedBean()); 129 _selectSectionStateSwing.updateObject(expression.getSelectEnum()); 130 131 expression.set_Is_IsNot((Is_IsNot_Enum)_is_IsNot_ComboBox.getSelectedItem()); 132 } 133 134 /** {@inheritDoc} */ 135 @Override 136 public String toString() { 137 return Bundle.getMessage("Section_Short"); 138 } 139 140 @Override 141 public void dispose() { 142 _selectNamedBeanSwing.dispose(); 143 } 144 145// private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(ExpressionSectionSwing.class); 146}