edit jws2 job parameters before running job
[jalview.git] / src / jalview / gui / WsJobParameters.java
1 package jalview.gui;
2
3 import java.awt.BorderLayout;
4 import java.awt.Color;
5 import java.awt.Component;
6 import java.awt.Dimension;
7 import java.awt.FlowLayout;
8 import java.awt.Font;
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;
30 import java.util.Map;
31 import java.util.Vector;
32
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.*;
55
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;
65
66 import jalview.ws.jws2.Jws2Discoverer;
67 import jalview.ws.jws2.Jws2Discoverer.Jws2Instance;
68
69 public class WsJobParameters extends JPanel
70 {
71   private static final int PARAM_WIDTH = 340, PARAM_HEIGHT = 120;
72
73   JPanel setDetails = new JPanel();
74
75   JPanel settingsPanel = new JPanel();
76
77   JPanel jobOptions = new JPanel();
78
79   JPanel jobParameters = new JPanel();
80
81   JPanel paramButtons = new JPanel();
82
83   JPanel paramPanel = new JPanel();
84   JLabel modified = new JLabel();
85   JButton startjob = new JButton();
86   JButton canceljob = new JButton();
87
88   JButton exportParams = new JButton();
89
90   JButton importParams = new JButton();
91
92   JButton resetParams = new JButton();
93
94   JButton addParam = new JButton();
95
96   JButton removeParam = new JButton();
97
98   JButton editParam = new JButton();
99
100   JLabel setName = new JLabel();
101
102   JTextArea setDescr = new JTextArea();
103
104   JScrollPane paramPane = new JScrollPane();
105
106   // JList paramList = new JList();
107   JPanel paramList = new JPanel();
108
109   RunnerConfig serviceOptions;
110
111   List<Parameter> availableParameters;
112
113   private BorderLayout jparamLayout;
114
115   WsJobParameters(Jws2Instance service)
116   {
117     this(service, null);
118   }
119
120   public WsJobParameters(Jws2Instance service, Preset p)
121   {
122     this(null, service, p, null);
123   }
124
125   /**
126    * 
127    * @param desktop
128    *          - if null, create new JFrame outside of desktop
129    * @param service
130    * @param p
131    */
132   public WsJobParameters(JFrame parent, Jws2Instance service, Preset p,
133           List<Argument> jobArgset)
134   {
135     super();
136     jbInit();
137     argSetModified(false);
138     // populate parameter table
139     initForService(service, p, jobArgset);
140     // display in new JFrame attached to parent.
141     validate();
142   }
143   int response=-1;
144   JDialog frame=null;
145   public boolean showRunDialog() {
146     
147     frame = new JDialog(
148             Desktop.instance, true);
149     
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);
155
156     frame.setVisible(true);
157     
158     if (response>0)
159     {
160       return true;
161     }
162     return false;
163   }
164   
165   private void jbInit()
166   {
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);
171     
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()
176     {
177       public void actionPerformed(ActionEvent e)
178       {
179         exportParams_actionPerformed(e);
180       }
181     });
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()
186     {
187       public void actionPerformed(ActionEvent e)
188       {
189         importParams_actionPerformed(e);
190       }
191     });
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()
196     {
197       public void actionPerformed(ActionEvent e)
198       {
199         resetParams_actionPerformed(e);
200       }
201     });
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()
206     {
207       public void actionPerformed(ActionEvent e)
208       {
209         addParam_actionPerformed(e);
210       }
211     });
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()
216     {
217       public void actionPerformed(ActionEvent e)
218       {
219         removeParam_actionPerformed(e);
220       }
221     });
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()
226     {
227       public void actionPerformed(ActionEvent e)
228       {
229         editParam_actionPerformed(e);
230       }
231     });
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()
236     {
237       public void actionPerformed(ActionEvent e)
238       {
239         startjob_actionPerformed(e);
240       }
241     });
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()
246     {
247       public void actionPerformed(ActionEvent e)
248       {
249         canceljob_actionPerformed(e);
250       }
251     });
252
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);
285     
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);
295   }
296
297   protected void canceljob_actionPerformed(ActionEvent e)
298   {
299     response=0;
300     if (frame!=null) {
301       frame.setVisible(false);
302     }
303   }
304
305   protected void startjob_actionPerformed(ActionEvent e)
306   {
307     response=1;
308     if (frame!=null) {
309       frame.setVisible(false);
310     }
311   }
312
313   protected void editParam_actionPerformed(ActionEvent e)
314   {
315     // TODO Auto-generated method stub
316
317   }
318
319   protected void removeParam_actionPerformed(ActionEvent e)
320   {
321     // TODO Auto-generated method stub
322
323   }
324
325   protected void addParam_actionPerformed(ActionEvent e)
326   {
327     // TODO Auto-generated method stub
328
329   }
330
331   protected void resetParams_actionPerformed(ActionEvent e)
332   {
333     // TODO Auto-generated method stub
334
335   }
336
337   protected void importParams_actionPerformed(ActionEvent e)
338   {
339     // TODO Auto-generated method stub
340
341   }
342
343   protected void exportParams_actionPerformed(ActionEvent e)
344   {
345     // TODO Auto-generated method stub
346
347   }
348
349   Jws2Instance service;
350   void initForService(Jws2Instance service, Preset p,
351           List<Argument> jobArgset)
352   {
353     this.service=service;
354     serviceOptions = service.getRunnerConfig();
355     updateTable(p, jobArgset);
356   }
357
358   @SuppressWarnings("unchecked")
359   private void updateTable(Preset p, List<Argument> jobArgset)
360   {
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();
365
366     // split to params and required arguments
367     {
368       for (Argument arg : args)
369       {
370         Argument myarg = (Argument) arg;
371         // Ideally, Argument would implement isRequired !
372         if (myarg instanceof Parameter)
373         {
374           Parameter parm = (Parameter) myarg;
375           if (true) // parm.isRequired())
376           {
377             addParameter(parm);
378           }
379           else
380           {
381             availableParameters.add(parm);
382           }
383         }
384         else
385         {
386           if (myarg instanceof Option)
387           {
388             Option opt = (Option) myarg;
389             addOption(opt);
390             if (opt.isRequired())
391             {
392               selectOption(opt, opt.getDefaultValue());
393             }
394           }
395           else
396           {
397             System.err.println("Ignoring unknown service argument type "
398                     + arg.getClass().getName());
399           }
400         }
401       }
402       args=null; // no more args to process.
403     }
404     if (p != null)
405     {
406       setDescr.setText(p.getDescription());
407       setName.setText(p.getName());
408       setDetails.setVisible(true);
409       // TODO - URL link
410       try
411       {
412         args = p.getArguments(serviceOptions);
413       } catch (Exception e)
414       {
415         e.printStackTrace();
416       }
417       // TODO: check if args should be unselected prior to resetting using the preset
418       setargs.clear();
419     } else {
420       setDetails.setVisible(false);
421     }
422     if (jobArgset != null)
423     {
424       argSetModified(true);
425       args = jobArgset;
426     }
427     // get setargs from current object
428     if (args != null)
429     {
430       for (Argument arg : args)
431       {
432         if (arg instanceof Parameter)
433         {
434           setargs.add((Parameter) arg);
435         }
436         else
437         {
438           if (arg instanceof Option)
439           {
440             selectOption((Option) arg, arg.getDefaultValue());
441           }
442         }
443
444       }
445     }
446
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));
451     // paramList.va
452     // paramPane.getViewport().validate();
453     paramList.setPreferredSize(new Dimension(350, paramSet.size()
454             * PARAM_HEIGHT));
455     paramList.setLayout(new GridLayout(paramSet.size(), 1));
456     paramList.validate();
457     paramPane.validate();
458     validate();
459   }
460
461   private void argSetModified(boolean b)
462   {
463     
464     modified.setVisible(b);
465     if (isVisible())
466     {
467       validate();
468     }
469    
470   }
471
472   private void addParameter(Parameter parm)
473   {
474     ParamBox pb = paramSet.get(parm.getName());
475     if (pb == null)
476     {
477       pb = new ParamBox(parm);
478       paramSet.put(parm.getName(), pb);
479       paramList.add(pb);
480     }
481   }
482
483   private void selectOption(Option opt, String string)
484   {
485     OptionBox cb = optSet.get(opt.getName());
486     if (cb == null)
487     {
488       cb = addOption(opt);
489     }
490     if (string == null)
491     {
492       // no value specified.
493       if (opt.isRequired())
494       {
495         // indicate option needs to be selected!
496       }
497       else
498       {
499         cb.enabled.setSelected(false);
500       }
501     }
502     else
503     {
504       cb.enabled.setSelected(true);
505
506       if (opt.getPossibleValues().contains(string))
507       {
508         cb.val.setSelectedItem(string);
509       }
510       else
511       {
512         throw new Error("Invalid value " + string + " for option " + opt);
513       }
514
515     }
516   }
517
518   Map<String, ParamBox> paramSet = new Hashtable<String, ParamBox>();
519
520   public class ParamBox extends JPanel implements ChangeListener,
521           ActionListener
522   {
523     JLabel name = new JLabel();
524
525     JTextArea string = new JTextArea();
526     JScrollPane descPanel = new JScrollPane();
527     JSlider slider = null;
528
529     JTextField valueField = null;
530
531     ValueConstrain validator = null;
532
533     boolean integ = false;
534     boolean choice=false;
535     public ParamBox(Parameter parm)
536     {
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();
556       parameter=parm;
557       if (validator != null)
558       {
559         integ = validator.getType() == Type.Integer;
560       } else {
561         if (parameter.getPossibleValues()!=null)
562         {
563           choice=true;
564         }
565       }
566       updateControls(parm);
567     }
568
569     boolean adjusting = false;
570     Parameter parameter;
571     JComboBox choicebox;
572     public void updateControls(Parameter parm)
573     {
574       adjusting = true;
575       boolean init = valueField == null;
576       float fVal = 0f;
577       int iVal = 0;
578       if (init)
579       {
580         if (choice)
581         {
582           choicebox = new JComboBox();
583           choicebox.addActionListener(this);
584           add(choicebox);
585         } else {
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();
597
598       }}
599       
600       if (parm != null)
601       {
602         if (choice) {
603           List vals = parm.getPossibleValues();
604           for (Object val: vals)
605           {
606             choicebox.addItem(val);
607           }
608           if (parm.getDefaultValue()!=null) {
609             choicebox.setSelectedItem(parm.getDefaultValue());
610           }
611         } else {
612           valueField.setText(parm.getDefaultValue());
613         }
614       }
615       updateSliderFromValueField();
616       adjusting = false;
617     }
618     public Parameter getParameter() {
619       try {
620         if (choice)
621         {
622           parameter.setDefaultValue((String)choicebox.getSelectedItem());
623         }
624         else {
625           parameter.setDefaultValue(valueField.getText());
626         }
627       } catch (WrongParameterException e)
628       {
629         e.printStackTrace();
630         return null;
631       }
632       return parameter;
633     }
634     public Object updateSliderFromValueField()
635     {
636       int iVal;
637       float fVal;
638       if (validator != null)
639       {
640         if (integ)
641         {
642           iVal = 0;
643           try
644           {
645             valueField.setText(valueField.getText().trim());
646             iVal = Integer.valueOf(valueField.getText());
647           } catch (Exception e)
648           {
649           }
650           ;
651           if (validator.getMin() != null && validator.getMax() != null)
652           {
653             slider.getModel().setRangeProperties(iVal, 1,
654                     validator.getMin().intValue(),
655                     validator.getMax().intValue(), true);
656           }
657           else
658           {
659             slider.setVisible(false);
660           }
661           return new int[]
662           { iVal };
663         }
664         else
665         {
666           fVal = 0f;
667           try
668           {
669             fVal = Float.valueOf(valueField.getText());
670           } catch (Exception e)
671           {
672           }
673           ;
674           if (validator.getMin() != null && validator.getMax() != null)
675           {
676             slider.getModel().setRangeProperties((int) fVal * 1000, 1,
677                     (int) validator.getMin().floatValue() * 1000,
678                     (int) validator.getMax().floatValue() * 1000, true);
679           }
680           else
681           {
682             slider.setVisible(false);
683           }
684           return new float[]
685           { fVal };
686         }
687       }
688       else
689       {
690         if (!choice) {
691           slider.setVisible(false);
692         return new String[]
693         { valueField.getText().trim() };
694       }
695         else {
696           return new String[] { (String) choicebox.getSelectedItem()};
697         }
698       }
699
700     }
701
702     @Override
703     public void stateChanged(ChangeEvent e)
704     {
705       if (!adjusting)
706       {
707         valueField.setText(""
708                 + ((integ) ? ("" + (int) slider.getValue())
709                         : ("" + (float) (slider.getValue() / 1000f))));
710       }
711     }
712
713     @Override
714     public void actionPerformed(ActionEvent e)
715     {
716       if (choice)
717       {
718       } else if (!adjusting)
719       {
720         updateSliderFromValueField();
721       }
722       argSetModified(true);
723     }
724
725   }
726
727   Map<String, OptionBox> optSet = new Hashtable<String, OptionBox>();
728
729   public class OptionBox extends JPanel implements ActionListener
730   {
731     JComboBox val = new JComboBox();
732
733     JCheckBox enabled = new JCheckBox();
734     Option option;
735     public OptionBox(Option opt)
736     {
737       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)
745       {
746         setLayout(new GridLayout(1, 2));
747         for (Object str : opt.getPossibleValues())
748         {
749           val.addItem((String) str);
750         }
751         val.setSelectedItem((String) opt.getDefaultValue());
752         val.addActionListener(this);
753         add(val, BorderLayout.SOUTH);
754       }
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.
758     }
759     public Option getOptionIfEnabled() {
760       if (!enabled.isSelected())
761       {
762         return null;
763       }
764       try {
765         if (val.getSelectedItem()!=null)
766         {
767           option.setDefaultValue((String) val.getSelectedItem());
768         }
769       } catch (WrongParameterException e)
770       {
771         e.printStackTrace();
772         return null;
773       }
774       return option;
775     }
776     @Override
777     public void actionPerformed(ActionEvent e)
778     {
779       argSetModified(true);
780       enabled.setSelected(true);
781     }
782   }
783
784   private OptionBox addOption(Option opt)
785   {
786     OptionBox cb = optSet.get(opt.getName());
787     if (cb == null)
788     {
789       cb = new OptionBox(opt);
790       optSet.put(opt.getName(), cb);
791       jobOptions.add(cb);
792     }
793     return cb;
794   }
795
796   /**
797    * testing method - grab a service and parameter set and show the window
798    * 
799    * @param args
800    */
801   public static void main(String[] args)
802   {
803     jalview.ws.jws2.Jws2Discoverer disc = jalview.ws.jws2.Jws2Discoverer
804             .getDiscoverer();
805     int p = 0;
806     if (args.length > 3)
807     {
808       Vector<String> services = new Vector<String>();
809       services.addElement(args[p++]);
810       Jws2Discoverer.setServiceUrls(services);
811     }
812     try
813     {
814       disc.run();
815     } catch (Exception e)
816     {
817       System.err.println("Aborting. Problem discovering services.");
818       e.printStackTrace();
819       return;
820     }
821     Jws2Discoverer.Jws2Instance lastserv = null;
822     for (Jws2Discoverer.Jws2Instance service : disc.getServices())
823     {
824       lastserv = service;
825       if (p < args.length && service.serviceType.equalsIgnoreCase(args[p]))
826       {
827         break;
828       }
829     }
830     if (lastserv != null)
831     {
832       List<Preset> prl = null;
833       Preset pr = null;
834       if (++p < args.length)
835       {
836         PresetManager prman = lastserv.getPresets();
837         if (prman != null)
838         {
839           pr = prman.getPresetByName(args[p]);
840           if (pr == null)
841           {
842             // just grab the last preset.
843             prl = prman.getPresets();
844           }
845         }
846       }
847       Iterator<Preset> en = (prl == null) ? null : prl.iterator();
848       while (true)
849       {
850         if (en != null)
851         {
852           if (!en.hasNext())
853           {
854             en = prl.iterator();
855           }
856           pr = en.next();
857         }
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));
862         cont.add(pgui);
863         jf.add(cont);
864         final Thread thr = Thread.currentThread();
865         jf.addWindowListener(new WindowListener()
866         {
867
868           @Override
869           public void windowActivated(WindowEvent e)
870           {
871             // TODO Auto-generated method stub
872
873           }
874
875           @Override
876           public void windowClosed(WindowEvent e)
877           {
878           }
879
880           @Override
881           public void windowClosing(WindowEvent e)
882           {
883             thr.interrupt();
884
885           }
886
887           @Override
888           public void windowDeactivated(WindowEvent e)
889           {
890             // TODO Auto-generated method stub
891
892           }
893
894           @Override
895           public void windowDeiconified(WindowEvent e)
896           {
897             // TODO Auto-generated method stub
898
899           }
900
901           @Override
902           public void windowIconified(WindowEvent e)
903           {
904             // TODO Auto-generated method stub
905
906           }
907
908           @Override
909           public void windowOpened(WindowEvent e)
910           {
911             // TODO Auto-generated method stub
912
913           }
914
915         });
916         jf.setVisible(true);
917         boolean inter = false;
918         while (!inter)
919         {
920           try
921           {
922             Thread.sleep(10000);
923           } catch (Exception e)
924           {
925             inter = true;
926           }
927           ;
928         }
929         jf.dispose();
930       }
931     }
932   }
933
934   public List<Argument> getJobParams()
935   {
936     List<Argument> argSet = new ArrayList<Argument>();
937     // recover options and parameters from GUI
938     for (OptionBox opts: optSet.values())
939     {
940       Option opt = opts.getOptionIfEnabled();
941       if (opt!=null)
942       {
943         argSet.add(opt);
944       }
945     }
946     for (ParamBox parambox: paramSet.values())
947     {
948       Parameter parm = parambox.getParameter();
949       if (parm!=null)
950       {
951         argSet.add(parm);
952       }
953     }
954     
955     return argSet;
956   }
957 }