X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FOptsAndParamsPage.java;h=92b612ac79e192da98c6c0ff9b9f2653f946e5fe;hb=3e85e0bc8df23e09495f57089ec6e26d2552efa5;hp=eb04d087a6c9b39cbe1acdc3264600a22c93dd84;hpb=127ce9ebd4add01b194a86fcf8446edea4ec3706;p=jalview.git diff --git a/src/jalview/gui/OptsAndParamsPage.java b/src/jalview/gui/OptsAndParamsPage.java index eb04d08..92b612a 100644 --- a/src/jalview/gui/OptsAndParamsPage.java +++ b/src/jalview/gui/OptsAndParamsPage.java @@ -1,23 +1,46 @@ +/* + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors + * + * This file is part of Jalview. + * + * Jalview is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. + * + * Jalview is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. + */ package jalview.gui; +import jalview.util.MessageManager; +import jalview.ws.params.ArgumentI; import jalview.ws.params.OptionI; import jalview.ws.params.ParameterI; import jalview.ws.params.ValueConstrainI; +import jalview.ws.params.ValueConstrainI.ValueType; 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.KeyEvent; +import java.awt.event.KeyListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.net.URL; -import java.util.Hashtable; +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -30,24 +53,30 @@ 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; +import net.miginfocom.swing.MigLayout; /** - * GUI generator/manager for options and parameters. Originally abstracted from the WsJobParameters dialog box. - * @author jprocter - * + * 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 + /** + * compact or verbose style parameters + */ + boolean compact = false; + + public class OptionBox extends JPanel + implements MouseListener, ActionListener { JCheckBox enabled = new JCheckBox(); @@ -63,7 +92,7 @@ public class OptsAndParamsPage JLabel optlabel = new JLabel(); - JComboBox val = new JComboBox(); + JComboBox val = new JComboBox<>(); public OptionBox(OptionI opt) { @@ -75,30 +104,36 @@ public class OptsAndParamsPage enabled.setText(opt.getName()); enabled.addActionListener(this); finfo = option.getFurtherDetails(); + String desc = opt.getDescription(); if (finfo != null) { hasLink = true; - enabled.setToolTipText("" - + JvSwingUtils.wrapTooltip(opt.getDescription() - + "
") - + ""); + + enabled.setToolTipText(JvSwingUtils.wrapTooltip(true, + ((desc == null || desc.trim().length() == 0) + ? MessageManager.getString( + "label.opt_and_params_further_details") + : desc) + "
")); enabled.addMouseListener(this); } else { - enabled.setToolTipText("" - + JvSwingUtils.wrapTooltip(opt.getDescription()) - + ""); + if (desc != null && desc.trim().length() > 0) + { + enabled.setToolTipText( + JvSwingUtils.wrapTooltip(true, opt.getDescription())); + } } add(enabled, BorderLayout.NORTH); + for (String str : opt.getPossibleValues()) + { + val.addItem(str); + } + val.setSelectedItem(opt.getValue()); 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); } @@ -108,6 +143,7 @@ public class OptsAndParamsPage setInitialValue(); } + @Override public void actionPerformed(ActionEvent e) { if (e.getSource() != enabled) @@ -129,13 +165,14 @@ public class OptsAndParamsPage else { // compare against default service setting - notmod &= option.getDefaultValue() == null - || option.getDefaultValue().equals(val.getSelectedItem()); + notmod &= option.getValue() == null + || option.getValue().equals(val.getSelectedItem()); } } else { - notmod &= initVal == null; + notmod &= (initVal != null) ? initVal.equals(val.getSelectedItem()) + : val.getSelectedItem() != initVal; } poparent.argSetModified(this, !notmod); } @@ -147,53 +184,72 @@ public class OptsAndParamsPage return null; } OptionI opt = option.copy(); - + if (opt.getPossibleValues() != null + && opt.getPossibleValues().size() == 1) + { + // Hack to make sure the default value for an enabled option with only + // one value is actually returned + opt.setValue(opt.getPossibleValues().get(0)); + } if (val.getSelectedItem() != null) { - opt.setDefaultValue((String) val.getSelectedItem()); + opt.setValue((String) val.getSelectedItem()); + } + else + { + if (option.getValue() != null) + { + opt.setValue(option.getValue()); + } } return opt; } + @Override public void mouseClicked(MouseEvent e) { - if (javax.swing.SwingUtilities.isRightMouseButton(e)) + if (e.isPopupTrigger()) // for Windows { showUrlPopUp(this, finfo.toString(), e.getX(), e.getY()); } } + @Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub } + @Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub } + @Override public void mousePressed(MouseEvent e) { - // TODO Auto-generated method stub - + if (e.isPopupTrigger()) // Mac + { + showUrlPopUp(this, finfo.toString(), e.getX(), e.getY()); + } } + @Override public void mouseReleased(MouseEvent e) { - // TODO Auto-generated method stub - } - public void resetToDefault() + public void resetToDefault(boolean setDefaultParams) { enabled.setSelected(false); - if (option.isRequired()) + if (option.isRequired() + || (setDefaultParams && option.getValue() != null)) { // Apply default value - selectOption(option, option.getDefaultValue()); + selectOption(option, option.getValue()); } } @@ -207,20 +263,20 @@ public class OptsAndParamsPage } else { - initVal = (initEnabled) ? option.getDefaultValue() : null; + initVal = (initEnabled) ? (String) val.getSelectedItem() : null; } } } - public class ParamBox extends JPanel implements ChangeListener, - ActionListener, MouseListener + public class ParamBox extends JPanel + implements ChangeListener, ActionListener, MouseListener { boolean adjusting = false; boolean choice = false; - JComboBox choicebox; + JComboBox choicebox; JPanel controlPanel = new JPanel(); @@ -232,7 +288,7 @@ public class OptsAndParamsPage boolean integ = false; - Object lastVal; + String lastVal; ParameterI parameter; @@ -242,7 +298,7 @@ public class OptsAndParamsPage JButton showDesc = new JButton(); - JSlider slider = null; + Slider slider = null; JTextArea string = new JTextArea(); @@ -250,9 +306,64 @@ public class OptsAndParamsPage JTextField valueField = null; - public ParamBox(final OptsParametersContainerI pmlayout, ParameterI parm) + public ParamBox(final OptsParametersContainerI pmlayout, + ParameterI parm) { pmdialogbox = pmlayout; + finfo = parm.getFurtherDetails(); + validator = parm.getValidValue(); + parameter = parm; + if (validator != null) + { + integ = validator.getType() == ValueType.Integer; + } + else + { + if (parameter.getPossibleValues() != null) + { + choice = true; + } + } + + if (!compact) + { + makeExpanderParam(parm); + } + else + { + makeCompactParam(parm); + + } + } + + private void makeCompactParam(ParameterI parm) + { + setLayout(new MigLayout("", "[][grow]")); + + String ttipText = null; + + controlPanel.setLayout(new BorderLayout()); + + if (parm.getDescription() != null + && parm.getDescription().trim().length() > 0) + { + // Only create description boxes if there actually is a description. + ttipText = (JvSwingUtils.wrapTooltip(true, + parm.getDescription() + (finfo != null ? "
" + + MessageManager.getString( + "label.opt_and_params_further_details") + : ""))); + } + + JvSwingUtils.mgAddtoLayout(this, ttipText, new JLabel(parm.getName()), + controlPanel, ""); + updateControls(parm); + validate(); + } + + private void makeExpanderParam(final ParameterI parm) + { setPreferredSize(new Dimension(PARAM_WIDTH, PARAM_CLOSEDHEIGHT)); setBorder(new TitledBorder(parm.getName())); setLayout(null); @@ -263,62 +374,67 @@ public class OptsAndParamsPage 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)); + + final ParamBox me = this; + + if (parm.getDescription() != null + && parm.getDescription().trim().length() > 0) + { + // Only create description boxes if there actually is a description. + if (finfo != null) + { + showDesc.setToolTipText(JvSwingUtils.wrapTooltip(true, + MessageManager.formatMessage( + "label.opt_and_params_show_brief_desc_image_link", + new String[] + { linkImageURL.toExternalForm() }))); + showDesc.addMouseListener(this); + } + else + { + showDesc.setToolTipText( + JvSwingUtils.wrapTooltip(true, MessageManager.getString( + "label.opt_and_params_show_brief_desc"))); + } + showDesc.addActionListener(new ActionListener() + { + + @Override + 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(); + pmdialogbox.refreshParamLayout(); + } + }); + string.setWrapStyleWord(true); + string.setLineWrap(true); + string.setColumns(32); + string.setText(parm.getDescription()); + showDesc.setBounds(new Rectangle(10, 10, 16, 16)); + firstrow.add(showDesc); + } add(firstrow); validator = parm.getValidValue(); parameter = parm; if (validator != null) { - integ = validator.getType() == Type.Integer; + integ = validator.getType() == ValueType.Integer; } else { @@ -334,6 +450,10 @@ public class OptsAndParamsPage validate(); } + /** + * Action on input in text field + */ + @Override public void actionPerformed(ActionEvent e) { if (adjusting) @@ -349,36 +469,35 @@ public class OptsAndParamsPage 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); + Object cstate = getCurrentValue(); + boolean modified = !cstate.equals(lastVal); + pmdialogbox.argSetModified(this, modified); + } + + /** + * Answers the current value of the parameter, as text + * + * @return + */ + private String getCurrentValue() + { + return choice ? (String) choicebox.getSelectedItem() + : valueField.getText(); } @Override - public int getBaseline(int width, int height) { - return 0; + public int getBaseline(int width, int height) + { + return 0; } - // from http://stackoverflow.com/questions/2743177/top-alignment-for-flowlayout + // 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 Component.BaselineResizeBehavior getBaselineResizeBehavior() + { + return Component.BaselineResizeBehavior.CONSTANT_ASCENT; } public int getBoxHeight() @@ -391,11 +510,11 @@ public class OptsAndParamsPage ParameterI prm = parameter.copy(); if (choice) { - prm.setDefaultValue((String) choicebox.getSelectedItem()); + prm.setValue((String) choicebox.getSelectedItem()); } else { - prm.setDefaultValue(valueField.getText()); + prm.setValue(valueField.getText()); } return prm; } @@ -406,49 +525,61 @@ public class OptsAndParamsPage lastVal = null; } + @Override public void mouseClicked(MouseEvent e) { - if (javax.swing.SwingUtilities.isRightMouseButton(e)) + if (e.isPopupTrigger()) // for Windows { showUrlPopUp(this, finfo.toString(), e.getX(), e.getY()); } } + @Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub } + @Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub } + @Override public void mousePressed(MouseEvent e) { - // TODO Auto-generated method stub - + if (e.isPopupTrigger()) // for Mac + { + showUrlPopUp(this, finfo.toString(), e.getX(), e.getY()); + } } + @Override public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub } + /** + * Action on change of slider value + */ + @Override public void stateChanged(ChangeEvent e) { if (!adjusting) { - valueField.setText("" - + ((integ) ? ("" + (int) slider.getValue()) - : ("" + (float) (slider.getValue() / 1000f)))); + float value = slider.getSliderValue(); + valueField.setText( + integ ? Integer.toString((int) value) + : Float.toString(value)); checkIfModified(); } - } + public void updateControls(ParameterI parm) { adjusting = true; @@ -457,20 +588,47 @@ public class OptsAndParamsPage { if (choice) { - choicebox = new JComboBox(); + 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.addKeyListener(new KeyListener() + { + + @Override + public void keyTyped(KeyEvent e) + { + } + + @Override + public void keyReleased(KeyEvent e) + { + if (e.isActionKey()) + { + if (valueField.getText().trim().length() > 0) + { + actionPerformed(null); + } + } + } + + @Override + public void keyPressed(KeyEvent e) + { + } + }); valueField.setPreferredSize(new Dimension(60, 25)); + valueField.setText(parm.getValue()); + slider = makeSlider(parm.getValidValue()); + updateSliderFromValueField(); + slider.addChangeListener(this); + controlPanel.add(slider, BorderLayout.WEST); controlPanel.add(valueField, BorderLayout.EAST); - } } @@ -480,107 +638,122 @@ public class OptsAndParamsPage { if (init) { - List vals = parm.getPossibleValues(); - for (Object val : vals) + List vals = parm.getPossibleValues(); + for (String val : vals) { choicebox.addItem(val); } } - if (parm.getDefaultValue() != null) + if (parm.getValue() != null) { - choicebox.setSelectedItem(parm.getDefaultValue()); + choicebox.setSelectedItem(parm.getValue()); } } else { - valueField.setText(parm.getDefaultValue()); + valueField.setText(parm.getValue()); } } - lastVal = updateSliderFromValueField(); + lastVal = getCurrentValue(); adjusting = false; } - public Object updateSliderFromValueField() + private Slider makeSlider(ValueConstrainI validValue) + { + if (validValue != null) + { + final Number minValue = validValue.getMin(); + final Number maxValue = validValue.getMax(); + if (minValue != null && maxValue != null) + { + return new Slider(minValue.floatValue(), maxValue.floatValue(), + minValue.floatValue()); + } + } + + /* + * otherwise, a nominal slider which will not be visible + */ + return new Slider(0, 100, 50); + } + + public void updateSliderFromValueField() { - int iVal; - float fVal; if (validator != null) { + final Number minValue = validator.getMin(); + final Number maxValue = validator.getMax(); if (integ) { - iVal = 0; + int iVal = 0; try { valueField.setText(valueField.getText().trim()); iVal = Integer.valueOf(valueField.getText()); - if (validator.getMin() != null - && validator.getMin().intValue() > iVal) + if (minValue != null + && minValue.intValue() > iVal) { - iVal = validator.getMin().intValue(); + iVal = minValue.intValue(); // TODO: provide visual indication that hard limit was reached for // this parameter } - if (validator.getMax() != null - && validator.getMax().intValue() < iVal) + if (maxValue != null && maxValue.intValue() < iVal) { - iVal = validator.getMax().intValue(); - // TODO: provide visual indication that hard limit was reached for - // this parameter + iVal = maxValue.intValue(); } - } catch (Exception e) + } catch (NumberFormatException e) { + System.err.println(e.toString()); } - ; - if (validator.getMin() != null && validator.getMax() != null) + if (minValue != null || maxValue != null) { - slider.getModel().setRangeProperties(iVal, 1, - validator.getMin().intValue(), - validator.getMax().intValue(), true); + valueField.setText(String.valueOf(iVal)); + slider.setSliderValue(iVal); } else { slider.setVisible(false); } - return new int[] - { iVal }; } else { - fVal = 0f; + float fVal = 0f; try { + valueField.setText(valueField.getText().trim()); fVal = Float.valueOf(valueField.getText()); - if (validator.getMin() != null - && validator.getMin().floatValue() > fVal) + if (minValue != null + && minValue.floatValue() > fVal) { - fVal = validator.getMin().floatValue(); + fVal = minValue.floatValue(); // TODO: provide visual indication that hard limit was reached for // this parameter + // update value field to reflect any bound checking we performed. + valueField.setText("" + fVal); } - if (validator.getMax() != null - && validator.getMax().floatValue() < fVal) + if (maxValue != null + && maxValue.floatValue() < fVal) { - fVal = validator.getMax().floatValue(); + fVal = maxValue.floatValue(); // TODO: provide visual indication that hard limit was reached for // this parameter + // update value field to reflect any bound checking we performed. + valueField.setText("" + fVal); } - } catch (Exception e) + } catch (NumberFormatException e) { + System.err.println(e.toString()); } - ; - if (validator.getMin() != null && validator.getMax() != null) + if (minValue != null && maxValue != null) { - slider.getModel().setRangeProperties((int) fVal * 1000, 1, - (int) validator.getMin().floatValue() * 1000, - (int) validator.getMax().floatValue() * 1000, true); + slider.setSliderModel(minValue.floatValue(), + maxValue.floatValue(), fVal); } else { slider.setVisible(false); } - return new float[] - { fVal }; } } else @@ -588,27 +761,27 @@ public class OptsAndParamsPage if (!choice) { slider.setVisible(false); - return new String[] - { valueField.getText().trim() }; - } - else - { - return new String[] - { (String) choicebox.getSelectedItem() }; } } - } } - static final int PARAM_WIDTH = 340; + public static final int PARAM_WIDTH = 340; + + public static final int PARAM_HEIGHT = 150; - private static final int PARAM_HEIGHT = 150; + public static final int PARAM_CLOSEDHEIGHT = 80; + + public OptsAndParamsPage(OptsParametersContainerI paramContainer) + { + this(paramContainer, false); + } - static final int PARAM_CLOSEDHEIGHT = 80; - public OptsAndParamsPage(WsJobParameters wsJobParameters) + public OptsAndParamsPage(OptsParametersContainerI paramContainer, + boolean compact) { - poparent = wsJobParameters; + poparent = paramContainer; + this.compact = compact; } public static void showUrlPopUp(JComponent invoker, final String finfo, @@ -616,7 +789,9 @@ public class OptsAndParamsPage { JPopupMenu mnu = new JPopupMenu(); - JMenuItem mitem = new JMenuItem("View " + finfo); + JMenuItem mitem = new JMenuItem( + MessageManager.formatMessage("label.view_params", new String[] + { finfo })); mitem.addActionListener(new ActionListener() { @@ -631,12 +806,11 @@ public class OptsAndParamsPage mnu.show(invoker, x, y); } - URL linkImageURL = getClass().getResource("/images/link.gif"); - Map optSet = new Hashtable(); + Map optSet = new java.util.LinkedHashMap<>(); - Map paramSet = new Hashtable(); + Map paramSet = new java.util.LinkedHashMap<>(); public Map getOptSet() { @@ -658,7 +832,6 @@ public class OptsAndParamsPage this.paramSet = paramSet; } - OptsParametersContainerI poparent; OptionBox addOption(OptionI opt) @@ -680,7 +853,7 @@ public class OptsAndParamsPage { pb = new ParamBox(poparent, arg); paramSet.put(arg.getName(), pb); -// paramList.add(pb); + // paramList.add(pb); } pb.init(); // take the defaults from the parameter @@ -704,7 +877,9 @@ public class OptsAndParamsPage } else { - throw new Error("Invalid value " + string + " for option " + option); + throw new Error(MessageManager.formatMessage( + "error.invalid_value_for_option", new String[] + { string, option.getName() })); } } @@ -729,5 +904,32 @@ public class OptsAndParamsPage } + /** + * recover options and parameters from GUI + * + * @return + */ + public List getCurrentSettings() + { + List argSet = new ArrayList<>(); + for (OptionBox opts : getOptSet().values()) + { + OptionI opt = opts.getOptionIfEnabled(); + if (opt != null) + { + argSet.add(opt); + } + } + for (ParamBox parambox : getParamSet().values()) + { + ParameterI parm = parambox.getParameter(); + if (parm != null) + { + argSet.add(parm); + } + } + + return argSet; + } }