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}