001package jmri.jmrit.logixng.actions.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.actions.ExecuteProgram;
012import jmri.jmrit.logixng.util.swing.*;
013
014/**
015 * Configures an ExecuteProgram object with a Swing JPanel.
016 *
017 * @author Daniel Bergqvist Copyright 2025
018 */
019public class ExecuteProgramSwing extends AbstractDigitalActionSwing {
020
021    private JTabbedPane _tabbedPane;
022
023    private LogixNG_SelectStringSwing _selectProgramSwing;
024    private LogixNG_SelectStringListSwing _selectParametersSwing;
025    private LogixNG_SelectStringSwing _selectWorkingDirectorySwing;
026
027
028    @Override
029    protected void createPanel(@CheckForNull Base object, @Nonnull JPanel buttonPanel) {
030        ExecuteProgram action = (ExecuteProgram)object;
031
032        _selectProgramSwing = new LogixNG_SelectStringSwing(getJDialog(), this);
033        _selectParametersSwing = new LogixNG_SelectStringListSwing();
034        _selectWorkingDirectorySwing = new LogixNG_SelectStringSwing(getJDialog(), this);
035
036        panel = new JPanel();
037        panel.setLayout(new java.awt.GridBagLayout());
038
039        JPanel programPanel;
040        JPanel parametersPanel;
041        JPanel workingDirectoryPanel;
042        if (action != null) {
043            programPanel = _selectProgramSwing.createPanel(action.getSelectProgram());
044            parametersPanel = _selectParametersSwing.createPanel(action.getSelectParameters());
045            workingDirectoryPanel = _selectWorkingDirectorySwing.createPanel(action.getSelectWorkingDirectory());
046        } else {
047            programPanel = _selectProgramSwing.createPanel(null);
048            parametersPanel = _selectParametersSwing.createPanel(null);
049            workingDirectoryPanel = _selectWorkingDirectorySwing.createPanel(null);
050        }
051
052        _tabbedPane = new JTabbedPane();
053        _tabbedPane.addTab(Bundle.getMessage("ExecuteProgramSwing_Program"), programPanel);
054        _tabbedPane.addTab(Bundle.getMessage("ExecuteProgramSwing_Parameters"), parametersPanel);
055        _tabbedPane.addTab(Bundle.getMessage("ExecuteProgramSwing_WorkingDirectory"), workingDirectoryPanel);
056
057        java.awt.GridBagConstraints constraints = new java.awt.GridBagConstraints();
058        constraints.gridwidth = 2;
059        constraints.gridheight = 1;
060        constraints.gridx = 0;
061        constraints.gridy = 0;
062        constraints.anchor = java.awt.GridBagConstraints.EAST;
063        panel.add(_tabbedPane, constraints);
064        constraints.gridy = 1;
065    }
066
067    /** {@inheritDoc} */
068    @Override
069    public boolean validate(@Nonnull List<String> errorMessages) {
070        // Create a temporary action to test formula
071        ExecuteProgram action = new ExecuteProgram("IQDA2", null);
072
073        _selectProgramSwing.validate(action.getSelectProgram(), errorMessages);
074        _selectParametersSwing.validate(action.getSelectParameters(), errorMessages);
075        _selectWorkingDirectorySwing.validate(action.getSelectWorkingDirectory(), errorMessages);
076
077        return errorMessages.isEmpty();
078    }
079
080    /** {@inheritDoc} */
081    @Override
082    public MaleSocket createNewObject(@Nonnull String systemName, @CheckForNull String userName) {
083        ExecuteProgram action = new ExecuteProgram(systemName, userName);
084        updateObject(action);
085        return InstanceManager.getDefault(DigitalActionManager.class).registerAction(action);
086    }
087
088    /** {@inheritDoc} */
089    @Override
090    public void updateObject(@Nonnull Base object) {
091        if (! (object instanceof ExecuteProgram)) {
092            throw new IllegalArgumentException("object must be an ExecuteProgram but is a: "+object.getClass().getName());
093        }
094        ExecuteProgram action = (ExecuteProgram)object;
095
096        _selectProgramSwing.updateObject(action.getSelectProgram());
097        _selectParametersSwing.updateObject(action.getSelectParameters());
098        _selectWorkingDirectorySwing.updateObject(action.getSelectWorkingDirectory());
099    }
100
101    /** {@inheritDoc} */
102    @Override
103    public String toString() {
104        return Bundle.getMessage("ExecuteProgram_Short");
105    }
106
107    @Override
108    public void dispose() {
109        _selectProgramSwing.dispose();
110        _selectParametersSwing.dispose();
111        _selectWorkingDirectorySwing.dispose();
112    }
113
114//    private final static org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(ExecuteProgramSwing.class);
115
116}