From 127ce9ebd4add01b194a86fcf8446edea4ec3706 Mon Sep 17 00:00:00 2001 From: jprocter Date: Thu, 25 Aug 2011 13:58:16 +0100 Subject: [PATCH 1/1] JAL-591 - refactored web service parameter dialog to allow options and parameters to be used in other dialog boxes --- src/jalview/gui/OptsAndParamsPage.java | 733 +++++++++++++++++++++++++ src/jalview/gui/OptsParametersContainerI.java | 13 + src/jalview/gui/WsJobParameters.java | 701 ++--------------------- 3 files changed, 782 insertions(+), 665 deletions(-) create mode 100644 src/jalview/gui/OptsAndParamsPage.java create mode 100644 src/jalview/gui/OptsParametersContainerI.java diff --git a/src/jalview/gui/OptsAndParamsPage.java b/src/jalview/gui/OptsAndParamsPage.java new file mode 100644 index 0000000..eb04d08 --- /dev/null +++ b/src/jalview/gui/OptsAndParamsPage.java @@ -0,0 +1,733 @@ +package jalview.gui; + +import jalview.ws.params.OptionI; +import jalview.ws.params.ParameterI; +import jalview.ws.params.ValueConstrainI; + +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.Font; +import java.awt.GridLayout; +import java.awt.Rectangle; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.net.URL; +import java.util.Hashtable; +import java.util.List; +import java.util.Map; + +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JLabel; +import javax.swing.JMenuItem; +import javax.swing.JPanel; +import javax.swing.JPopupMenu; +import javax.swing.JScrollPane; +import javax.swing.JSlider; +import javax.swing.JTextArea; +import javax.swing.JTextField; +import javax.swing.border.TitledBorder; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; + +import compbio.metadata.ValueConstrain.Type; + +/** + * GUI generator/manager for options and parameters. Originally abstracted from the WsJobParameters dialog box. + * @author jprocter + * + */ +public class OptsAndParamsPage +{ + public class OptionBox extends JPanel implements MouseListener, + ActionListener + { + JCheckBox enabled = new JCheckBox(); + + final URL finfo; + + boolean hasLink = false; + + boolean initEnabled = false; + + String initVal = null; + + OptionI option; + + JLabel optlabel = new JLabel(); + + JComboBox val = new JComboBox(); + + 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 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; + } + poparent.argSetModified(this, !notmod); + } + + 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 mouseClicked(MouseEvent e) + { + if (javax.swing.SwingUtilities.isRightMouseButton(e)) + { + showUrlPopUp(this, finfo.toString(), e.getX(), e.getY()); + } + } + + public void mouseEntered(MouseEvent e) + { + // TODO Auto-generated method stub + + } + + public void mouseExited(MouseEvent e) + { + // TODO Auto-generated method stub + + } + + public void mousePressed(MouseEvent e) + { + // TODO Auto-generated method stub + + } + + public void mouseReleased(MouseEvent e) + { + // TODO Auto-generated method stub + + } + + public void resetToDefault() + { + enabled.setSelected(false); + if (option.isRequired()) + { + // Apply default value + selectOption(option, option.getDefaultValue()); + } + } + + 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 class ParamBox extends JPanel implements ChangeListener, + ActionListener, MouseListener + { + boolean adjusting = false; + + boolean choice = false; + + JComboBox choicebox; + + JPanel controlPanel = new JPanel(); + + boolean descisvisible = false; + + JScrollPane descPanel = new JScrollPane(); + + final URL finfo; + + boolean integ = false; + + Object lastVal; + + ParameterI parameter; + + final OptsParametersContainerI pmdialogbox; + + JPanel settingPanel = new JPanel(); + + JButton showDesc = new JButton(); + + JSlider slider = null; + + JTextArea string = new JTextArea(); + + ValueConstrainI validator = null; + + JTextField valueField = null; + + public ParamBox(final OptsParametersContainerI 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 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); + } + + @Override + public int getBaseline(int width, int height) { + return 0; + } + + // 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; + } + + public int getBoxHeight() + { + return (descisvisible ? PARAM_HEIGHT : PARAM_CLOSEDHEIGHT); + } + + public ParameterI getParameter() + { + ParameterI prm = parameter.copy(); + if (choice) + { + prm.setDefaultValue((String) choicebox.getSelectedItem()); + } + else + { + prm.setDefaultValue(valueField.getText()); + } + return prm; + } + + public void init() + { + // reset the widget's initial value. + lastVal = null; + } + + public void mouseClicked(MouseEvent e) + { + if (javax.swing.SwingUtilities.isRightMouseButton(e)) + { + showUrlPopUp(this, finfo.toString(), e.getX(), e.getY()); + } + } + + public void mouseEntered(MouseEvent e) + { + // TODO Auto-generated method stub + + } + + public void mouseExited(MouseEvent e) + { + // TODO Auto-generated method stub + + } + + public void mousePressed(MouseEvent e) + { + // TODO Auto-generated method stub + + } + + public void mouseReleased(MouseEvent e) + { + // TODO Auto-generated method stub + + } + + public void stateChanged(ChangeEvent e) + { + if (!adjusting) + { + valueField.setText("" + + ((integ) ? ("" + (int) slider.getValue()) + : ("" + (float) (slider.getValue() / 1000f)))); + checkIfModified(); + } + + } + 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; + } + + 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() }; + } + } + + } + } + + static final int PARAM_WIDTH = 340; + + private static final int PARAM_HEIGHT = 150; + + static final int PARAM_CLOSEDHEIGHT = 80; + public OptsAndParamsPage(WsJobParameters wsJobParameters) + { + poparent = wsJobParameters; + } + + 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); + } + + + URL linkImageURL = getClass().getResource("/images/link.gif"); + + Map optSet = new Hashtable(); + + Map paramSet = new Hashtable(); + + public Map getOptSet() + { + return optSet; + } + + public void setOptSet(Map optSet) + { + this.optSet = optSet; + } + + public Map getParamSet() + { + return paramSet; + } + + public void setParamSet(Map paramSet) + { + this.paramSet = paramSet; + } + + + OptsParametersContainerI poparent; + + 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; + } + + ParamBox addParameter(ParameterI arg) + { + ParamBox pb = paramSet.get(arg.getName()); + if (pb == null) + { + pb = new ParamBox(poparent, arg); + paramSet.put(arg.getName(), pb); +// paramList.add(pb); + } + pb.init(); + // take the defaults from the parameter + pb.updateControls(arg); + return pb; + } + + 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(); + } + + void setParameter(ParameterI arg) + { + ParamBox pb = paramSet.get(arg.getName()); + if (pb == null) + { + addParameter(arg); + } + else + { + pb.updateControls(arg); + } + + } + + +} diff --git a/src/jalview/gui/OptsParametersContainerI.java b/src/jalview/gui/OptsParametersContainerI.java new file mode 100644 index 0000000..ae58c77 --- /dev/null +++ b/src/jalview/gui/OptsParametersContainerI.java @@ -0,0 +1,13 @@ +package jalview.gui; + +import jalview.gui.OptsAndParamsPage.ParamBox; +import jalview.gui.OptsAndParamsPage.OptionBox; + +public interface OptsParametersContainerI +{ + + void refreshParamLayout(); + + void argSetModified(Object modifiedElement, boolean b); + +} diff --git a/src/jalview/gui/WsJobParameters.java b/src/jalview/gui/WsJobParameters.java index 6017765..2529de9 100644 --- a/src/jalview/gui/WsJobParameters.java +++ b/src/jalview/gui/WsJobParameters.java @@ -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.getDefaultValue()); } } @@ -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(); } @@ -1704,7 +1075,7 @@ public class WsJobParameters extends JPanel implements ItemListener, { List argSet = new ArrayList(); // recover options and parameters from GUI - for (OptionBox opts : optSet.values()) + for (OptionBox opts : opanp.getOptSet().values()) { OptionI opt = opts.getOptionIfEnabled(); if (opt != null) @@ -1712,7 +1083,7 @@ public class WsJobParameters extends JPanel implements ItemListener, argSet.add(opt); } } - for (ParamBox parambox : paramSet.values()) + for (ParamBox parambox : opanp.getParamSet().values()) { ParameterI parm = parambox.getParameter(); if (parm != null) -- 1.7.10.2