3 import java.awt.BorderLayout;
4 import java.awt.Component;
5 import java.awt.Dimension;
6 import java.awt.FlowLayout;
8 import java.awt.GridLayout;
9 import java.awt.event.ActionEvent;
10 import java.awt.event.ActionListener;
11 import java.awt.event.ComponentEvent;
12 import java.awt.event.ComponentListener;
13 import java.awt.event.ContainerEvent;
14 import java.awt.event.ContainerListener;
15 import java.awt.event.MouseEvent;
16 import java.awt.event.MouseListener;
17 import java.awt.event.WindowEvent;
18 import java.awt.event.WindowListener;
19 import java.awt.event.WindowStateListener;
20 import java.util.ArrayList;
21 import java.util.EventObject;
22 import java.util.HashSet;
23 import java.util.Hashtable;
24 import java.util.List;
26 import java.util.Vector;
28 import javax.swing.JButton;
29 import javax.swing.JCheckBox;
30 import javax.swing.JComboBox;
31 import javax.swing.JFrame;
32 import javax.swing.JLabel;
33 import javax.swing.JOptionPane;
34 import javax.swing.JPanel;
35 import javax.swing.JScrollPane;
36 import javax.swing.JTable;
37 import javax.swing.JTextArea;
38 import javax.swing.ListSelectionModel;
39 import javax.swing.SwingUtilities;
40 import javax.swing.border.TitledBorder;
41 import javax.swing.event.CellEditorListener;
42 import javax.swing.table.*;
44 import compbio.metadata.Argument;
45 import compbio.metadata.Option;
46 import compbio.metadata.Parameter;
47 import compbio.metadata.Preset;
48 import compbio.metadata.PresetManager;
49 import compbio.metadata.RunnerConfig;
50 import compbio.metadata.ValueConstrain;
51 import compbio.metadata.ValueConstrain.Type;
53 import jalview.ws.jws2.Jws2Discoverer;
54 import jalview.ws.jws2.Jws2Discoverer.Jws2Instance;
56 public class WsJobParameters extends JPanel
58 JPanel setDetails = new JPanel();
60 JPanel settingsPanel = new JPanel();
62 JPanel jobOptions = new JPanel();
64 JPanel jobParameters = new JPanel();
66 JPanel paramButtons = new JPanel();
68 JButton exportParams = new JButton();
70 JButton importParams = new JButton();
72 JButton resetParams = new JButton();
74 JButton addParam = new JButton();
76 JButton removeParam = new JButton();
78 JButton editParam = new JButton();
80 JLabel setName = new JLabel();
82 JTextArea setDescr = new JTextArea();
84 JTable paramTable = new JTable();
86 JScrollPane paramPane = new JScrollPane();
88 RunnerConfig serviceOptions;
90 List<Parameter> availableParameters;
92 private BorderLayout jparamLayout;
94 WsJobParameters(Jws2Instance service)
99 public WsJobParameters(Jws2Instance service, Preset p)
101 this(null, service, p);
107 * - if null, create new JFrame outside of desktop
111 public WsJobParameters(JFrame parent, Jws2Instance service, Preset p)
116 // populate parameter table
117 initForService(service, p);
118 // display in new JFrame attached to parent.
122 private void jbInit()
124 exportParams.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));
125 exportParams.setText("Export");
126 exportParams.setToolTipText("Export parameters to a file");
127 exportParams.addActionListener(new ActionListener()
129 public void actionPerformed(ActionEvent e)
131 exportParams_actionPerformed(e);
134 importParams.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));
135 importParams.setText("Import");
136 importParams.setToolTipText("Import parameters from a file");
137 importParams.addActionListener(new ActionListener()
139 public void actionPerformed(ActionEvent e)
141 importParams_actionPerformed(e);
144 resetParams.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));
145 resetParams.setText("Defaults");
146 resetParams.setToolTipText("Reset to defaults");
147 resetParams.addActionListener(new ActionListener()
149 public void actionPerformed(ActionEvent e)
151 resetParams_actionPerformed(e);
154 addParam.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));
155 addParam.setText("Add");
156 addParam.setToolTipText("Add new parameter");
157 addParam.addActionListener(new ActionListener()
159 public void actionPerformed(ActionEvent e)
161 addParam_actionPerformed(e);
164 removeParam.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));
165 removeParam.setText("Remove");
166 removeParam.setToolTipText("Remove selected parameter");
167 removeParam.addActionListener(new ActionListener()
169 public void actionPerformed(ActionEvent e)
171 removeParam_actionPerformed(e);
174 editParam.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));
175 editParam.setText("Edit");
176 editParam.setToolTipText("Edit selected parameter");
177 editParam.addActionListener(new ActionListener()
179 public void actionPerformed(ActionEvent e)
181 editParam_actionPerformed(e);
185 setDetails.setBorder(new TitledBorder("Details"));
186 setDetails.setLayout(new GridLayout(2, 1));
187 setDescr.setColumns(40);
188 setDescr.setWrapStyleWord(true);
189 setDescr.setPreferredSize(new Dimension(350, 100));
190 setDetails.add(setName);
191 setDetails.add(setDescr);
192 setDetails.setPreferredSize(new Dimension(360, 150));
193 settingsPanel.setLayout(new BorderLayout());
194 jobOptions.setBorder(new TitledBorder("Options"));
195 jobParameters.setBorder(new TitledBorder("Parameters"));
196 jobParameters.setLayout(jparamLayout = new BorderLayout());
197 paramPane.setPreferredSize(new Dimension(360, 300));
198 paramButtons.setLayout(new GridLayout(2, 3));
199 paramButtons.add(addParam);
200 paramButtons.add(editParam);
201 paramButtons.add(removeParam);
202 // TODO: relayout buttons nicely
203 paramButtons.add(exportParams);
204 paramButtons.add(importParams);
205 paramButtons.add(resetParams);
206 jobParameters.add(paramPane, BorderLayout.NORTH);
207 jobParameters.add(paramButtons, BorderLayout.SOUTH);
208 settingsPanel.add(jobOptions, BorderLayout.NORTH);
209 settingsPanel.add(jobParameters, BorderLayout.SOUTH);
210 setLayout(new BorderLayout());
211 setPreferredSize(new Dimension(400, 600));
212 setSize(new Dimension(400, 600));
213 add(setDetails, BorderLayout.NORTH);
214 add(settingsPanel, BorderLayout.CENTER);
218 * need to populate table and validate after calling this to set up table and
221 public void initTableUI()
223 paramTable = new JTable();
224 paramTable.getTableHeader()
225 .setFont(new Font("Verdana", Font.PLAIN, 12));
226 paramTable.setFont(new Font("Verdana", Font.PLAIN, 12));
228 paramPane.getViewport().removeAll();
229 paramPane.getViewport().add(paramTable);
230 paramTable.setDefaultRenderer(Argument.class, new ArgumentRenderer());
231 paramTable.setDefaultRenderer(Parameter.class, new ArgumentRenderer());
232 paramTable.setDefaultRenderer(Option.class, new ArgumentRenderer());
233 paramTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
234 paramTable.addMouseListener(new MouseListener()
238 public void mouseClicked(MouseEvent e)
240 if (e.getClickCount() > 1)
242 editParam_actionPerformed(null);
247 public void mouseEntered(MouseEvent e)
250 // TODO Auto-generated method stub
255 public void mouseExited(MouseEvent e)
258 // TODO Auto-generated method stub
263 public void mousePressed(MouseEvent e)
265 // TODO Auto-generated method stub
270 public void mouseReleased(MouseEvent e)
272 // TODO Auto-generated method stub
277 // paramTable.setDefaultEditor(Argument.class, new WsArgumentEditor(this));
280 public class WsArgumentEditor implements TableCellEditor
287 WsJobParameters wsparm;
289 public WsArgumentEditor(WsJobParameters wsJobParameters)
291 wsparm = wsJobParameters;
292 p = wsparm.paramTable.getSelectedRow();
293 arg = (Argument) wsparm.paramTable.getValueAt(p, wsparm.paramTable
294 .getSelectedColumn());
296 * if (arg instanceof Option) { if
297 * (JOptionPane.showInternalConfirmDialog(Desktop.desktop,
298 * "Remove option "+arg.getName(),
299 * "Delete option ?",JOptionPane.YES_NO_OPTION,
300 * JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) {
307 public Component getTableCellEditorComponent(JTable table,
308 Object value, boolean isSelected, int row, int column)
310 // TODO Auto-generated method stub
315 public void addCellEditorListener(CellEditorListener l)
317 // TODO Auto-generated method stub
322 public void cancelCellEditing()
324 // TODO Auto-generated method stub
329 public Object getCellEditorValue()
331 // TODO Auto-generated method stub
336 public boolean isCellEditable(EventObject anEvent)
338 // TODO Auto-generated method stub
343 public void removeCellEditorListener(CellEditorListener l)
345 // TODO Auto-generated method stub
350 public boolean shouldSelectCell(EventObject anEvent)
352 // TODO Auto-generated method stub
357 public boolean stopCellEditing()
359 // TODO Auto-generated method stub
365 protected void editParam_actionPerformed(ActionEvent e)
367 // TODO Auto-generated method stub
371 protected void removeParam_actionPerformed(ActionEvent e)
373 // TODO Auto-generated method stub
377 protected void addParam_actionPerformed(ActionEvent e)
379 // TODO Auto-generated method stub
383 protected void resetParams_actionPerformed(ActionEvent e)
385 // TODO Auto-generated method stub
389 protected void importParams_actionPerformed(ActionEvent e)
391 // TODO Auto-generated method stub
395 protected void exportParams_actionPerformed(ActionEvent e)
397 // TODO Auto-generated method stub
401 void initForService(Jws2Instance service, Preset p)
403 serviceOptions = service.getRunnerConfig();
407 @SuppressWarnings("unchecked")
408 private void updateTable(Preset p)
410 WsParameterTableModel mdl = null;
411 TableModel tmdl = paramTable.getModel();
412 if (tmdl instanceof WsParameterTableModel)
414 mdl = (WsParameterTableModel) tmdl;
418 paramTable.setModel(mdl = new WsParameterTableModel());
420 availableParameters = new ArrayList<Parameter>();
421 List<Parameter> setargs = new ArrayList<Parameter>();
422 // populate table from default parameter set.
423 List<Argument> args = serviceOptions.getArguments();
425 // split to params and required arguments
427 for (Argument arg : args)
429 Argument myarg = (Argument) arg;
430 // Ideally, Argument would implement isRequired !
431 if (myarg instanceof Parameter)
433 Parameter parm = (Parameter) myarg;
434 if (parm.isRequired())
440 availableParameters.add(parm);
445 if (myarg instanceof Option)
447 Option opt = (Option) myarg;
449 if (opt.isRequired())
451 selectOption(opt, opt.getDefaultValue());
456 System.err.println("Ignoring unknown service argument type "
457 + arg.getClass().getName());
465 setDescr.setText(p.getDescription());
466 setName.setText(p.getName());
470 args = p.getArguments(serviceOptions);
471 } catch (Exception e)
476 // get setargs from current object
479 for (Argument arg : args)
481 if (arg instanceof Parameter)
483 setargs.add((Parameter) arg);
487 if (arg instanceof Option)
489 selectOption((Option) arg, arg.getDefaultValue());
497 mdl.setData(setargs);
498 paramTable.setModel(mdl);
499 // paramTable.validate();
500 jobOptions.setLayout(new GridLayout(optSet.size() / 2 + 1, 2));
501 jobOptions.validate();
504 private void selectOption(Option opt, String string)
506 OptionBox cb = optSet.get(opt.getName());
513 // no value specified.
514 if (opt.isRequired())
516 // indicate option needs to be selected!
520 cb.enabled.setSelected(false);
525 cb.enabled.setSelected(true);
527 if (opt.getPossibleValues().contains(string))
529 cb.val.setSelectedItem(string);
533 throw new Error("Invalid value " + string + " for option " + opt);
539 Map<String, OptionBox> optSet = new Hashtable<String, OptionBox>();
541 public class OptionBox extends JPanel
543 JComboBox val = new JComboBox();
545 JCheckBox enabled = new JCheckBox();
547 public OptionBox(Option opt)
549 setLayout(new BorderLayout());
550 enabled.setSelected(opt.isRequired());
551 enabled.setFont(new Font("Verdana", Font.PLAIN, 11));
552 enabled.setText(opt.getName());
553 enabled.setToolTipText(opt.getDescription());
554 add(enabled, BorderLayout.NORTH);
555 if (opt.getPossibleValues().size() > 1)
557 setLayout(new GridLayout(1,2));
558 for (Object str : opt.getPossibleValues())
560 val.addItem((String) str);
562 val.setSelectedItem((String) opt.getDefaultValue());
563 add(val, BorderLayout.SOUTH);
565 // TODO: add actionListeners for popup (to open further info),
566 // and to update list of parameters if an option is enabled
567 // that takes a value.
571 private OptionBox addOption(Option opt)
573 OptionBox cb = optSet.get(opt.getName());
576 cb = new OptionBox(opt);
577 optSet.put(opt.getName(), cb);
583 class WsParameterTableModel extends AbstractTableModel
585 // arg list - vector for thread safety
586 public Vector<Parameter> data = new Vector<Parameter>();
588 private String[] colNames =
589 { "Parameter", "Value" };
592 public int getColumnCount()
598 public int findColumn(String columnName)
600 // TODO Auto-generated method stub
601 return super.findColumn(columnName);
604 public void setData(List<Parameter> setargs)
608 data = new Vector<Parameter>(setargs);
613 data = new Vector<Parameter>();
617 public List<Parameter> getData()
619 return new ArrayList<Parameter>(data);
623 public int getRowCount()
629 public Object getValueAt(int rowIndex, int columnIndex)
631 if (rowIndex >= 0 && rowIndex < data.size())
633 Parameter prm = data.elementAt(rowIndex);
637 return prm.getName();
640 // the accessor name for the parameter value is possibly confusing
641 String val = prm.getDefaultValue();
644 if (prm.getValidValue().getType().equals(Type.Float))
647 return Float.parseFloat(val);
649 if (prm.getValidValue().getType().equals(Type.Integer))
651 exc = new Integer(0);
652 return Integer.parseInt(val);
654 } catch (NumberFormatException e)
670 * @see javax.swing.table.AbstractTableModel#getColumnClass(int)
673 public Class<?> getColumnClass(int columnIndex)
680 return Parameter.class;
682 return super.getColumnClass(columnIndex);
688 * @see javax.swing.table.AbstractTableModel#getColumnName(int)
691 public String getColumnName(int column)
693 return colNames[column];
699 * @see javax.swing.table.AbstractTableModel#isCellEditable(int, int)
702 public boolean isCellEditable(int rowIndex, int columnIndex)
704 if (columnIndex == 1)
712 class ArgumentRenderer implements TableCellRenderer
716 public Component getTableCellRendererComponent(JTable table,
717 Object value, boolean isSelected, boolean hasFocus, int row,
720 if (value instanceof Option)
722 JCheckBox cb = new JCheckBox();
723 cb.setSelected(true);
726 if (value instanceof Boolean)
728 JCheckBox cb = new JCheckBox();
729 cb.setSelected(((Boolean) value).booleanValue());
732 if (value instanceof String)
734 JLabel lbl = new JLabel();
735 lbl.setFont(new Font("Verdana", Font.PLAIN, 11));
736 lbl.setText((String) value);
739 if (value instanceof Parameter)
741 String val = ((Parameter) value).getDefaultValue();
742 ValueConstrain constr = ((Parameter) value).getValidValue();
743 JLabel lbl = new JLabel();
744 lbl.setFont(new Font("Verdana", Font.PLAIN, 11));
748 * type dependent return value if
749 * (constr.getType().equals(Type.Integer))
751 * { lbl.setText(val); } if (constr.getType().equals(Type.Float)) { }
760 * testing method - grab a service and parameter set and show the window
764 public static void main(String[] args)
766 jalview.ws.jws2.Jws2Discoverer disc = jalview.ws.jws2.Jws2Discoverer
771 Vector<String> services = new Vector<String>();
772 services.addElement(args[p++]);
773 Jws2Discoverer.setServiceUrls(services);
778 } catch (Exception e)
780 System.err.println("Aborting. Problem discovering services.");
784 Jws2Discoverer.Jws2Instance lastserv = null;
785 for (Jws2Discoverer.Jws2Instance service : disc.getServices())
788 if (p < args.length && service.serviceType.equalsIgnoreCase(args[p]))
793 if (lastserv != null)
796 if (++p < args.length)
798 PresetManager prman = lastserv.getPresets();
801 pr = prman.getPresetByName(args[p]);
804 // just grab the last preset.
805 List<Preset> prl = prman.getPresets();
806 pr = prl.get(prl.size() - 1);
812 WsJobParameters pgui = new WsJobParameters(lastserv, pr);
813 JFrame jf = new JFrame("Parameters for " + lastserv.getActionText());
814 JPanel cont = new JPanel();
815 cont.setSize(new Dimension(600, 800));
818 final Thread thr = Thread.currentThread();
819 jf.addWindowListener(new WindowListener()
823 public void windowActivated(WindowEvent e)
825 // TODO Auto-generated method stub
830 public void windowClosed(WindowEvent e)
835 public void windowClosing(WindowEvent e)
842 public void windowDeactivated(WindowEvent e)
844 // TODO Auto-generated method stub
849 public void windowDeiconified(WindowEvent e)
851 // TODO Auto-generated method stub
856 public void windowIconified(WindowEvent e)
858 // TODO Auto-generated method stub
863 public void windowOpened(WindowEvent e)
865 // TODO Auto-generated method stub
871 boolean inter = false;
877 } catch (Exception e)