X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FWsJobParameters.java;h=c1a925d1ca57249c3f2ea72deb21ed98f991ab9c;hb=e1ec9d45cb7e3c1e5258dd8135a269dab535cde3;hp=ca5e8b1e454987f66578974e030248b84fb2d5cc;hpb=5dfd1bdf67e6e0c916d22e67d498c0e956917c21;p=jalview.git diff --git a/src/jalview/gui/WsJobParameters.java b/src/jalview/gui/WsJobParameters.java index ca5e8b1..c1a925d 100644 --- a/src/jalview/gui/WsJobParameters.java +++ b/src/jalview/gui/WsJobParameters.java @@ -1,38 +1,37 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.6) - * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors * * This file is part of Jalview. * * Jalview 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 3 of the License, or (at your option) any later version. - * + * as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. + * * Jalview 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 Jalview. If not, see . + * You should have received a copy of the GNU General Public License + * along with Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. */ package jalview.gui; import jalview.gui.OptsAndParamsPage.OptionBox; import jalview.gui.OptsAndParamsPage.ParamBox; -import jalview.ws.jws2.JabaParamStore; -import jalview.ws.jws2.JabaPreset; -import jalview.ws.jws2.Jws2Discoverer; -import jalview.ws.jws2.Jws2Discoverer.Jws2Instance; +import jalview.util.MessageManager; +import jalview.ws.api.UIinfo; import jalview.ws.params.ArgumentI; import jalview.ws.params.OptionI; import jalview.ws.params.ParamDatastoreI; import jalview.ws.params.ParameterI; -import jalview.ws.params.ValueConstrainI; import jalview.ws.params.WsParamSetI; import java.awt.BorderLayout; import java.awt.Component; -import java.awt.Container; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; @@ -42,50 +41,30 @@ import java.awt.GridLayout; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.HierarchyBoundsListener; +import java.awt.event.HierarchyEvent; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.event.WindowEvent; -import java.awt.event.WindowListener; -import java.net.URL; -import java.util.ArrayList; import java.util.Hashtable; -import java.util.Iterator; import java.util.List; -import java.util.Map; import java.util.Vector; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionStage; import javax.swing.JButton; -import javax.swing.JCheckBox; import javax.swing.JComboBox; -import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; -import javax.swing.JMenuItem; -import javax.swing.JOptionPane; import javax.swing.JPanel; -import javax.swing.JPopupMenu; import javax.swing.JScrollPane; -import javax.swing.JSlider; -import javax.swing.JSplitPane; -import javax.swing.JTabbedPane; import javax.swing.JTextArea; -import javax.swing.JTextField; +import javax.swing.WindowConstants; import javax.swing.border.TitledBorder; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; -import compbio.metadata.Argument; -import compbio.metadata.Option; -import compbio.metadata.Parameter; -import compbio.metadata.Preset; -import compbio.metadata.PresetManager; -import compbio.metadata.RunnerConfig; -import compbio.metadata.ValueConstrain.Type; +import net.miginfocom.swing.MigLayout; /** * job parameter editing/browsing dialog box. User can browse existing settings @@ -105,41 +84,38 @@ import compbio.metadata.ValueConstrain.Type; public class WsJobParameters extends JPanel implements ItemListener, ActionListener, DocumentListener, OptsParametersContainerI { - URL linkImageURL = getClass().getResource("/images/link.gif"); + private static final int PREFERRED_WIDTH = 540; + + private static final int DEFAULT_HEIGHT = 640; + + // the default parameter set shown to the user + private static final String SVC_DEF = "Defaults"; + + private int maxOptWidth = 200; - private static final String SVC_DEF = "Defaults"; // this is the null - // parameter set as shown to - // user + // URL linkImageURL = getClass().getResource("/images/link.gif"); + // TODO ABSRACT FROM JABAWS CLASSES + + // completion stage representing whether start was clicked + private final CompletableFuture completionStage = new CompletableFuture<>(); + /** * manager for options and parameters. */ - OptsAndParamsPage opanp = new OptsAndParamsPage(this); + OptsAndParamsPage opanp; - /** + /* * panel containing job options */ - JPanel jobOptions = new JPanel(); + JPanel optionsPanel = new JPanel(); - /** + /* * panel containing job parameters */ - JPanel paramList = new JPanel(); - - - - JPanel SetNamePanel = new JPanel(); + JPanel paramsPanel = new JPanel(); - JPanel setDetails = new JPanel(); - - JSplitPane settingsPanel = new JSplitPane(); - - JSplitPane jobPanel = new JSplitPane(); - - - JScrollPane jobOptionsPane = new JScrollPane(); - - JPanel jobParameters = new JPanel(); + JPanel setNamePanel = new JPanel(); JButton createpref = new JButton(); @@ -149,175 +125,166 @@ public class WsJobParameters extends JPanel implements ItemListener, JButton updatepref = new JButton(); - JButton startjob = new JButton(); - - JButton canceljob = new JButton(); - - JComboBox setName = new JComboBox(); + JComboBox setName = new JComboBox<>(); JTextArea setDescr = new JTextArea(); JScrollPane paramPane = new JScrollPane(); + + JButton startjob = JvSwingUtils.makeButton( + MessageManager.getString("action.start_job"), + MessageManager.getString("label.start_job_current_settings"), + this::startjob_actionPerformed); + JButton canceljob = JvSwingUtils.makeButton( + MessageManager.getString("action.cancel_job"), + MessageManager.getString("label.cancel_job_close_dialog"), + this::canceljob_actionPerformed); + ParamDatastoreI paramStore; - JPanel optsAndparams = new JPanel(); + // set true when 'Start Job' is clicked + boolean startJob = false; - RunnerConfig serviceOptions; + JFrame frame = null; - ParamDatastoreI paramStore; + UIinfo service; - private int MAX_OPTWIDTH = 200; + /* + * list of service presets in the gui + */ + Hashtable servicePresets = null; - WsJobParameters(Jws2Instance service) - { - this(service, null); - } + /* + * set if dialog is being set - so handlers will avoid spurious events + */ + boolean settingDialog = false; - public WsJobParameters(Jws2Instance service, WsParamSetI preset) - { - this(null, service, preset, null); - } + private Hashtable modifiedElements = new Hashtable<>(); - /** - * - * @param desktop - * - if null, create new JFrame outside of desktop - * @param service - * @param preset - */ - public WsJobParameters(JFrame parent, Jws2Instance service, - WsParamSetI preset, List jobArgset) + String lastParmSet = null; + + public WsJobParameters(ParamDatastoreI store, WsParamSetI preset, + List args) { - this(parent, null, service, preset, jobArgset); + super(); + + // parameters dialog in 'compact' format (help as tooltips) + opanp = new OptsAndParamsPage(this, true); + jbInit(); + this.paramStore = store; + this.service = null; + init(preset, args); + validate(); } /** + * Constructor given a set of parameters and presets, a service to be invoked, + * and a list of (Jabaws client) arguments * - * @param parent * @param paramStorei * @param service * @param preset * @param jobArgset */ - public WsJobParameters(JFrame parent, ParamDatastoreI paramStorei, - Jws2Instance service, WsParamSetI preset, List jobArgset) + public WsJobParameters(ParamDatastoreI paramStorei, UIinfo service, + WsParamSetI preset, List jobArgset) { super(); + + // parameters dialog in 'expanded' format (help text boxes) + opanp = new OptsAndParamsPage(this, false); + jbInit(); this.paramStore = paramStorei; - if (paramStore == null) + if (paramStore == null && service != null) { paramStore = service.getParamStore(); } this.service = service; - // argSetModified(false); - // populate parameter table - initForService(service, preset, jobArgset); - // display in new JFrame attached to parent. + initForService(preset, jobArgset); validate(); } - int response = -1; - - JDialog frame = null; - /** - * shows a modal dialog containing the parameters. + * Shows a modal dialog containing the parameters and Start or Cancel options. + * Answers true if the job is started, false if cancelled. * * @return */ - public boolean showRunDialog() + public CompletionStage showRunDialog() { - - frame = new JDialog(Desktop.instance, true); - - frame.setTitle("Edit parameters for " + service.getActionText()); - Rectangle deskr = Desktop.instance.getBounds(); + frame = new JFrame(); + frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); + if (service != null) + { + frame.setTitle(MessageManager.formatMessage("label.edit_params_for", + new String[] { service.getActionText() })); + } + Rectangle deskr = Desktop.getInstance().getBounds(); Dimension pref = this.getPreferredSize(); - frame.setBounds(new Rectangle((int) (deskr.getCenterX() - pref.width/2), - (int) (deskr.getCenterY() - pref.height/2), pref.width, pref.height)); + frame.setBounds( + new Rectangle((int) (deskr.getCenterX() - pref.width / 2), + (int) (deskr.getCenterY() - pref.height / 2), + pref.width, pref.height)); frame.setContentPane(this); - + // should perhaps recover defaults from user prefs. frame.validate(); javax.swing.SwingUtilities.invokeLater(new Runnable() { - public void run() - { - jobPanel.setDividerLocation(0.25); - - } - }); - frame.setVisible(true); + @Override + public void run() + { + // jobPanel.setDividerLocation(0.25); - if (response > 0) - { - return true; - } - return false; + } + }); + + frame.setVisible(true); + return completionStage; } private void jbInit() { - updatepref = JvSwingUtils.makeButton("Update", - "Update this existing user parameter set.", - new ActionListener() - { - - public void actionPerformed(ActionEvent e) - { - update_actionPerformed(e); - } - }); - deletepref = JvSwingUtils.makeButton("Delete", - "Delete the currently selected user parameter set.", - new ActionListener() - { - - public void actionPerformed(ActionEvent e) - { - delete_actionPerformed(e); - } - }); - createpref = JvSwingUtils.makeButton("Create", - "Create a new parameter set with the current settings.", - new ActionListener() - { + this.addHierarchyBoundsListener(new HierarchyBoundsListener() + { - public void actionPerformed(ActionEvent e) - { - create_actionPerformed(e); - } - }); - revertpref = JvSwingUtils.makeButton("Revert", - "Undo all changes to the current parameter set", - new ActionListener() - { + @Override + public void ancestorResized(HierarchyEvent arg0) + { + refreshParamLayout(); + } - public void actionPerformed(ActionEvent e) - { - revert_actionPerformed(e); - } - }); - startjob = JvSwingUtils.makeButton("Start Job", - "Start Job with current settings.", new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - startjob_actionPerformed(e); - } - }); - canceljob = JvSwingUtils.makeButton("Cancel Job", - "Close this dialog and cancel job.", new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - canceljob_actionPerformed(e); - } - }); + @Override + public void ancestorMoved(HierarchyEvent arg0) + { + // TODO Auto-generated method stub - setDetails.setBorder(new TitledBorder("Details")); + } + }); + updatepref = JvSwingUtils.makeButton( + MessageManager.getString("action.update"), + MessageManager.getString("label.update_user_parameter_set"), + this::update_actionPerformed); + deletepref = JvSwingUtils.makeButton( + MessageManager.getString("action.delete"), + MessageManager.getString("label.delete_user_parameter_set"), + this::delete_actionPerformed); + createpref = JvSwingUtils.makeButton( + MessageManager.getString("action.create"), + MessageManager.getString("label.create_user_parameter_set"), + this::create_actionPerformed); + revertpref = JvSwingUtils.makeButton( + MessageManager.getString("action.revert"), + MessageManager + .getString("label.revert_changes_user_parameter_set"), + this::revert_actionPerformed); + + + JPanel setDetails = new JPanel(); + setDetails.setBorder( + new TitledBorder(MessageManager.getString("label.details"))); setDetails.setLayout(new BorderLayout()); setDescr.setColumns(40); setDescr.setWrapStyleWord(true); @@ -325,47 +292,46 @@ public class WsJobParameters extends JPanel implements ItemListener, setDescr.setBackground(getBackground()); setDescr.setEditable(true); setDescr.getDocument().addDocumentListener(this); - setDescr.setToolTipText("Click to edit the notes for this parameter set."); + setDescr.setToolTipText( + MessageManager.getString("label.edit_notes_parameter_set")); JScrollPane setDescrView = new JScrollPane(); - // setDescrView.setPreferredSize(new Dimension(350, 200)); setDescrView.getViewport().setView(setDescr); setName.setEditable(true); setName.addItemListener(this); setName.getEditor().addActionListener(this); JPanel setNameInfo = new JPanel(new FlowLayout(FlowLayout.LEFT)); GridBagLayout gbl = new GridBagLayout(); - SetNamePanel.setLayout(gbl); + setNamePanel.setLayout(gbl); - JLabel setNameLabel = new JLabel("Current parameter set name :"); + JLabel setNameLabel = new JLabel( + MessageManager.getString("label.current_parameter_set_name")); setNameLabel.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10)); - + setNameInfo.add(setNameLabel); setNameInfo.add(setName); - + // initial button visibility updatepref.setVisible(false); deletepref.setVisible(false); revertpref.setVisible(false); createpref.setVisible(false); JPanel setsavebuts = new JPanel(); - setsavebuts.setLayout(new FlowLayout(FlowLayout.LEFT)); // GridLayout(1,2)); - ((FlowLayout) setsavebuts.getLayout()).setHgap(10); - ((FlowLayout) setsavebuts.getLayout()).setVgap(0); + setsavebuts.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 0)); // GridLayout(1,2)); JPanel spacer = new JPanel(); - spacer.setPreferredSize(new Dimension(2,30)); + spacer.setPreferredSize(new Dimension(2, 30)); setsavebuts.add(spacer); setsavebuts.add(deletepref); setsavebuts.add(revertpref); setsavebuts.add(createpref); setsavebuts.add(updatepref); -// setsavebuts.setSize(new Dimension(150, 30)); + // setsavebuts.setSize(new Dimension(150, 30)); JPanel buttonArea = new JPanel(new GridLayout(1, 1)); buttonArea.add(setsavebuts); - SetNamePanel.add(setNameInfo); + setNamePanel.add(setNameInfo); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridheight = 2; gbl.setConstraints(setNameInfo, gbc); - SetNamePanel.add(buttonArea); + setNamePanel.add(buttonArea); gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 2; @@ -373,39 +339,53 @@ public class WsJobParameters extends JPanel implements ItemListener, gbl.setConstraints(buttonArea, gbc); setDetails.add(setDescrView, BorderLayout.CENTER); - jobParameters.setBorder(new TitledBorder("Parameters")); - paramPane.setPreferredSize(new Dimension(360, 400)); - jobOptions.setBorder(new TitledBorder("Options")); - - paramList.setBorder(new TitledBorder("Parameters")); - - JPanel bjo=new JPanel(new BorderLayout()),bjp=new JPanel(new BorderLayout()); - bjo.add(jobOptions, BorderLayout.CENTER); - bjp.add(paramList, BorderLayout.CENTER); - optsAndparams.setLayout(new BorderLayout()); - - optsAndparams.add(bjo, BorderLayout.CENTER); - optsAndparams.add(bjp, BorderLayout.SOUTH); - paramPane.setViewportView(optsAndparams); - + // paramPane.setPreferredSize(new Dimension(360, 400)); + // paramPane.setPreferredSize(null); + optionsPanel.setBorder( + new TitledBorder(MessageManager.getString("label.options"))); + optionsPanel.setOpaque(true); + paramsPanel.setBorder( + new TitledBorder(MessageManager.getString("label.parameters"))); + paramsPanel.setOpaque(true); + // optsAndparams.setScrollableWidth(ScrollableSizeHint.FIT); + // optsAndparams.setScrollableHeight(ScrollableSizeHint.NONE); + // optsAndparams.setLayout(new BorderLayout()); + JPanel optsAndparams = new JPanel(); + optsAndparams.setLayout(new BorderLayout()); + optsAndparams.add(optionsPanel, BorderLayout.NORTH); + optsAndparams.add(paramsPanel, BorderLayout.CENTER); + JPanel jp = new JPanel(new BorderLayout()); + jp.add(optsAndparams, BorderLayout.CENTER); + paramPane.getViewport().setView(jp); + paramPane.setBorder(null); setLayout(new BorderLayout()); - jobPanel.setLeftComponent(setDetails); - jobPanel.setRightComponent(paramPane); - jobPanel.setOrientation(JSplitPane.VERTICAL_SPLIT); - add(SetNamePanel, BorderLayout.NORTH); + JPanel jobPanel = new JPanel(); + jobPanel.setPreferredSize(null); + jobPanel.setLayout(new BorderLayout()); + jobPanel.add(setDetails, BorderLayout.NORTH); + jobPanel.add(paramPane, BorderLayout.CENTER); + // jobPanel.setOrientation(JSplitPane.VERTICAL_SPLIT); + + add(setNamePanel, BorderLayout.NORTH); add(jobPanel, BorderLayout.CENTER); JPanel dialogpanel = new JPanel(); dialogpanel.add(startjob); dialogpanel.add(canceljob); + // JAL-1580: setMaximumSize() doesn't work, so just size for the worst case: + // check for null is for JUnit usage + final int windowHeight = Desktop.getInstance() == null ? DEFAULT_HEIGHT + : Desktop.getInstance().getHeight(); + setPreferredSize(new Dimension(540, windowHeight)); add(dialogpanel, BorderLayout.SOUTH); + validate(); } protected void revert_actionPerformed(ActionEvent e) { reInitDialog(lastParmSet); - + updateWebServiceMenus(); } protected void update_actionPerformed(ActionEvent e) @@ -434,6 +414,7 @@ public class WsJobParameters extends JPanel implements ItemListener, _deleteUserPreset(lastParmSet); } reInitDialog(null); // service default + updateWebServiceMenus(); } protected void create_actionPerformed(ActionEvent e) @@ -444,7 +425,9 @@ public class WsJobParameters extends JPanel implements ItemListener, _storeCurrentPreset(curname); lastParmSet = curname; isUserPreset = true; + reInitDialog(curname); initArgSetModified(); + updateWebServiceMenus(); } else { @@ -455,53 +438,40 @@ public class WsJobParameters extends JPanel implements ItemListener, protected void canceljob_actionPerformed(ActionEvent e) { - response = 0; + startJob = false; if (frame != null) { frame.setVisible(false); } + completionStage.complete(false); } protected void startjob_actionPerformed(ActionEvent e) { - response = 1; + startJob = true; if (frame != null) { frame.setVisible(false); } + completionStage.complete(true); } - Jws2Instance service; + void initForService(WsParamSetI paramSet, List jobArgset) + { + settingDialog = true; - /** - * list of service presets in the gui - */ - Hashtable servicePresets = null; + init(paramSet, jobArgset); - /** - * set if dialog is being set - so handlers will avoid spurious events - */ - boolean settingDialog = false; + } - void initForService(Jws2Instance service, WsParamSetI jabap, - List jabajobArgset) + void init(WsParamSetI p, List jobArgset) { - WsParamSetI p = null; - List jobArgset = null; - settingDialog = true; - { // instantiate the abstract proxy for Jaba objects - jobArgset = jabajobArgset == null ? null : JabaParamStore - .getJwsArgsfromJaba(jabajobArgset); - p = jabap; // (jabap != null) ? paramStore.getPreset(jabap.getName()) : - // null; - } - - Hashtable exnames = new Hashtable(); + Hashtable exnames = new Hashtable<>(); for (int i = 0, iSize = setName.getItemCount(); i < iSize; i++) { - exnames.put((String) setName.getItemAt(i), setName.getItemAt(i)); + exnames.put(setName.getItemAt(i), setName.getItemAt(i)); } - servicePresets = new Hashtable(); + servicePresets = new Hashtable<>(); // Add the default entry - if not present already. if (!exnames.contains(SVC_DEF)) { @@ -509,7 +479,8 @@ public class WsJobParameters extends JPanel implements ItemListener, exnames.put(SVC_DEF, SVC_DEF); servicePresets.put(SVC_DEF, SVC_DEF); } - String curname = (p == null ? "" : p.getName()); + + // String curname = (p == null ? "" : p.getName()); for (WsParamSetI pr : paramStore.getPresets()) { if (!pr.isModifiable()) @@ -537,7 +508,10 @@ public class WsJobParameters extends JPanel implements ItemListener, if (jobArgset != null && jobArgset.size() > 0) { curSetName = "Supplied Settings"; + isUserPreset = false; updateTable(p, jobArgset); + setName.setSelectedItem(curSetName); + updateButtonDisplay(); } else { @@ -546,24 +520,36 @@ public class WsJobParameters extends JPanel implements ItemListener, } } settingDialog = false; - } - @SuppressWarnings("unchecked") private void updateTable(WsParamSetI p, List jobArgset) { + boolean setDefaultParams = false; + if (lastParmSet == null) + { + isUserPreset = false; + // First call - so provide Service default settings + setName.setSelectedItem(lastSetName = SVC_DEF); + } + if (p == null && SVC_DEF.equals("" + setName.getSelectedItem())) + { + // indicate that service defaults should be set if available + setDefaultParams = true; + } // populate table from default parameter set. List args = paramStore.getServiceParameters(); // split to params and required arguments { + int cw = 0; + boolean optset = false; for (ArgumentI myarg : args) { // Ideally, Argument would implement isRequired ! if (myarg instanceof ParameterI) { ParameterI parm = (ParameterI) myarg; - paramList.add(opanp.addParameter(parm)); + opanp.addParameter(parm).validate(); } else { @@ -571,13 +557,13 @@ public class WsJobParameters extends JPanel implements ItemListener, { OptionI opt = (OptionI) myarg; OptionBox ob = opanp.addOption(opt); - jobOptions.add(ob, FlowLayout.LEFT); - ob.resetToDefault(); - if (MAX_OPTWIDTH < ob.getPreferredSize().width) + ob.resetToDefault(setDefaultParams); + if (maxOptWidth < ob.getPreferredSize().width) { - MAX_OPTWIDTH = ob.getPreferredSize().width; + maxOptWidth = ob.getPreferredSize().width; } - + ob.validate(); + cw += ob.getPreferredSize().width + 5; } else { @@ -605,16 +591,6 @@ public class WsJobParameters extends JPanel implements ItemListener, // TODO: check if args should be unselected prior to resetting using the // preset } - else - { - if (lastParmSet == null) - { - isUserPreset = false; - // first call - so create a dummy name - - setName.setSelectedItem(lastSetName = SVC_DEF); - } - } if (jobArgset != null) { @@ -653,8 +629,6 @@ public class WsJobParameters extends JPanel implements ItemListener, return modifiedElements.size() > 0; } - private Hashtable modifiedElements = new Hashtable(); - /** * reset gui and modification state settings */ @@ -667,7 +641,8 @@ public class WsJobParameters extends JPanel implements ItemListener, private void updateButtonDisplay() { - boolean _update = false, _create = false, _delete = false, _revert = false; + boolean _update = false, _create = false, _delete = false, + _revert = false; if (modifiedElements.size() > 0) { // set modified @@ -693,6 +668,7 @@ public class WsJobParameters extends JPanel implements ItemListener, validate(); } + @Override public void argSetModified(Object modifiedElement, boolean b) { if (settingDialog) @@ -717,7 +693,7 @@ public class WsJobParameters extends JPanel implements ItemListener, if (b && modifiedElements.size() > 0) { makeSetNameValid(!isUserPreset); - SetNamePanel.revalidate(); + setNamePanel.revalidate(); } updateButtonDisplay(); } @@ -737,8 +713,8 @@ public class WsJobParameters extends JPanel implements ItemListener, boolean stn = settingDialog; boolean renamed = false; settingDialog = true; - String nm = (curSetName != null ? curSetName : (String) setName - .getSelectedItem()); + String nm = (curSetName != null ? curSetName + : (String) setName.getSelectedItem()); // check if the name is reserved - if it is, rename it. if (isServicePreset(nm)) { @@ -764,7 +740,7 @@ public class WsJobParameters extends JPanel implements ItemListener, // sync the gui with the preset database for (int i = 0, iS = setName.getItemCount(); i < iS; i++) { - String snm = (String) setName.getItemAt(i); + String snm = setName.getItemAt(i); if (snm.equals(nm)) { makeupdate = true; @@ -784,291 +760,118 @@ public class WsJobParameters extends JPanel implements ItemListener, settingDialog = stn; } - + /** + * Rebuilds the Options and Parameters panels + */ + @Override public void refreshParamLayout() { - FlowLayout fl = new FlowLayout(FlowLayout.LEFT); - int sep=fl.getVgap(); - int os=0,s = jobOptions.getBorder().getBorderInsets(jobOptions).bottom+jobOptions.getBorder().getBorderInsets(jobOptions).top+2 * sep; - int w = 2 * fl.getHgap() + (MAX_OPTWIDTH > OptsAndParamsPage.PARAM_WIDTH ? MAX_OPTWIDTH : OptsAndParamsPage.PARAM_WIDTH); - jobOptions.setLayout(fl); + final int rightMargin = 40; + final int availableWidth = paramPane.getViewport().getSize().width + - rightMargin + - optionsPanel.getBorder().getBorderInsets(optionsPanel).left + + optionsPanel.getBorder().getBorderInsets(optionsPanel).right; + if (opanp.getOptSet().size() > 0) { - + int hgap = 5; + int currentWidth = hgap; + + /* + * layout constraint 'nogrid' prevents vertical column alignment, + * allowing controls to flow without extra space inserted to align + */ + optionsPanel.setLayout(new MigLayout("nogrid", "", "")); + optionsPanel.removeAll(); + JPanel lastAdded = null; + + /* + * add each control in turn; if adding would overflow the right margin, + * remove and re-add the previous parameter with "wrap" (after) + * in order to start a new row + */ for (OptionBox pbox : opanp.getOptSet().values()) { - pbox.revalidate(); - s += sep + pbox.getPreferredSize().height; + pbox.validate(); + int boxWidth = pbox.getSize().width; + currentWidth += boxWidth + hgap; + boolean wrapAfterLast = currentWidth > availableWidth + && lastAdded != null; + // System.out.println(String.format( + // "%s width=%d, paneWidth=%d, currentWidth=%d, wrapAfterLast=%s", + // pbox.toString(), boxWidth, panewidth, currentWidth, + // wrapAfterLast)); + if (wrapAfterLast) + { + optionsPanel.remove(lastAdded); + optionsPanel.add(lastAdded, "wrap"); + currentWidth = hgap + boxWidth; + } + optionsPanel.add(pbox); + lastAdded = pbox; } - jobOptions.setPreferredSize(new Dimension(w, s)); - jobOptions.setLayout(new GridLayout(opanp.getOptSet().size(),1)); - os=s; + optionsPanel.revalidate(); } else { - jobOptions.setVisible(false); + optionsPanel.setVisible(false); } - // Now layout the parameters assuming they occupy one column - to calculate total height of options+parameters - fl = new FlowLayout(FlowLayout.CENTER); - // helpful hint from http://stackoverflow.com/questions/2743177/top-alignment-for-flowlayout - fl.setAlignOnBaseline(true); if (opanp.getParamSet().size() > 0) { - paramList.setLayout(fl); + paramsPanel.removeAll(); + paramsPanel.setLayout(new MigLayout("", "", "")); + int hgap = 5; + int currentWidth = hgap; - s = 2 * sep; + JPanel lastAdded = null; for (ParamBox pbox : opanp.getParamSet().values()) { pbox.validate(); - s += sep + pbox.getPreferredSize().height+pbox.getBorder().getBorderInsets(pbox).bottom; + int boxWidth = pbox.getSize().width; + currentWidth += boxWidth + hgap; + boolean wrapAfterLast = currentWidth > availableWidth + && lastAdded != null; + if (wrapAfterLast) + { + paramsPanel.remove(lastAdded); + paramsPanel.add(lastAdded, "wrap"); + currentWidth = pbox.getSize().width + hgap; + } + paramsPanel.add(pbox); + lastAdded = pbox; } - - paramList.setPreferredSize(new Dimension(w, s)); - os+=s+2*sep+paramList.getBorder().getBorderInsets(paramList).bottom+paramList.getBorder().getBorderInsets(paramList).top; + + /* + * s = 2 * sep; for (ParamBox pbox : opanp.getParamSet().values()) { + * pbox.validate(); s += sep + + * pbox.getPreferredSize().height+pbox.getBorder + * ().getBorderInsets(pbox).bottom; } + * + * // paramList.setPreferredSize(new Dimension(w, s)); + * os+=s+2*sep+paramList + * .getBorder().getBorderInsets(paramList).bottom+paramList + * .getBorder().getBorderInsets(paramList).top; + */ + paramsPanel.revalidate(); } else { - paramList.setVisible(false); + paramsPanel.setVisible(false); } - // TODO: waste some time trying to eliminate any unnecessary .validate calls here - paramList.validate(); - jobOptions.validate(); + // TODO: waste some time trying to eliminate any unnecessary .validate calls + // here // System.out.println("Size will be : "+w+","+os); - optsAndparams.validate(); - paramPane.getViewport().validate(); - paramPane.getVerticalScrollBar().setBlockIncrement(OptsAndParamsPage.PARAM_CLOSEDHEIGHT*2); - paramPane.validate(); - validate(); + // optsAndparams.setPreferredSize(null); + // paramPane.getViewport().setView(optsAndparams); + paramPane.getViewport().setAutoscrolls(true); + paramPane.revalidate(); + revalidate(); } - - /** - * testing method - grab a service and parameter set and show the window - * - * @param args - */ - public static void main(String[] args) + public boolean isServiceDefaults() { - jalview.ws.jws2.Jws2Discoverer disc = jalview.ws.jws2.Jws2Discoverer - .getDiscoverer(); - int p = 0; - if (args.length > 0) - { - Vector services = new Vector(); - services.addElement(args[p++]); - Jws2Discoverer.setServiceUrls(services); - } - try - { - disc.run(); - } catch (Exception e) - { - System.err.println("Aborting. Problem discovering services."); - e.printStackTrace(); - return; - } - Jws2Discoverer.Jws2Instance lastserv = null; - for (Jws2Discoverer.Jws2Instance service : disc.getServices()) - { - lastserv = service; - if (p >= args.length || service.serviceType.equalsIgnoreCase(args[p])) - { - if (lastserv != null) - { - List prl = null; - Preset pr = null; - if (++p < args.length) - { - PresetManager prman = lastserv.getPresets(); - if (prman != null) - { - pr = prman.getPresetByName(args[p]); - if (pr == null) - { - // just grab the last preset. - prl = prman.getPresets(); - } - } - } - else - { - PresetManager prman = lastserv.getPresets(); - if (prman != null) - { - prl = prman.getPresets(); - } - } - Iterator en = (prl == null) ? null : prl.iterator(); - while (en != null && en.hasNext()) - { - if (en != null) - { - if (!en.hasNext()) - { - en = prl.iterator(); - } - pr = en.next(); - } - { - System.out.println("Testing opts dupes for " - + lastserv.getUri() + " : " - + lastserv.getActionText() + ":" + pr.getName()); - List