001package jmri.jmrix.mqtt.logixng.swing; 002 003import jmri.jmrit.logixng.actions.swing.AbstractDigitalActionSwing; 004 005import java.util.List; 006 007import javax.annotation.CheckForNull; 008import javax.annotation.Nonnull; 009import javax.swing.*; 010 011import jmri.InstanceManager; 012import jmri.jmrit.logixng.*; 013import jmri.jmrix.mqtt.MqttSystemConnectionMemo; 014import jmri.jmrix.mqtt.logixng.Publish; 015import jmri.jmrit.logixng.swing.SwingConfiguratorInterface; 016import jmri.jmrit.logixng.util.swing.LogixNG_SelectStringSwing; 017 018/** 019 * Configures an Publish object with a Swing JPanel. 020 * 021 * @author Daniel Bergqvist Copyright 2022 022 */ 023public class PublishSwing extends AbstractDigitalActionSwing { 024 025 private JComboBox<MqttConnection> _mqttConnection; 026 027 private LogixNG_SelectStringSwing _selectTopicSwing; 028 private LogixNG_SelectStringSwing _selectMessageSwing; 029 030 031 public PublishSwing() { 032 } 033 034 public PublishSwing(JDialog dialog) { 035 super.setJDialog(dialog); 036 } 037 038 @Override 039 protected void createPanel(@CheckForNull Base object, @Nonnull JPanel buttonPanel) { 040 Publish action = (Publish) object; 041 if (action == null) { 042 // Create a temporary action 043 action = new Publish("IQDA1", null, null); 044 } 045 046 _selectTopicSwing = new LogixNG_SelectStringSwing(getJDialog(), this); 047 _selectMessageSwing = new LogixNG_SelectStringSwing(getJDialog(), this); 048 049 panel = new JPanel(); 050 panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 051 052 JPanel tabbedPaneTopic; 053 JPanel tabbedPaneData; 054 055 tabbedPaneTopic = _selectTopicSwing.createPanel(action.getSelectTopic()); 056 tabbedPaneData = _selectMessageSwing.createPanel(action.getSelectMessage()); 057 058 059 JPanel internalPanel = new JPanel(); 060 061 JComponent[] components = new JComponent[]{ 062 tabbedPaneTopic, 063 tabbedPaneData}; 064 065 List<JComponent> componentList = SwingConfiguratorInterface.parseMessage( 066 Bundle.getMessage("Publish_Components"), components); 067 068 for (JComponent c : componentList) internalPanel.add(c); 069 070 JPanel mqttPanel = new JPanel(); 071 mqttPanel.add(new JLabel(Bundle.getMessage("MqttConnection"))); 072 073 _mqttConnection = new JComboBox<>(); 074 List<MqttSystemConnectionMemo> systemConnections = 075 jmri.InstanceManager.getList(MqttSystemConnectionMemo.class); 076 for (MqttSystemConnectionMemo connection : systemConnections) { 077 MqttConnection c = new MqttConnection(connection); 078 _mqttConnection.addItem(c); 079 if (action.getMemo() == connection) { 080 _mqttConnection.setSelectedItem(c); 081 } 082 } 083 mqttPanel.add(_mqttConnection); 084 085 panel.add(internalPanel); 086 panel.add(mqttPanel); 087 } 088 089 /** {@inheritDoc} */ 090 @Override 091 public boolean validate(@Nonnull List<String> errorMessages) { 092 // Create a temporary action to test formula 093 Publish action = new Publish("IQDA1", null, null); 094 095 _selectTopicSwing.validate(action.getSelectTopic(), errorMessages); 096 _selectMessageSwing.validate(action.getSelectMessage(), errorMessages); 097 098 return errorMessages.isEmpty(); 099 } 100 101 /** {@inheritDoc} */ 102 @Override 103 public String getAutoSystemName() { 104 return InstanceManager.getDefault(DigitalActionManager.class).getAutoSystemName(); 105 } 106 107 /** {@inheritDoc} */ 108 @Override 109 public MaleSocket createNewObject(@Nonnull String systemName, @CheckForNull String userName) { 110 MqttSystemConnectionMemo memo = 111 _mqttConnection.getItemAt(_mqttConnection.getSelectedIndex())._memo; 112 113 Publish action = new Publish(systemName, userName, memo); 114 updateObject(action); 115 return InstanceManager.getDefault(DigitalActionManager.class).registerAction(action); 116 } 117 118 /** {@inheritDoc} */ 119 @Override 120 public void updateObject(@Nonnull Base object) { 121 if (! (object instanceof Publish)) { 122 throw new IllegalArgumentException("object must be an Publish but is a: "+object.getClass().getName()); 123 } 124 Publish action = (Publish) object; 125 126 _selectTopicSwing.updateObject(action.getSelectTopic()); 127 _selectMessageSwing.updateObject(action.getSelectMessage()); 128 129 action.setMemo(_mqttConnection.getItemAt(_mqttConnection.getSelectedIndex())._memo); 130 } 131 132 /** {@inheritDoc} */ 133 @Override 134 public String toString() { 135 return Bundle.getMessage("Publish_Short"); 136 } 137 138 @Override 139 public void dispose() { 140 _selectTopicSwing.dispose(); 141 _selectMessageSwing.dispose(); 142 } 143 144 145 private static class MqttConnection { 146 147 private MqttSystemConnectionMemo _memo; 148 149 public MqttConnection(MqttSystemConnectionMemo memo) { 150 _memo = memo; 151 } 152 153 @Override 154 public String toString() { 155 return _memo.getUserName(); 156 } 157 } 158 159// private final static org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(PublishSwing.class); 160 161}