3 import java.awt.BorderLayout;
5 import java.awt.Component;
6 import java.awt.Dimension;
7 import java.awt.FlowLayout;
9 import java.awt.GridLayout;
10 import java.awt.Rectangle;
11 import java.awt.event.ActionEvent;
12 import java.awt.event.ActionListener;
13 import java.awt.event.ComponentEvent;
14 import java.awt.event.ComponentListener;
15 import java.awt.event.ContainerEvent;
16 import java.awt.event.ContainerListener;
17 import java.awt.event.KeyEvent;
18 import java.awt.event.KeyListener;
19 import java.awt.event.MouseEvent;
20 import java.awt.event.MouseListener;
21 import java.awt.event.WindowEvent;
22 import java.awt.event.WindowListener;
23 import java.awt.event.WindowStateListener;
24 import java.util.ArrayList;
25 import java.util.EventObject;
26 import java.util.HashSet;
27 import java.util.Hashtable;
28 import java.util.Iterator;
29 import java.util.List;
31 import java.util.Vector;
33 import javax.swing.JButton;
34 import javax.swing.JCheckBox;
35 import javax.swing.JComboBox;
36 import javax.swing.JDialog;
37 import javax.swing.JFrame;
38 import javax.swing.JLabel;
39 import javax.swing.JList;
40 import javax.swing.JOptionPane;
41 import javax.swing.JPanel;
42 import javax.swing.JScrollPane;
43 import javax.swing.JSlider;
44 import javax.swing.JTable;
45 import javax.swing.JTextArea;
46 import javax.swing.JTextField;
47 import javax.swing.ListSelectionModel;
48 import javax.swing.SwingConstants;
49 import javax.swing.SwingUtilities;
50 import javax.swing.border.TitledBorder;
51 import javax.swing.event.CellEditorListener;
52 import javax.swing.event.ChangeEvent;
53 import javax.swing.event.ChangeListener;
54 import javax.swing.table.*;
56 import compbio.metadata.Argument;
57 import compbio.metadata.Option;
58 import compbio.metadata.Parameter;
59 import compbio.metadata.Preset;
60 import compbio.metadata.PresetManager;
61 import compbio.metadata.RunnerConfig;
62 import compbio.metadata.ValueConstrain;
63 import compbio.metadata.WrongParameterException;
64 import compbio.metadata.ValueConstrain.Type;
66 import jalview.ws.jws2.Jws2Discoverer;
67 import jalview.ws.jws2.Jws2Discoverer.Jws2Instance;
69 public class WsJobParameters extends JPanel
71 private static final int PARAM_WIDTH = 340, PARAM_HEIGHT = 120;
73 JPanel setDetails = new JPanel();
75 JPanel settingsPanel = new JPanel();
77 JPanel jobOptions = new JPanel();
79 JPanel jobParameters = new JPanel();
81 JPanel paramButtons = new JPanel();
83 JPanel paramPanel = new JPanel();
84 JLabel modified = new JLabel();
85 JButton startjob = new JButton();
86 JButton canceljob = new JButton();
88 JButton exportParams = new JButton();
90 JButton importParams = new JButton();
92 JButton resetParams = new JButton();
94 JButton addParam = new JButton();
96 JButton removeParam = new JButton();
98 JButton editParam = new JButton();
100 JLabel setName = new JLabel();
102 JTextArea setDescr = new JTextArea();
104 JScrollPane paramPane = new JScrollPane();
106 // JList paramList = new JList();
107 JPanel paramList = new JPanel();
109 RunnerConfig serviceOptions;
111 List<Parameter> availableParameters;
113 private BorderLayout jparamLayout;
115 WsJobParameters(Jws2Instance service)
120 public WsJobParameters(Jws2Instance service, Preset p)
122 this(null, service, p, null);
128 * - if null, create new JFrame outside of desktop
132 public WsJobParameters(JFrame parent, Jws2Instance service, Preset p,
133 List<Argument> jobArgset)
137 argSetModified(false);
138 // populate parameter table
139 initForService(service, p, jobArgset);
140 // display in new JFrame attached to parent.
145 public boolean showRunDialog() {
148 Desktop.instance, true);
150 frame.setTitle("Edit parameters for "+service.getActionText());
151 Rectangle deskr = Desktop.instance.getBounds();
152 frame.setBounds(new Rectangle((int) (deskr.getCenterX() - 240),
153 (int) (deskr.getCenterY() - 92), 380, 385));
154 frame.setContentPane(this);
156 frame.setVisible(true);
165 private void jbInit()
167 modified.setText("Job Options Modified");
168 modified.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));
169 modified.setForeground(Color.red);
170 modified.setHorizontalAlignment(SwingConstants.CENTER);
172 exportParams.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));
173 exportParams.setText("Export");
174 exportParams.setToolTipText("Export parameters to a file");
175 exportParams.addActionListener(new ActionListener()
177 public void actionPerformed(ActionEvent e)
179 exportParams_actionPerformed(e);
182 importParams.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));
183 importParams.setText("Import");
184 importParams.setToolTipText("Import parameters from a file");
185 importParams.addActionListener(new ActionListener()
187 public void actionPerformed(ActionEvent e)
189 importParams_actionPerformed(e);
192 resetParams.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));
193 resetParams.setText("Defaults");
194 resetParams.setToolTipText("Reset to defaults");
195 resetParams.addActionListener(new ActionListener()
197 public void actionPerformed(ActionEvent e)
199 resetParams_actionPerformed(e);
202 addParam.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));
203 addParam.setText("Add");
204 addParam.setToolTipText("Add new parameter");
205 addParam.addActionListener(new ActionListener()
207 public void actionPerformed(ActionEvent e)
209 addParam_actionPerformed(e);
212 removeParam.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));
213 removeParam.setText("Remove");
214 removeParam.setToolTipText("Remove selected parameter");
215 removeParam.addActionListener(new ActionListener()
217 public void actionPerformed(ActionEvent e)
219 removeParam_actionPerformed(e);
222 editParam.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));
223 editParam.setText("Edit");
224 editParam.setToolTipText("Edit selected parameter");
225 editParam.addActionListener(new ActionListener()
227 public void actionPerformed(ActionEvent e)
229 editParam_actionPerformed(e);
232 startjob.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));
233 startjob.setText("Start");
234 startjob.setToolTipText("Start Job");
235 startjob.addActionListener(new ActionListener()
237 public void actionPerformed(ActionEvent e)
239 startjob_actionPerformed(e);
242 canceljob.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));
243 canceljob.setText("Cancel");
244 canceljob.setToolTipText("Cancel Job");
245 canceljob.addActionListener(new ActionListener()
247 public void actionPerformed(ActionEvent e)
249 canceljob_actionPerformed(e);
253 setDetails.setBorder(new TitledBorder("Details"));
254 setDetails.setLayout(new GridLayout(2, 1));
255 setDescr.setColumns(40);
256 setDescr.setWrapStyleWord(true);
257 setDescr.setLineWrap(true);
258 setDescr.setPreferredSize(new Dimension(350, 90));
259 setDescr.setBackground(getBackground());
260 setDescr.setEditable(false);
261 setDetails.add(setName);
262 setDetails.add(setDescr);
263 setDetails.setPreferredSize(new Dimension(360, 100));
264 settingsPanel.setLayout(new BorderLayout());
265 jobOptions.setBorder(new TitledBorder("Options"));
266 jobParameters.setBorder(new TitledBorder("Parameters"));
267 jobParameters.setLayout(jparamLayout = new BorderLayout());
268 paramPane.setPreferredSize(new Dimension(360, 300));
269 paramPane.getVerticalScrollBar().setUnitIncrement(20);
270 // paramPanel.setPreferredSize(new Dimension(360, 300));
271 paramButtons.setLayout(new GridLayout(2, 3));
272 paramButtons.add(addParam);
273 paramButtons.add(editParam);
274 paramButtons.add(removeParam);
275 // TODO: relayout buttons nicely
276 paramButtons.add(exportParams);
277 paramButtons.add(importParams);
278 paramButtons.add(resetParams);
279 paramPane.getViewport().setView(paramList);
280 jobParameters.add(paramPane, BorderLayout.NORTH);
281 //jobParameters.add(paramButtons, BorderLayout.SOUTH);
282 settingsPanel.add(modified, BorderLayout.NORTH);
283 settingsPanel.add(jobOptions, BorderLayout.CENTER);
284 settingsPanel.add(jobParameters, BorderLayout.SOUTH);
286 setLayout(new BorderLayout());
287 // setPreferredSize(new Dimension(400, 600));
288 // setSize(new Dimension(400, 600));
289 add(setDetails, BorderLayout.NORTH);
290 add(settingsPanel, BorderLayout.CENTER);
291 JPanel dialogpanel = new JPanel();
292 dialogpanel.add(startjob);
293 dialogpanel.add(canceljob);
294 add(dialogpanel, BorderLayout.SOUTH);
297 protected void canceljob_actionPerformed(ActionEvent e)
301 frame.setVisible(false);
305 protected void startjob_actionPerformed(ActionEvent e)
309 frame.setVisible(false);
313 protected void editParam_actionPerformed(ActionEvent e)
315 // TODO Auto-generated method stub
319 protected void removeParam_actionPerformed(ActionEvent e)
321 // TODO Auto-generated method stub
325 protected void addParam_actionPerformed(ActionEvent e)
327 // TODO Auto-generated method stub
331 protected void resetParams_actionPerformed(ActionEvent e)
333 // TODO Auto-generated method stub
337 protected void importParams_actionPerformed(ActionEvent e)
339 // TODO Auto-generated method stub
343 protected void exportParams_actionPerformed(ActionEvent e)
345 // TODO Auto-generated method stub
349 Jws2Instance service;
350 void initForService(Jws2Instance service, Preset p,
351 List<Argument> jobArgset)
353 this.service=service;
354 serviceOptions = service.getRunnerConfig();
355 updateTable(p, jobArgset);
358 @SuppressWarnings("unchecked")
359 private void updateTable(Preset p, List<Argument> jobArgset)
361 availableParameters = new ArrayList<Parameter>();
362 List<Parameter> setargs = new ArrayList<Parameter>();
363 // populate table from default parameter set.
364 List<Argument> args = serviceOptions.getArguments();
366 // split to params and required arguments
368 for (Argument arg : args)
370 Argument myarg = (Argument) arg;
371 // Ideally, Argument would implement isRequired !
372 if (myarg instanceof Parameter)
374 Parameter parm = (Parameter) myarg;
375 if (true) // parm.isRequired())
381 availableParameters.add(parm);
386 if (myarg instanceof Option)
388 Option opt = (Option) myarg;
390 if (opt.isRequired())
392 selectOption(opt, opt.getDefaultValue());
397 System.err.println("Ignoring unknown service argument type "
398 + arg.getClass().getName());
402 args=null; // no more args to process.
406 setDescr.setText(p.getDescription());
407 setName.setText(p.getName());
408 setDetails.setVisible(true);
412 args = p.getArguments(serviceOptions);
413 } catch (Exception e)
417 // TODO: check if args should be unselected prior to resetting using the preset
420 setDetails.setVisible(false);
422 if (jobArgset != null)
424 argSetModified(true);
427 // get setargs from current object
430 for (Argument arg : args)
432 if (arg instanceof Parameter)
434 setargs.add((Parameter) arg);
438 if (arg instanceof Option)
440 selectOption((Option) arg, arg.getDefaultValue());
447 // mdl.setData(setargs);
448 // jobOptions.setLayout(new GridLayout(optSet.size() / 2 + 1, 2));
449 jobOptions.setLayout(new GridLayout(optSet.size(), 1));
450 // paramPanel.setLayout(new GridLayout(paramSet.size(), 1));
452 // paramPane.getViewport().validate();
453 paramList.setPreferredSize(new Dimension(350, paramSet.size()
455 paramList.setLayout(new GridLayout(paramSet.size(), 1));
456 paramList.validate();
457 paramPane.validate();
461 private void argSetModified(boolean b)
464 modified.setVisible(b);
472 private void addParameter(Parameter parm)
474 ParamBox pb = paramSet.get(parm.getName());
477 pb = new ParamBox(parm);
478 paramSet.put(parm.getName(), pb);
483 private void selectOption(Option opt, String string)
485 OptionBox cb = optSet.get(opt.getName());
492 // no value specified.
493 if (opt.isRequired())
495 // indicate option needs to be selected!
499 cb.enabled.setSelected(false);
504 cb.enabled.setSelected(true);
506 if (opt.getPossibleValues().contains(string))
508 cb.val.setSelectedItem(string);
512 throw new Error("Invalid value " + string + " for option " + opt);
518 Map<String, ParamBox> paramSet = new Hashtable<String, ParamBox>();
520 public class ParamBox extends JPanel implements ChangeListener,
523 JLabel name = new JLabel();
525 JTextArea string = new JTextArea();
526 JScrollPane descPanel = new JScrollPane();
527 JSlider slider = null;
529 JTextField valueField = null;
531 ValueConstrain validator = null;
533 boolean integ = false;
534 boolean choice=false;
535 public ParamBox(Parameter parm)
537 setLayout(new FlowLayout());
538 setBorder(new TitledBorder(parm.getName()));
539 setPreferredSize(new Dimension(PARAM_WIDTH, PARAM_HEIGHT));
540 string.setFont(new Font("Verdana", Font.PLAIN, 11));
541 string.setBackground(getBackground());
542 //string.setSize(new Dimension(PARAM_WIDTH, 80));
543 string.setEditable(false);
544 descPanel.setPreferredSize(new Dimension(PARAM_WIDTH, 70));
545 descPanel.getViewport().setView(string);
546 // string.setMinimumSize(new Dimension(140,80));
547 // string.setMaximumSize(new Dimension(280,80));
548 string.setWrapStyleWord(true);
549 string.setLineWrap(true);
550 string.setColumns(40);
551 string.setText(parm.getDescription());
552 descPanel.validate();
553 // name.setToolTipText(parm.getDescription());
554 add(descPanel); // , BorderLayout.NORTH);
555 validator = parm.getValidValue();
557 if (validator != null)
559 integ = validator.getType() == Type.Integer;
561 if (parameter.getPossibleValues()!=null)
566 updateControls(parm);
569 boolean adjusting = false;
572 public void updateControls(Parameter parm)
575 boolean init = valueField == null;
582 choicebox = new JComboBox();
583 choicebox.addActionListener(this);
586 slider = new JSlider();
587 slider.addChangeListener(this);
588 valueField = new JTextField();
589 valueField.addActionListener(this);
590 valueField.setPreferredSize(new Dimension(80, 25));
591 JPanel container = new JPanel();
592 // container.setLayout(new FlowLayout());
593 add(slider);// , BorderLayout.SOUTH);
594 add(valueField);// ,BorderLayout.CENTER);
595 // add(container, BorderLayout.EAST);
596 // container.validate();
603 List vals = parm.getPossibleValues();
604 for (Object val: vals)
606 choicebox.addItem(val);
608 if (parm.getDefaultValue()!=null) {
609 choicebox.setSelectedItem(parm.getDefaultValue());
612 valueField.setText(parm.getDefaultValue());
615 updateSliderFromValueField();
618 public Parameter getParameter() {
622 parameter.setDefaultValue((String)choicebox.getSelectedItem());
625 parameter.setDefaultValue(valueField.getText());
627 } catch (WrongParameterException e)
634 public Object updateSliderFromValueField()
638 if (validator != null)
645 valueField.setText(valueField.getText().trim());
646 iVal = Integer.valueOf(valueField.getText());
647 } catch (Exception e)
651 if (validator.getMin() != null && validator.getMax() != null)
653 slider.getModel().setRangeProperties(iVal, 1,
654 validator.getMin().intValue(),
655 validator.getMax().intValue(), true);
659 slider.setVisible(false);
669 fVal = Float.valueOf(valueField.getText());
670 } catch (Exception e)
674 if (validator.getMin() != null && validator.getMax() != null)
676 slider.getModel().setRangeProperties((int) fVal * 1000, 1,
677 (int) validator.getMin().floatValue() * 1000,
678 (int) validator.getMax().floatValue() * 1000, true);
682 slider.setVisible(false);
691 slider.setVisible(false);
693 { valueField.getText().trim() };
696 return new String[] { (String) choicebox.getSelectedItem()};
703 public void stateChanged(ChangeEvent e)
707 valueField.setText(""
708 + ((integ) ? ("" + (int) slider.getValue())
709 : ("" + (float) (slider.getValue() / 1000f))));
714 public void actionPerformed(ActionEvent e)
718 } else if (!adjusting)
720 updateSliderFromValueField();
722 argSetModified(true);
727 Map<String, OptionBox> optSet = new Hashtable<String, OptionBox>();
729 public class OptionBox extends JPanel implements ActionListener
731 JComboBox val = new JComboBox();
733 JCheckBox enabled = new JCheckBox();
735 public OptionBox(Option opt)
738 setLayout(new BorderLayout());
739 enabled.setSelected(opt.isRequired());
740 enabled.setFont(new Font("Verdana", Font.PLAIN, 11));
741 enabled.setText(opt.getName());
742 enabled.setToolTipText(opt.getDescription());
743 add(enabled, BorderLayout.NORTH);
744 if (opt.getPossibleValues().size() > 1)
746 setLayout(new GridLayout(1, 2));
747 for (Object str : opt.getPossibleValues())
749 val.addItem((String) str);
751 val.setSelectedItem((String) opt.getDefaultValue());
752 val.addActionListener(this);
753 add(val, BorderLayout.SOUTH);
755 // TODO: add actionListeners for popup (to open further info),
756 // and to update list of parameters if an option is enabled
757 // that takes a value.
759 public Option getOptionIfEnabled() {
760 if (!enabled.isSelected())
765 if (val.getSelectedItem()!=null)
767 option.setDefaultValue((String) val.getSelectedItem());
769 } catch (WrongParameterException e)
777 public void actionPerformed(ActionEvent e)
779 argSetModified(true);
780 enabled.setSelected(true);
784 private OptionBox addOption(Option opt)
786 OptionBox cb = optSet.get(opt.getName());
789 cb = new OptionBox(opt);
790 optSet.put(opt.getName(), cb);
797 * testing method - grab a service and parameter set and show the window
801 public static void main(String[] args)
803 jalview.ws.jws2.Jws2Discoverer disc = jalview.ws.jws2.Jws2Discoverer
808 Vector<String> services = new Vector<String>();
809 services.addElement(args[p++]);
810 Jws2Discoverer.setServiceUrls(services);
815 } catch (Exception e)
817 System.err.println("Aborting. Problem discovering services.");
821 Jws2Discoverer.Jws2Instance lastserv = null;
822 for (Jws2Discoverer.Jws2Instance service : disc.getServices())
825 if (p < args.length && service.serviceType.equalsIgnoreCase(args[p]))
830 if (lastserv != null)
832 List<Preset> prl = null;
834 if (++p < args.length)
836 PresetManager prman = lastserv.getPresets();
839 pr = prman.getPresetByName(args[p]);
842 // just grab the last preset.
843 prl = prman.getPresets();
847 Iterator<Preset> en = (prl == null) ? null : prl.iterator();
858 WsJobParameters pgui = new WsJobParameters(lastserv, pr);
859 JFrame jf = new JFrame("Parameters for " + lastserv.getActionText());
860 JPanel cont = new JPanel();
861 jf.setPreferredSize(new Dimension(600, 800));
864 final Thread thr = Thread.currentThread();
865 jf.addWindowListener(new WindowListener()
869 public void windowActivated(WindowEvent e)
871 // TODO Auto-generated method stub
876 public void windowClosed(WindowEvent e)
881 public void windowClosing(WindowEvent e)
888 public void windowDeactivated(WindowEvent e)
890 // TODO Auto-generated method stub
895 public void windowDeiconified(WindowEvent e)
897 // TODO Auto-generated method stub
902 public void windowIconified(WindowEvent e)
904 // TODO Auto-generated method stub
909 public void windowOpened(WindowEvent e)
911 // TODO Auto-generated method stub
917 boolean inter = false;
923 } catch (Exception e)
934 public List<Argument> getJobParams()
936 List<Argument> argSet = new ArrayList<Argument>();
937 // recover options and parameters from GUI
938 for (OptionBox opts: optSet.values())
940 Option opt = opts.getOptionIfEnabled();
946 for (ParamBox parambox: paramSet.values())
948 Parameter parm = parambox.getParameter();