X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FWsJobParameters.java;h=b19948999b9f6004f156629c357618938d17acd3;hb=a45774ee31d9f35d4eff46d54d7deab719afb092;hp=6017765f34a6308de0e7256dedd49acb7c309409;hpb=40517653ee3d262151ffdaf15463d8c7bc555b76;p=jalview.git diff --git a/src/jalview/gui/WsJobParameters.java b/src/jalview/gui/WsJobParameters.java index 6017765..b199489 100644 --- a/src/jalview/gui/WsJobParameters.java +++ b/src/jalview/gui/WsJobParameters.java @@ -1,6 +1,6 @@ /* - * 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 2.7) + * Copyright (C) 2011 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle * * This file is part of Jalview. * @@ -17,6 +17,8 @@ */ 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; @@ -30,6 +32,7 @@ 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; @@ -100,7 +103,7 @@ import compbio.metadata.ValueConstrain.Type; * */ public class WsJobParameters extends JPanel implements ItemListener, - ActionListener, DocumentListener + ActionListener, DocumentListener, OptsParametersContainerI { URL linkImageURL = getClass().getResource("/images/link.gif"); @@ -108,9 +111,23 @@ public class WsJobParameters extends JPanel implements ItemListener, // parameter set as shown to // user - private static final int PARAM_WIDTH = 340, PARAM_HEIGHT = 150, - PARAM_CLOSEDHEIGHT = 80; + /** + * manager for options and parameters. + */ + OptsAndParamsPage opanp = new OptsAndParamsPage(this); + + /** + * panel containing job options + */ + JPanel jobOptions = new JPanel(); + /** + * panel containing job parameters + */ + JPanel paramList = new JPanel(); + + + JPanel SetNamePanel = new JPanel(); JPanel setDetails = new JPanel(); @@ -119,7 +136,6 @@ public class WsJobParameters extends JPanel implements ItemListener, JSplitPane jobPanel = new JSplitPane(); - JPanel jobOptions = new JPanel(); JScrollPane jobOptionsPane = new JScrollPane(); @@ -143,7 +159,6 @@ public class WsJobParameters extends JPanel implements ItemListener, JScrollPane paramPane = new JScrollPane(); - JPanel paramList = new JPanel(); JPanel optsAndparams = new JPanel(); @@ -548,14 +563,15 @@ public class WsJobParameters extends JPanel implements ItemListener, if (myarg instanceof ParameterI) { ParameterI parm = (ParameterI) myarg; - addParameter(parm); + paramList.add(opanp.addParameter(parm)); } else { if (myarg instanceof OptionI) { OptionI opt = (OptionI) myarg; - OptionBox ob = addOption(opt); + OptionBox ob = opanp.addOption(opt); + jobOptions.add(ob, FlowLayout.LEFT); ob.resetToDefault(); if (MAX_OPTWIDTH < ob.getPreferredSize().width) { @@ -612,7 +628,7 @@ public class WsJobParameters extends JPanel implements ItemListener, { if (arg instanceof ParameterI) { - setParameter((ParameterI) arg); + opanp.setParameter((ParameterI) arg); } else { @@ -621,7 +637,7 @@ public class WsJobParameters extends JPanel implements ItemListener, // System.out.println("Setting option " // + System.identityHashCode(arg) + ":" + arg.getName() // + " with " + arg.getDefaultValue()); - selectOption((OptionI) arg, arg.getDefaultValue()); + opanp.selectOption((OptionI) arg, arg.getValue()); } } @@ -677,7 +693,7 @@ public class WsJobParameters extends JPanel implements ItemListener, validate(); } - private void argSetModified(Object modifiedElement, boolean b) + public void argSetModified(Object modifiedElement, boolean b) { if (settingDialog) { @@ -768,669 +784,24 @@ public class WsJobParameters extends JPanel implements ItemListener, settingDialog = stn; } - private void addParameter(ParameterI arg) - { - ParamBox pb = paramSet.get(arg.getName()); - if (pb == null) - { - pb = new ParamBox(this, arg); - paramSet.put(arg.getName(), pb); - paramList.add(pb); - } - pb.init(); - // take the defaults from the parameter - pb.updateControls(arg); - } - - private void setParameter(ParameterI arg) - { - ParamBox pb = paramSet.get(arg.getName()); - if (pb == null) - { - addParameter(arg); - } - else - { - pb.updateControls(arg); - } - - } - - private void selectOption(OptionI option, String string) - { - OptionBox cb = optSet.get(option.getName()); - if (cb == null) - { - cb = addOption(option); - } - cb.enabled.setSelected(string != null); // initial state for an option. - if (string != null) - { - if (option.getPossibleValues().contains(string)) - { - cb.val.setSelectedItem(string); - } - else - { - throw new Error("Invalid value " + string + " for option " + option); - } - - } - if (option.isRequired() && !cb.enabled.isSelected()) - { - // TODO: indicate paramset is not valid.. option needs to be selected! - } - cb.setInitialValue(); - } - - Map paramSet = new Hashtable(); - public class ParamBox extends JPanel implements ChangeListener, - ActionListener, MouseListener - { - JButton showDesc = new JButton(); - - JTextArea string = new JTextArea(); - - JScrollPane descPanel = new JScrollPane(); - - JSlider slider = null; - - JTextField valueField = null; - - ValueConstrainI validator = null; - - JPanel settingPanel = new JPanel(); - - JPanel controlPanel = new JPanel(); - - boolean integ = false; - - boolean choice = false; - - boolean descisvisible = false; - - final WsJobParameters pmdialogbox; - - final URL finfo; - - public ParamBox(final WsJobParameters pmlayout, ParameterI parm) - { - pmdialogbox = pmlayout; - setPreferredSize(new Dimension(PARAM_WIDTH, PARAM_CLOSEDHEIGHT)); - setBorder(new TitledBorder(parm.getName())); - setLayout(null); - showDesc.setFont(new Font("Verdana", Font.PLAIN, 6)); - showDesc.setText("+"); - string.setFont(new Font("Verdana", Font.PLAIN, 11)); - string.setBackground(getBackground()); - - string.setEditable(false); - descPanel.getViewport().setView(string); - - descPanel.setVisible(false); - - final ParamBox me = this; - finfo = parm.getFurtherDetails(); - if (finfo != null) - { - showDesc.setToolTipText("" - + JvSwingUtils - .wrapTooltip("Click to show brief description
Right click for further information.") - + ""); - showDesc.addMouseListener(this); - } - else - { - showDesc.setToolTipText("" - + JvSwingUtils - .wrapTooltip("Click to show brief description.") - + ""); - } - showDesc.addActionListener(new ActionListener() - { - - public void actionPerformed(ActionEvent e) - { - descisvisible = !descisvisible; - descPanel.setVisible(descisvisible); - descPanel.getVerticalScrollBar().setValue(0); - me.setPreferredSize(new Dimension(PARAM_WIDTH, - (descisvisible) ? PARAM_HEIGHT : PARAM_CLOSEDHEIGHT)); - me.validate(); - pmlayout.refreshParamLayout(); - } - }); - string.setWrapStyleWord(true); - string.setLineWrap(true); - string.setColumns(32); - string.setText(parm.getDescription()); - JPanel firstrow = new JPanel(); - firstrow.setLayout(null); - controlPanel.setLayout(new BorderLayout()); - controlPanel.setBounds(new Rectangle(39, 10, PARAM_WIDTH - 70, - PARAM_CLOSEDHEIGHT - 50)); - showDesc.setBounds(new Rectangle(10, 10, 16, 16)); - firstrow.add(showDesc); - firstrow.add(controlPanel); - firstrow.setBounds(new Rectangle(10, 20, PARAM_WIDTH - 30, - PARAM_CLOSEDHEIGHT - 30)); - add(firstrow); - validator = parm.getValidValue(); - parameter = parm; - if (validator != null) - { - integ = validator.getType() == Type.Integer; - } - else - { - if (parameter.getPossibleValues() != null) - { - choice = true; - } - } - updateControls(parm); - descPanel.setBounds(new Rectangle(10, PARAM_CLOSEDHEIGHT, - PARAM_WIDTH - 20, PARAM_HEIGHT - PARAM_CLOSEDHEIGHT - 5)); - add(descPanel); - validate(); - } - - public void init() - { - // reset the widget's initial value. - lastVal = null; - } - - boolean adjusting = false; - - ParameterI parameter; - - JComboBox choicebox; - - public int getBoxHeight() - { - return (descisvisible ? PARAM_HEIGHT : PARAM_CLOSEDHEIGHT); - } - - public void updateControls(ParameterI parm) - { - adjusting = true; - boolean init = (choicebox == null && valueField == null); - if (init) - { - if (choice) - { - choicebox = new JComboBox(); - choicebox.addActionListener(this); - controlPanel.add(choicebox, BorderLayout.CENTER); - } - else - { - slider = new JSlider(); - slider.addChangeListener(this); - valueField = new JTextField(); - valueField.addActionListener(this); - valueField.setPreferredSize(new Dimension(60, 25)); - controlPanel.add(slider, BorderLayout.WEST); - controlPanel.add(valueField, BorderLayout.EAST); - - } - } - - if (parm != null) - { - if (choice) - { - if (init) - { - List vals = parm.getPossibleValues(); - for (Object val : vals) - { - choicebox.addItem(val); - } - } - - if (parm.getDefaultValue() != null) - { - choicebox.setSelectedItem(parm.getDefaultValue()); - } - } - else - { - valueField.setText(parm.getDefaultValue()); - } - } - lastVal = updateSliderFromValueField(); - adjusting = false; - } - - Object lastVal; - - public ParameterI getParameter() - { - ParameterI prm = parameter.copy(); - if (choice) - { - prm.setDefaultValue((String) choicebox.getSelectedItem()); - } - else - { - prm.setDefaultValue(valueField.getText()); - } - return prm; - } - - public Object updateSliderFromValueField() - { - int iVal; - float fVal; - if (validator != null) - { - if (integ) - { - iVal = 0; - try - { - valueField.setText(valueField.getText().trim()); - iVal = Integer.valueOf(valueField.getText()); - if (validator.getMin() != null - && validator.getMin().intValue() > iVal) - { - iVal = validator.getMin().intValue(); - // TODO: provide visual indication that hard limit was reached for - // this parameter - } - if (validator.getMax() != null - && validator.getMax().intValue() < iVal) - { - iVal = validator.getMax().intValue(); - // TODO: provide visual indication that hard limit was reached for - // this parameter - } - } catch (Exception e) - { - } - ; - if (validator.getMin() != null && validator.getMax() != null) - { - slider.getModel().setRangeProperties(iVal, 1, - validator.getMin().intValue(), - validator.getMax().intValue(), true); - } - else - { - slider.setVisible(false); - } - return new int[] - { iVal }; - } - else - { - fVal = 0f; - try - { - fVal = Float.valueOf(valueField.getText()); - if (validator.getMin() != null - && validator.getMin().floatValue() > fVal) - { - fVal = validator.getMin().floatValue(); - // TODO: provide visual indication that hard limit was reached for - // this parameter - } - if (validator.getMax() != null - && validator.getMax().floatValue() < fVal) - { - fVal = validator.getMax().floatValue(); - // TODO: provide visual indication that hard limit was reached for - // this parameter - } - } catch (Exception e) - { - } - ; - if (validator.getMin() != null && validator.getMax() != null) - { - slider.getModel().setRangeProperties((int) fVal * 1000, 1, - (int) validator.getMin().floatValue() * 1000, - (int) validator.getMax().floatValue() * 1000, true); - } - else - { - slider.setVisible(false); - } - return new float[] - { fVal }; - } - } - else - { - if (!choice) - { - slider.setVisible(false); - return new String[] - { valueField.getText().trim() }; - } - else - { - return new String[] - { (String) choicebox.getSelectedItem() }; - } - } - - } - - public void stateChanged(ChangeEvent e) - { - if (!adjusting) - { - valueField.setText("" - + ((integ) ? ("" + (int) slider.getValue()) - : ("" + (float) (slider.getValue() / 1000f)))); - checkIfModified(); - } - - } - - public void actionPerformed(ActionEvent e) - { - if (adjusting) - { - return; - } - if (!choice) - { - updateSliderFromValueField(); - } - checkIfModified(); - } - - private void checkIfModified() - { - Object cstate = updateSliderFromValueField(); - boolean notmod = false; - if (cstate.getClass() == lastVal.getClass()) - { - if (cstate instanceof int[]) - { - notmod = (((int[]) cstate)[0] == ((int[]) lastVal)[0]); - } - else if (cstate instanceof float[]) - { - notmod = (((float[]) cstate)[0] == ((float[]) lastVal)[0]); - } - else if (cstate instanceof String[]) - { - notmod = (((String[]) cstate)[0].equals(((String[]) lastVal)[0])); - } - } - pmdialogbox.argSetModified(this, !notmod); - } - - public void mouseClicked(MouseEvent e) - { - if (javax.swing.SwingUtilities.isRightMouseButton(e)) - { - showUrlPopUp(this, finfo.toString(), e.getX(), e.getY()); - } - } - - public void mousePressed(MouseEvent e) - { - // TODO Auto-generated method stub - - } - - public void mouseReleased(MouseEvent e) - { - // TODO Auto-generated method stub - - } - - public void mouseEntered(MouseEvent e) - { - // TODO Auto-generated method stub - - } - - public void mouseExited(MouseEvent e) - { - // TODO Auto-generated method stub - - } - // from http://stackoverflow.com/questions/2743177/top-alignment-for-flowlayout - // helpful hint of using the Java 1.6 alignBaseLine property of FlowLayout - @Override - public Component.BaselineResizeBehavior getBaselineResizeBehavior() { - return Component.BaselineResizeBehavior.CONSTANT_ASCENT; - } - - @Override - public int getBaseline(int width, int height) { - return 0; - } - } - - Map optSet = new Hashtable(); - - public class OptionBox extends JPanel implements MouseListener, - ActionListener - { - JComboBox val = new JComboBox(); - - JCheckBox enabled = new JCheckBox(); - - JLabel optlabel = new JLabel(); - - final URL finfo; - - boolean hasLink = false; - - OptionI option; - - public OptionBox(OptionI opt) - { - option = opt; - setLayout(new BorderLayout()); - enabled.setSelected(opt.isRequired()); // TODO: lock required options - enabled.setFont(new Font("Verdana", Font.PLAIN, 11)); - enabled.setText(""); - enabled.setText(opt.getName()); - enabled.addActionListener(this); - finfo = option.getFurtherDetails(); - if (finfo != null) - { - hasLink = true; - enabled.setToolTipText("" - + JvSwingUtils.wrapTooltip(opt.getDescription() - + "
") - + ""); - enabled.addMouseListener(this); - } - else - { - enabled.setToolTipText("" - + JvSwingUtils.wrapTooltip(opt.getDescription()) - + ""); - } - add(enabled, BorderLayout.NORTH); - if (opt.getPossibleValues().size() > 1) - { - setLayout(new GridLayout(1, 2)); - for (Object str : opt.getPossibleValues()) - { - val.addItem((String) str); - } - val.setSelectedItem((String) opt.getDefaultValue()); - val.addActionListener(this); - add(val, BorderLayout.SOUTH); - } - // TODO: add actionListeners for popup (to open further info), - // and to update list of parameters if an option is enabled - // that takes a value. JBPNote: is this TODO still valid ? - setInitialValue(); - } - - public void resetToDefault() - { - enabled.setSelected(false); - if (option.isRequired()) - { - // Apply default value - selectOption(option, option.getDefaultValue()); - } - } - - boolean initEnabled = false; - - String initVal = null; - - public void setInitialValue() - { - initEnabled = enabled.isSelected(); - if (option.getPossibleValues() != null - && option.getPossibleValues().size() > 1) - { - initVal = (String) val.getSelectedItem(); - } - else - { - initVal = (initEnabled) ? option.getDefaultValue() : null; - } - } - - public OptionI getOptionIfEnabled() - { - if (!enabled.isSelected()) - { - return null; - } - OptionI opt = option.copy(); - - if (val.getSelectedItem() != null) - { - opt.setDefaultValue((String) val.getSelectedItem()); - } - return opt; - } - - public void actionPerformed(ActionEvent e) - { - if (e.getSource() != enabled) - { - enabled.setSelected(true); - } - checkIfModified(); - } - - private void checkIfModified() - { - boolean notmod = (initEnabled == enabled.isSelected()); - if (enabled.isSelected()) - { - if (initVal != null) - { - notmod &= initVal.equals(val.getSelectedItem()); - } - else - { - // compare against default service setting - notmod &= option.getDefaultValue() == null - || option.getDefaultValue().equals(val.getSelectedItem()); - } - } - else - { - notmod &= initVal == null; - } - argSetModified(this, !notmod); - } - - public void mouseClicked(MouseEvent e) - { - if (javax.swing.SwingUtilities.isRightMouseButton(e)) - { - showUrlPopUp(this, finfo.toString(), e.getX(), e.getY()); - } - } - - public void mousePressed(MouseEvent e) - { - // TODO Auto-generated method stub - - } - - public void mouseReleased(MouseEvent e) - { - // TODO Auto-generated method stub - - } - - public void mouseEntered(MouseEvent e) - { - // TODO Auto-generated method stub - - } - - public void mouseExited(MouseEvent e) - { - // TODO Auto-generated method stub - - } - - } - - private OptionBox addOption(OptionI opt) - { - OptionBox cb = optSet.get(opt.getName()); - if (cb == null) - { - cb = new OptionBox(opt); - optSet.put(opt.getName(), cb); - jobOptions.add(cb, FlowLayout.LEFT); - } - return cb; - } - - public static void showUrlPopUp(JComponent invoker, final String finfo, - int x, int y) - { - - JPopupMenu mnu = new JPopupMenu(); - JMenuItem mitem = new JMenuItem("View " + finfo); - mitem.addActionListener(new ActionListener() - { - - @Override - public void actionPerformed(ActionEvent e) - { - Desktop.showUrl(finfo); - - } - }); - mnu.add(mitem); - mnu.show(invoker, x, y); - } - - protected void refreshParamLayout() + 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 > PARAM_WIDTH ? MAX_OPTWIDTH : PARAM_WIDTH); + int w = 2 * fl.getHgap() + (MAX_OPTWIDTH > OptsAndParamsPage.PARAM_WIDTH ? MAX_OPTWIDTH : OptsAndParamsPage.PARAM_WIDTH); jobOptions.setLayout(fl); - if (optSet.size() > 0) + if (opanp.getOptSet().size() > 0) { - for (OptionBox pbox : optSet.values()) + for (OptionBox pbox : opanp.getOptSet().values()) { pbox.revalidate(); s += sep + pbox.getPreferredSize().height; } jobOptions.setPreferredSize(new Dimension(w, s)); - jobOptions.setLayout(new GridLayout(optSet.size(),1)); + jobOptions.setLayout(new GridLayout(opanp.getOptSet().size(),1)); os=s; } else @@ -1442,12 +813,12 @@ public class WsJobParameters extends JPanel implements ItemListener, fl = new FlowLayout(FlowLayout.CENTER); // helpful hint from http://stackoverflow.com/questions/2743177/top-alignment-for-flowlayout fl.setAlignOnBaseline(true); - if (paramSet.size() > 0) + if (opanp.getParamSet().size() > 0) { paramList.setLayout(fl); s = 2 * sep; - for (ParamBox pbox : paramSet.values()) + for (ParamBox pbox : opanp.getParamSet().values()) { pbox.validate(); s += sep + pbox.getPreferredSize().height+pbox.getBorder().getBorderInsets(pbox).bottom; @@ -1466,7 +837,7 @@ public class WsJobParameters extends JPanel implements ItemListener, // System.out.println("Size will be : "+w+","+os); optsAndparams.validate(); paramPane.getViewport().validate(); - paramPane.getVerticalScrollBar().setBlockIncrement(PARAM_CLOSEDHEIGHT*2); + paramPane.getVerticalScrollBar().setBlockIncrement(OptsAndParamsPage.PARAM_CLOSEDHEIGHT*2); paramPane.validate(); validate(); } @@ -1702,26 +1073,7 @@ public class WsJobParameters extends JPanel implements ItemListener, public List getJobParams() { - List argSet = new ArrayList(); - // recover options and parameters from GUI - for (OptionBox opts : optSet.values()) - { - OptionI opt = opts.getOptionIfEnabled(); - if (opt != null) - { - argSet.add(opt); - } - } - for (ParamBox parambox : paramSet.values()) - { - ParameterI parm = parambox.getParameter(); - if (parm != null) - { - argSet.add(parm); - } - } - - return argSet; + return opanp.getCurrentSettings(); } String lastParmSet = null;