Author: chatellier Date: 2009-07-22 17:03:33 +0000 (Wed, 22 Jul 2009) New Revision: 2510 Added: isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/config/ isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/config/ConfigUI.jaxx isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/config/IsisConfigTableModel.java isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/config/SSHLauncherConfigUI.jaxx Removed: isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/simulator/launcher/ Modified: isis-fish/trunk/src/main/java/fr/ifremer/isisfish/IsisConfig.java isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/WelcomePanelUI.jaxx isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/WelcomeUI.jaxx Log: Update config ui. Modified: isis-fish/trunk/src/main/java/fr/ifremer/isisfish/IsisConfig.java =================================================================== --- isis-fish/trunk/src/main/java/fr/ifremer/isisfish/IsisConfig.java 2009-07-22 17:02:57 UTC (rev 2509) +++ isis-fish/trunk/src/main/java/fr/ifremer/isisfish/IsisConfig.java 2009-07-22 17:03:33 UTC (rev 2510) @@ -179,10 +179,19 @@ } + ////////////////////////////////////////////////// // Methode d'acces aux options ////////////////////////////////////////////////// + /* + * @see org.codelutin.util.ApplicationConfig#getOption(java.lang.String) + */ + @Override + public String getOption(String key) { + return super.getOption(key); + } + /** * Retourne le repertoire racine de toutes les donnees (script, simulation * region, ...) Modified: isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/WelcomePanelUI.jaxx =================================================================== --- isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/WelcomePanelUI.jaxx 2009-07-22 17:02:57 UTC (rev 2509) +++ isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/WelcomePanelUI.jaxx 2009-07-22 17:03:33 UTC (rev 2510) @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *##%*/ --> -<JPanel id='welcomePanelUI' layout='{new BorderLayout()}'> +<JPanel layout='{new BorderLayout()}'> <script> <![CDATA[ import fr.ifremer.isisfish.IsisFish; Modified: isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/WelcomeUI.jaxx =================================================================== --- isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/WelcomeUI.jaxx 2009-07-22 17:02:57 UTC (rev 2509) +++ isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/WelcomeUI.jaxx 2009-07-22 17:03:33 UTC (rev 2510) @@ -34,7 +34,8 @@ import fr.ifremer.isisfish.ui.script.ScriptUI; import fr.ifremer.isisfish.ui.simulator.SimulUI; import fr.ifremer.isisfish.ui.queue.QueueUI; - import fr.ifremer.isisfish.ui.simulator.launcher.SSHLauncherConfigUI; + import fr.ifremer.isisfish.ui.config.ConfigUI; + import fr.ifremer.isisfish.ui.config.SSHLauncherConfigUI; import fr.ifremer.isisfish.ui.vcs.VCSConfigUI; import org.codelutin.widget.AboutFrame; import jaxx.runtime.DefaultJAXXContext; @@ -92,8 +93,10 @@ // thread:Welcome.updateVCS() } protected void config() { -// FIXME a reimplanter -// Welcome.showConfig() + ConfigUI configUI = new ConfigUI(); + configUI.pack(); + org.codelutin.widget.SwingUtil.center(configUI); + configUI.setVisible(true); } protected void configVCS() { VCSConfigUI vcsConfig = new VCSConfigUI(); Added: isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/config/ConfigUI.jaxx =================================================================== --- isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/config/ConfigUI.jaxx (rev 0) +++ isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/config/ConfigUI.jaxx 2009-07-22 17:03:33 UTC (rev 2510) @@ -0,0 +1,36 @@ +<!-- +/* *##% + * Copyright (C) 2005 - 2009 Ifremer, Code Lutin + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + *##%*/ + --> +<JFrame title='isisfish.welcome.menu.configuration'> + <JPanel layout='{new BorderLayout()}'> + <JScrollPane constraints="BorderLayout.CENTER"> + <JTable id='propertiesTable' model='{new IsisConfigTableModel()}' /> + </JScrollPane> + <Table constraints="BorderLayout.SOUTH"> + <row> + <cell fill="none" weightx="1"> + <JButton id='cancelButton' text='isisfish.common.cancel' onActionPerformed='' visible='false' /> + </cell> + <cell fill='none' anchor='east' weightx="1"> + <JButton id='okButton' text='isisfish.common.ok' onActionPerformed='dispose()' /> + </cell> + </row> + </Table> + </JPanel> +</JFrame> \ No newline at end of file Added: isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/config/IsisConfigTableModel.java =================================================================== --- isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/config/IsisConfigTableModel.java (rev 0) +++ isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/config/IsisConfigTableModel.java 2009-07-22 17:03:33 UTC (rev 2510) @@ -0,0 +1,154 @@ +/* *##% + * Copyright (C) 2009 Code Lutin + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + *##%*/ + +package fr.ifremer.isisfish.ui.config; + +import static org.codelutin.i18n.I18n._; + +import javax.swing.table.AbstractTableModel; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import fr.ifremer.isisfish.IsisConfig; +import fr.ifremer.isisfish.IsisFish; + +/** + * Model pour l'edition des proprietes de IsisConfig. + * + * Columns : + * <li>Property name</li> + * <li>Property value</li> + * + * @author chatellier + * @version $Revision: 2418 $ + * + * Last update : $Date: 2009-06-22 14:52:27 +0200 (lun. 22 juin 2009) $ + * By : $Author: chatellier $ + */ +public class IsisConfigTableModel extends AbstractTableModel { + + /** Log. */ + private static Log log = LogFactory + .getLog(IsisConfigTableModel.class); + + /** serialVersionUID. */ + private static final long serialVersionUID = 4593731087704399810L; + + /** Columns names. */ + public final static String[] COLUMN_NAMES = { _("isisfish.common.name"), + _("isisfish.common.value") }; + + /* + * @see javax.swing.table.TableModel#getColumnCount() + */ + @Override + public int getColumnCount() { + return COLUMN_NAMES.length; + } + + /* + * @see javax.swing.table.TableModel#getRowCount() + */ + @Override + public int getRowCount() { + return IsisConfig.Option.values().length; + } + + /* + * @see javax.swing.table.TableModel#getValueAt(int, int) + */ + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + + Object result = null; + + String name = IsisConfig.Option.values()[rowIndex].key; + switch (columnIndex) { + case 0: + result = name; + break; + case 1: + result = IsisFish.config.getOption(name); + break; + default: + throw new IndexOutOfBoundsException("No such column " + columnIndex); + } + + return result; + } + + /* + * @see javax.swing.table.TableModel#getColumnClass(int) + */ + @Override + public Class<?> getColumnClass(int columnIndex) { + + Class<?> result = null; + + switch (columnIndex) { + case 0: + result = String.class; + break; + case 1: + result = String.class; + break; + default: + throw new IndexOutOfBoundsException("No such column " + columnIndex); + } + + return result; + } + + /* + * @see javax.swing.table.TableModel#getColumnName(int) + */ + @Override + public String getColumnName(int columnIndex) { + return COLUMN_NAMES[columnIndex]; + } + + /* + * @see javax.swing.table.TableModel#isCellEditable(int, int) + */ + @Override + public boolean isCellEditable(int rowIndex, int columnIndex) { + return columnIndex > 0; + } + + /* + * @see javax.swing.table.TableModel#setValueAt(java.lang.Object, int, int) + */ + @Override + public void setValueAt(Object value, int rowIndex, int columnIndex) { + + if (log.isDebugEnabled()) { + log.debug("Cell edition (column " + columnIndex + ") = " + value); + } + + String name = IsisConfig.Option.values()[rowIndex].key; + switch (columnIndex) { + case 1: + IsisFish.config.setOption(name, (String)value); + break; + default: + throw new IndexOutOfBoundsException("No such column " + columnIndex); + } + + } +} Copied: isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/config/SSHLauncherConfigUI.jaxx (from rev 2478, isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/simulator/launcher/SSHLauncherConfigUI.jaxx) =================================================================== --- isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/config/SSHLauncherConfigUI.jaxx (rev 0) +++ isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/config/SSHLauncherConfigUI.jaxx 2009-07-22 17:03:33 UTC (rev 2510) @@ -0,0 +1,453 @@ +<!-- ##% +Copyright (C) 2009 Ifremer, Code Lutin + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +##% --> +<JDialog resizable="false" title="isisfish.simulator.ssh.configuration.title" layout="{new BoxLayout(this.getContentPane(), BoxLayout.PAGE_AXIS)}"> + <script><![CDATA[ + + import java.io.IOException; + import fr.ifremer.isisfish.IsisFish; + import com.jcraft.jsch.JSch; + import com.jcraft.jsch.JSchException; + import com.jcraft.jsch.KeyPair; + import com.jcraft.jsch.Session; + import fr.ifremer.isisfish.util.ssh.InvalidPassphraseException; + import fr.ifremer.isisfish.util.ssh.SSHAgent; + import fr.ifremer.isisfish.util.ssh.SSHException; + import fr.ifremer.isisfish.util.ssh.SSHUserInfo; + import fr.ifremer.isisfish.util.ssh.SSHUtils; + + protected String currentSSHserver; + protected String currentSSHUsername; + protected File currentSSHKey; + protected String currentSSHUserhome; + protected String currentSSHDatapath; + protected String currentSSHIsisHome; + protected String currentSSHTempPath; + protected String currentSSHPbsBinPath; + protected String currentSSHControlInterval; + protected String currentSSHSimultaneousSimulation; + + // fill default values + resetSSHConfiguration(); + + /** + * Reset values with default configuration values. + */ + protected void resetSSHConfiguration() { + // server config + sshServerField.setText(IsisFish.config.getSimulatorSshServer()); + usernameField.setText(IsisFish.config.getSimulatorSshUsername()); + sshKeyField.setText(IsisFish.config.getSSHPrivateKeyFilePath().getAbsolutePath()); + + // caparmor config + sshUserhomeField.setText(IsisFish.config.getSimulatorSshUserHome()); + sshDatapathField.setText(IsisFish.config.getSimulatorSshDataPath()); + sshIsisHomeField.setText(IsisFish.config.getSimulatorSshIsisHome()); + sshTemppathField.setText(IsisFish.config.getSimulatorSshTmpPath()); + sshPbsBinPathField.setText(IsisFish.config.getSimulatorSshPbsBinPath()); + sshControlIntervalField.setText(String.valueOf(IsisFish.config.getSimulatorSshControlCheckInterval())); + sshSimultaneousSimulationField.setText(String.valueOf(IsisFish.config.getSimulatorSshMaxSimultaneousSimulation())); + + doCheck(); + } + + protected void doCheck() { + + validButton.setEnabled(false); + messageLabel.setText(""); + + // copy values + currentSSHserver = sshServerField.getText().trim(); + if (currentSSHserver.isEmpty()) { + setColor(true, sshServerField); + } + else { + setColor(false, sshServerField); + } + + currentSSHUsername = usernameField.getText().trim(); + if (!currentSSHUsername.matches("\\w+")) { + setColor(true, usernameField); + } + else { + setColor(false, usernameField); + } + + // if ssh key is set, must be a valid file + currentSSHKey = new File(sshKeyField.getText().trim()); + if (!currentSSHKey.isFile()) { + setColor(true, sshKeyField); + } + else { + sshKeyButton.setEnabled(false); + sshKeyField.setEnabled(false); + setColor(false, sshKeyField); + } + + currentSSHDatapath = sshDatapathField.getText().trim(); + if (currentSSHDatapath.isEmpty()) { + setColor(true, sshDatapathField); + } + else { + setColor(false, sshDatapathField); + } + + currentSSHIsisHome = sshIsisHomeField.getText().trim(); + if (currentSSHIsisHome.isEmpty()) { + setColor(true, sshIsisHomeField); + } + else { + setColor(false, sshIsisHomeField); + } + + currentSSHTempPath = sshTemppathField.getText().trim(); + if (currentSSHTempPath.isEmpty()) { + setColor(true, sshTemppathField); + } + else { + setColor(false, sshTemppathField); + } + + currentSSHPbsBinPath = sshPbsBinPathField.getText().trim(); + if (currentSSHPbsBinPath.isEmpty()) { + setColor(true, sshPbsBinPathField); + } + else { + setColor(false, sshPbsBinPathField); + } + + currentSSHControlInterval = sshControlIntervalField.getText().trim(); + if (!currentSSHControlInterval.matches("\\d+")) { + setColor(true, sshControlIntervalField); + } + else { + setColor(false, sshControlIntervalField); + } + + currentSSHSimultaneousSimulation = sshSimultaneousSimulationField.getText().trim(); + if (!currentSSHSimultaneousSimulation.matches("\\d+")) { + setColor(true, sshSimultaneousSimulationField); + } + else { + setColor(false, sshSimultaneousSimulationField); + } + } + + /** + * Set values in config and force configuration save. + */ + protected void saveSSHConfiguration() { + IsisFish.config.setSimulatorSshServer(currentSSHserver); + IsisFish.config.setSimulatorSshUsername(currentSSHUsername); + IsisFish.config.setSSHPrivateKeyFilePath(currentSSHKey); + + IsisFish.config.setSimulatorSshUserHome(currentSSHUserhome); + IsisFish.config.setSimulatorSshDataPath(currentSSHDatapath); + IsisFish.config.setSimulatorSshIsisHome(currentSSHIsisHome); + IsisFish.config.setSimulatorSshTmpPath(currentSSHTempPath); + IsisFish.config.setSimulatorSshPbsBinPath(currentSSHPbsBinPath); + IsisFish.config.setSimulatorSshControlCheckInterval(Long.parseLong(currentSSHControlInterval)); + IsisFish.config.setSimulatorSshMaxSimultaneousSimulation(Integer.parseInt(currentSSHSimultaneousSimulation)); + + IsisFish.config.saveForUser(); + dispose(); + } + + /** + * Close frame. + */ + protected void cancelSSHConfiguration() { + dispose(); + } + + /** + * Realise une connexion ssh et teste les données. + */ + protected void testSSHConfiguration() { + JSch jsch = new JSch(); + + String host = currentSSHserver; + int port = 22; // by default, 22 + String sPort = null; + + try { + if (host.indexOf(':') > 0) { + sPort = host.substring(host.indexOf(':') + 1); + port = Integer.parseInt(sPort); + host = host.substring(0, host.indexOf(':')); + } + + // add ssh key + boolean sshKeyUsed = false; + if (currentSSHKey.canRead()) { + if (log.isInfoEnabled()) { + log.info(_("Ssh key found '%s' will be used to connect to", + currentSSHKey.getAbsoluteFile(), host)); + } + jsch.addIdentity(currentSSHKey.getAbsolutePath()); + sshKeyUsed = true; + } + else { + if (log.isInfoEnabled()) { + log.info(_("Can't read ssh key : %s", currentSSHKey)); + } + } + + Session session = jsch.getSession(currentSSHUsername, host, port); + + // username and password will be given via UserInfo interface. + SSHUserInfo ui = new SSHUserInfo(); + if (sshKeyUsed) { + String passphrase = null; + passphrase = SSHAgent.getAgent().getPassphrase(currentSSHKey); + ui.setPassphrase(passphrase); + setTestMessage(_("isisfish.simulator.ssh.configuration.connectingpk"), false); + } + else { + setTestMessage(_("isisfish.simulator.ssh.configuration.connecting"), false); + } + session.setUserInfo(ui); + session.connect(10000); // timeout + + setTestMessage(_("isisfish.simulator.ssh.configuration.connectionok"), false); + + // get user home + currentSSHUserhome = getUserHomeDirectory(session); + sshUserhomeField.setText(currentSSHUserhome); + session.disconnect(); + + validButton.setEnabled(true); + } catch (NumberFormatException e) { + if (log.isErrorEnabled()) { + log.error("Can't connect", e); + } + setTestMessage(_("isisfish.error.simulation.remote.wrongportvalue", sPort), true); + } catch (JSchException e) { + if (log.isErrorEnabled()) { + log.error("Can't connect", e); + } + setTestMessage(_("isisfish.simulator.ssh.configuration.connectionerror", e.getMessage()), true); + } catch (SSHException e) { + if (log.isErrorEnabled()) { + log.error("Can't connect", e); + } + setTestMessage(_("isisfish.simulator.ssh.configuration.connectionerror", e.getMessage()), true); + } catch (InvalidPassphraseException e) { + if (log.isErrorEnabled()) { + log.error("Can't connect", e); + } + setTestMessage(_("isisfish.simulator.ssh.configuration.invalidpassphrase"), true); + } + } + + /** + * Get user home directory with an opened session. + */ + protected String getUserHomeDirectory(Session session) throws SSHException { + + String command ="pwd"; + + Writer output = new StringWriter(); + int exit = SSHUtils.exec(session, command, output); + + if (exit != 0) { + throw new SSHException(_("Command '%s' fail to execute", command)); + } + + String out = output.toString(); + return out; + } + + /** + * Generate new SSH key. + */ + protected void generateSSHKey() { + if (currentSSHKey.exists()) { + throw new IllegalArgumentException("Can't overwrite ssh key"); + } + + try { + // make parent dir + if (currentSSHKey.getParentFile() != null && !currentSSHKey.getParentFile().exists()) { + currentSSHKey.getParentFile().mkdirs(); + } + JSch jsch=new JSch(); + KeyPair kpair=KeyPair.genKeyPair(jsch, KeyPair.RSA, 2048); + //kpair.setPassphrase(passphrase); + kpair.writePrivateKey(currentSSHKey.getAbsolutePath()); + kpair.writePublicKey(currentSSHKey.getAbsolutePath()+".pub", currentSSHUsername + "@forIsisFish"); + if (log.isInfoEnabled()) { + log.info("Finger print: "+kpair.getFingerPrint()); + } + kpair.dispose(); + } + catch (JSchException e) { + if (log.isErrorEnabled()) { + log.error("Can't make ssh key", e); + } + } + catch (IOException e) { + if (log.isErrorEnabled()) { + log.error("Can't make ssh key", e); + } + } + + // refresh ckeck + doCheck(); + } + + protected void setColor(boolean invalid, JComponent component) { + component.setForeground(invalid ? Color.RED: Color.BLACK); + } + protected void setTestMessage(String message, boolean error) { + messageLabel.setForeground(error ? Color.RED: Color.GREEN.darker()); + messageLabel.setText(message); + } + ]]></script> + + <Table border='{BorderFactory.createTitledBorder(_("isisfish.simulator.ssh.configuration.connection"))}' + fill='horizontal'> + <row> + <cell> + <JLabel id='sshServerLabel' text='isisfish.config.main.simulation.ssh.server' + toolTipText='isisfish.config.main.simulation.ssh.server' /> + </cell> + <cell fill='horizontal' columns="2"> + <JTextField id='sshServerField' toolTipText='isisfish.config.main.simulation.ssh.server' + onKeyReleased="doCheck()" /> + </cell> + </row> + <row fill='horizontal'> + <cell> + <JLabel id='usernameLabel' text='isisfish.config.main.simulation.ssh.username' + toolTipText='isisfish.config.main.simulation.ssh.username.description' /> + </cell> + <cell columns="2"> + <JTextField id='usernameField' toolTipText='isisfish.config.main.simulation.ssh.username.description' + onKeyReleased="doCheck()" /> + </cell> + </row> + <row fill='horizontal'> + <cell> + <JLabel id='sshKeyLabel' text='isisfish.config.ssh.key.file' toolTipText='isisfish.config.ssh.key.file.description' /> + </cell> + <cell weightx="2.0"> + <JTextField id='sshKeyField' toolTipText='isisfish.config.ssh.key.file.description' + onKeyReleased="doCheck()" /> + </cell> + <cell> + <JButton id='sshKeyButton' text='isisfish.simulator.ssh.configuration.keygenerate' onActionPerformed="generateSSHKey()" /> + </cell> + </row> + </Table> + <Table border='{BorderFactory.createTitledBorder(_("isisfish.simulator.ssh.configuration.environment"))}'> + <row fill='horizontal'> + <cell> + <JLabel id='sshUserhomeLabel' text='isisfish.config.main.simulation.ssh.userhome' + toolTipText='isisfish.config.main.simulation.ssh.userhome.description' /> + </cell> + <cell weightx="1.0"> + <JTextField id='sshUserhomeField' enabled='false' toolTipText='isisfish.config.main.simulation.ssh.userhome.description' + onKeyReleased="doCheck()" /> + </cell> + </row> + <row fill='horizontal'> + <cell> + <JLabel id='sshDatapathLabel' text='isisfish.config.main.simulation.ssh.datapath' + toolTipText='isisfish.config.main.simulation.ssh.datapath.description' /> + </cell> + <cell weightx="1.0"> + <JTextField id='sshDatapathField' toolTipText='isisfish.config.main.simulation.ssh.datapath.description' + onKeyReleased="doCheck()" /> + </cell> + </row> + <row fill='horizontal'> + <cell> + <JLabel id='sshIsisHomeLabel' text='isisfish.config.main.simulation.ssh.isis.home' + toolTipText='isisfish.config.main.simulation.ssh.isis.home.description' /> + </cell> + <cell> + <JTextField id='sshIsisHomeField' toolTipText='isisfish.config.main.simulation.ssh.isis.home.description' + onKeyReleased="doCheck()" /> + </cell> + </row> + <row fill='horizontal'> + <cell> + <JLabel id='sshTemppathLabel' text='isisfish.config.main.simulation.ssh.tmppath' + toolTipText='isisfish.config.main.simulation.ssh.tmppath.description' /> + </cell> + <cell> + <JTextField id='sshTemppathField' toolTipText='isisfish.config.main.simulation.ssh.tmppath.description' + onKeyReleased="doCheck()" /> + </cell> + </row> + <row fill='horizontal'> + <cell> + <JLabel id='sshPbsBinPathLabel' text='isisfish.config.main.simulation.ssh.pbsbinpath' + toolTipText='isisfish.config.main.simulation.ssh.pbsbinpath.description' /> + </cell> + <cell> + <JTextField id='sshPbsBinPathField' + toolTipText='isisfish.config.main.simulation.ssh.pbsbinpath.description' + onKeyReleased="doCheck()" /> + </cell> + </row> + <row fill='horizontal'> + <cell> + <JLabel id='sshControlIntervalLabel' text='isisfish.config.main.simulation.ssh.control.check.interval' + toolTipText='isisfish.config.main.simulation.ssh.control.check.interval.description' /> + </cell> + <cell> + <JTextField id='sshControlIntervalField' + toolTipText='isisfish.config.main.simulation.ssh.control.check.interval.description' + onKeyReleased="doCheck()" /> + </cell> + </row> + <row fill='horizontal'> + <cell> + <JLabel id='sshSimultaneousSimulationLabel' text='isisfish.config.main.simulation.max.simultaneous.simulation' + toolTipText='isisfish.config.main.simulation.max.simultaneous.simulation.description' /> + </cell> + <cell> + <JTextField id='sshSimultaneousSimulationField' + toolTipText='isisfish.config.main.simulation.max.simultaneous.simulation.description' + onKeyReleased="doCheck()" /> + </cell> + </row> + </Table> + <Table> + <row fill='horizontal'> + <cell columns="4" fill='horizontal'> + <JLabel id='messageLabel' text=' ' font-weight='bold' opaque='true' horizontalAlignment='center' minimumSize='{new Dimension(0, 25)}' preferredSize='{new Dimension(0, 25)}'/> + </cell> + </row> + <row fill='horizontal'> + <cell fill='horizontal'> + <JButton id='testButton' text='isisfish.simulator.ssh.configuration.test' onActionPerformed="testSSHConfiguration()" /> + </cell> + <cell fill='horizontal'> + <JButton id='validButton' text='isisfish.common.valid' onActionPerformed="saveSSHConfiguration()" /> + </cell> + <cell fill='horizontal'> + <JButton id='resetButton' text='isisfish.common.reset' onActionPerformed="resetSSHConfiguration()" /> + </cell> + <cell fill='horizontal'> + <JButton id='cancelButton' text='isisfish.common.cancel' onActionPerformed="cancelSSHConfiguration()" /> + </cell> + </row> + </Table> +</JDialog>