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}