X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fjalview%2Fgui%2FOptsAndParamsPage.java;h=3e09a35d6272ac4e433afee21b5842831061c3c4;hb=5e22c6b15dc429055036c19fcfc48c16d37d7ad0;hp=3bc99dd758f3f8c0d18ce3e68370f4efddae80a6;hpb=cb5d856b1304448cae13a333cbd9017f81520d90;p=jalview.git diff --git a/src/jalview/gui/OptsAndParamsPage.java b/src/jalview/gui/OptsAndParamsPage.java index 3bc99dd..3e09a35 100644 --- a/src/jalview/gui/OptsAndParamsPage.java +++ b/src/jalview/gui/OptsAndParamsPage.java @@ -1,29 +1,34 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1) - * Copyright (C) 2014 The Jalview Authors + * 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. + * 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 . + * 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 static jalview.ws.params.simple.LogarithmicParameter.LOGSLIDERSCALE; + 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 jalview.ws.params.simple.LogarithmicParameter; import java.awt.BorderLayout; import java.awt.Component; @@ -33,13 +38,13 @@ import java.awt.GridLayout; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.KeyAdapter; 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.ArrayList; -import java.util.Hashtable; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -70,13 +75,31 @@ import net.miginfocom.swing.MigLayout; */ public class OptsAndParamsPage { - /** + public static final int PARAM_WIDTH = 340; + + public static final int PARAM_HEIGHT = 150; + + public static final int PARAM_CLOSEDHEIGHT = 80; + + URL linkImageURL = getClass().getResource("/images/link.gif"); + + Map optSet = new LinkedHashMap<>(); + + Map paramSet = new LinkedHashMap<>(); + + /* * compact or verbose style parameters */ boolean compact = false; - public class OptionBox extends JPanel implements MouseListener, - ActionListener + OptsParametersContainerI poparent; + + /** + * A class that models a panel rendering a single option (checkbox or choice + * list) + */ + public class OptionBox extends JPanel + implements MouseListener, ActionListener { JCheckBox enabled = new JCheckBox(); @@ -92,13 +115,14 @@ public class OptsAndParamsPage JLabel optlabel = new JLabel(); - JComboBox val = new JComboBox(); + JComboBox val = new JComboBox<>(); public OptionBox(OptionI opt) { option = opt; setLayout(new BorderLayout()); enabled.setSelected(opt.isRequired()); // TODO: lock required options + // enabled.setEnabled(!opt.isRequired()); enabled.setFont(new Font("Verdana", Font.PLAIN, 11)); enabled.setText(""); enabled.setText(opt.getName()); @@ -109,29 +133,28 @@ public class OptsAndParamsPage { hasLink = true; - enabled.setToolTipText("" - + JvSwingUtils - .wrapTooltip(((desc == null || desc.trim().length()==0) ? "see further details by right-clicking" - : desc) - + "
") - + ""); + enabled.setToolTipText(JvSwingUtils.wrapTooltip(true, + ((desc == null || desc.trim().length() == 0) + ? MessageManager.getString( + "label.opt_and_params_further_details") + : desc) + "
")); enabled.addMouseListener(this); } else { - if (desc != null && desc.trim().length()>0) + if (desc != null && desc.trim().length() > 0) { - enabled.setToolTipText("" - + JvSwingUtils.wrapTooltip(opt.getDescription()) - + ""); + enabled.setToolTipText( + JvSwingUtils.wrapTooltip(true, opt.getDescription())); } } add(enabled, BorderLayout.NORTH); - for (Object str : opt.getPossibleValues()) + for (String str : opt.getPossibleValues()) { - val.addItem((String) str); + val.addItem(str); } - val.setSelectedItem((String) opt.getValue()); + val.setSelectedItem(opt.getValue()); if (opt.getPossibleValues().size() > 1) { setLayout(new GridLayout(1, 2)); @@ -144,6 +167,7 @@ public class OptsAndParamsPage setInitialValue(); } + @Override public void actionPerformed(ActionEvent e) { if (e.getSource() != enabled) @@ -205,43 +229,48 @@ public class OptsAndParamsPage 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(boolean setDefaultParams) { enabled.setSelected(false); - if (option.isRequired() || (setDefaultParams && option.getValue()!=null)) + if (option.isRequired() + || (setDefaultParams && option.getValue() != null)) { // Apply default value selectOption(option, option.getValue()); @@ -261,17 +290,24 @@ public class OptsAndParamsPage initVal = (initEnabled) ? (String) val.getSelectedItem() : null; } } - + } - public class ParamBox extends JPanel implements ChangeListener, - ActionListener, MouseListener + /** + * A class that models a panel rendering a single parameter + */ + public class ParamBox extends JPanel + implements ChangeListener, ActionListener, MouseListener { + private static final float SLIDERSCALE = 1000f; + + boolean isLogarithmic; + boolean adjusting = false; boolean choice = false; - JComboBox choicebox; + JComboBox choicebox; JPanel controlPanel = new JPanel(); @@ -301,7 +337,8 @@ 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(); @@ -318,6 +355,10 @@ public class OptsAndParamsPage choice = true; } } + if (parm instanceof LogarithmicParameter) + { + isLogarithmic = true; + } if (!compact) { @@ -342,17 +383,16 @@ public class OptsAndParamsPage && parm.getDescription().trim().length() > 0) { // Only create description boxes if there actually is a description. - ttipText = ("" - + JvSwingUtils - .wrapTooltip(parm.getDescription() - + (finfo != null ? "
Right click for further information." - : "")) + ""); + 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, ""); + JvSwingUtils.mgAddtoLayout(this, ttipText, new JLabel(parm.getName()), + controlPanel, ""); updateControls(parm); validate(); } @@ -389,24 +429,23 @@ public class OptsAndParamsPage // Only create description boxes if there actually is a description. if (finfo != null) { - showDesc.setToolTipText("" - + JvSwingUtils - .wrapTooltip("Click to show brief description
Right click for further information.") - + ""); + 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("Click to show brief description.") - + ""); + 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; @@ -446,6 +485,7 @@ public class OptsAndParamsPage validate(); } + @Override public void actionPerformed(ActionEvent e) { if (adjusting) @@ -521,50 +561,82 @@ 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 } + @Override public void stateChanged(ChangeEvent e) { if (!adjusting) { - valueField.setText("" - + ((integ) ? ("" + (int) slider.getValue()) - : ("" + (float) (slider.getValue() / 1000f)))); + if (!isLogarithmic) + { + /* + * set (int or float formatted) text field value + */ + valueField.setText(integ ? String.valueOf(slider.getValue()) + : String.valueOf(slider.getValue() / SLIDERSCALE)); + } + else + { + double base = ((LogarithmicParameter) parameter).getBase(); + double value = Math.pow(base, slider.getValue() / LOGSLIDERSCALE); + valueField.setText(formatDouble(value)); + } checkIfModified(); } } + /** + * Answers the value formatted as a string to 3 decimal places - in + * scientific notation if the value is less than 0.001 + * + * @param value + * @return + */ + public String formatDouble(double value) + { + String format = value < 0.001 ? "%3.3e" : "%3.3f"; + return String.format(format, value); + } + public void updateControls(ParameterI parm) { adjusting = true; @@ -573,7 +645,7 @@ public class OptsAndParamsPage { if (choice) { - choicebox = new JComboBox(); + choicebox = new JComboBox<>(); choicebox.addActionListener(this); controlPanel.add(choicebox, BorderLayout.CENTER); } @@ -583,32 +655,23 @@ public class OptsAndParamsPage slider.addChangeListener(this); valueField = new JTextField(); valueField.addActionListener(this); - valueField.addKeyListener(new KeyListener() + valueField.addKeyListener(new KeyAdapter() { - - @Override - public void keyTyped(KeyEvent e) - { - } - @Override public void keyReleased(KeyEvent e) { - if (valueField.getText().trim().length() > 0) + if (e.isActionKey()) { - actionPerformed(null); + if (valueField.getText().trim().length() > 0) + { + actionPerformed(null); + } } } - - @Override - public void keyPressed(KeyEvent e) - { - } }); - valueField.setPreferredSize(new Dimension(60, 25)); + valueField.setPreferredSize(new Dimension(80, 25)); controlPanel.add(slider, BorderLayout.WEST); controlPanel.add(valueField, BorderLayout.EAST); - } } @@ -618,8 +681,7 @@ public class OptsAndParamsPage { if (init) { - List vals = parm.getPossibleValues(); - for (Object val : vals) + for (String val : parm.getPossibleValues()) { choicebox.addItem(val); } @@ -632,7 +694,18 @@ public class OptsAndParamsPage } else { - valueField.setText(parm.getValue()); + if (parm instanceof LogarithmicParameter) + { + double base = ((LogarithmicParameter) parm).getBase(); + // double value = Math.pow(base, + // Double.parseDouble(parm.getValue()) / LOGSLIDERSCALE); + double value = Double.parseDouble(parm.getValue()); + valueField.setText(formatDouble(value)); + } + else + { + valueField.setText(parm.getValue()); + } } } lastVal = updateSliderFromValueField(); @@ -643,6 +716,7 @@ public class OptsAndParamsPage { int iVal; float fVal; + double dVal; if (validator != null) { if (integ) @@ -668,22 +742,68 @@ public class OptsAndParamsPage } } catch (Exception e) { + System.err.println(e.getMessage()); } - ; // update value field to reflect any bound checking we performed. valueField.setText("" + iVal); if (validator.getMin() != null && validator.getMax() != null) { slider.getModel().setRangeProperties(iVal, 1, validator.getMin().intValue(), - validator.getMax().intValue(), true); + validator.getMax().intValue() + 1, true); + } + else + { + slider.setVisible(false); + } + return new int[] { iVal }; + } + else if (isLogarithmic) + { + dVal = 0d; + try + { + valueField.setText(valueField.getText().trim()); + double eValue = Double.valueOf(valueField.getText()); + + dVal = Math.log(eValue) / Math + .log(((LogarithmicParameter) parameter).getBase()) + * LOGSLIDERSCALE; + + if (validator.getMin() != null + && validator.getMin().doubleValue() > dVal) + { + dVal = validator.getMin().doubleValue(); + // TODO: provide visual indication that hard limit was reached for + // this parameter + // update value field to reflect any bound checking we performed. + valueField.setText(formatDouble(eValue)); + } + if (validator.getMax() != null + && validator.getMax().doubleValue() < dVal) + { + dVal = validator.getMax().doubleValue(); + // TODO: provide visual indication that hard limit was reached for + // this parameter + // update value field to reflect any bound checking we performed. + valueField.setText(formatDouble(eValue)); + } + } catch (Exception e) + { + } + + if (validator.getMin() != null && validator.getMax() != null) + { + slider.getModel().setRangeProperties((int) (dVal), 1, + (int) (validator.getMin().doubleValue()), + 1 + (int) (validator.getMax().doubleValue()), + true); } else { slider.setVisible(false); } - return new int[] - { iVal }; + return new double[] { dVal }; } else { @@ -713,19 +833,19 @@ public class OptsAndParamsPage } 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); + slider.getModel().setRangeProperties((int) (fVal * SLIDERSCALE), 1, + (int) (validator.getMin().floatValue() * SLIDERSCALE), + 1 + (int) (validator.getMax().floatValue() * SLIDERSCALE), + true); } else { slider.setVisible(false); } - return new float[] - { fVal }; + return new float[] { fVal }; } } else @@ -733,25 +853,17 @@ public class OptsAndParamsPage if (!choice) { slider.setVisible(false); - return new String[] - { valueField.getText().trim() }; + return new String[] { valueField.getText().trim() }; } else { - return new String[] - { (String) choicebox.getSelectedItem() }; + return new String[] { (String) choicebox.getSelectedItem() }; } } } } - public static final int PARAM_WIDTH = 340; - - public static final int PARAM_HEIGHT = 150; - - public static final int PARAM_CLOSEDHEIGHT = 80; - public OptsAndParamsPage(OptsParametersContainerI paramContainer) { this(paramContainer, false); @@ -769,7 +881,9 @@ public class OptsAndParamsPage { JPopupMenu mnu = new JPopupMenu(); - JMenuItem mitem = new JMenuItem(MessageManager.formatMessage("label.view_params", new String[]{finfo})); + JMenuItem mitem = new JMenuItem( + MessageManager.formatMessage("label.view_params", new String[] + { finfo })); mitem.addActionListener(new ActionListener() { @@ -784,12 +898,6 @@ public class OptsAndParamsPage mnu.show(invoker, x, y); } - URL linkImageURL = getClass().getResource("/images/link.gif"); - - Map optSet = new java.util.LinkedHashMap(); - - Map paramSet = new java.util.LinkedHashMap(); - public Map getOptSet() { return optSet; @@ -810,8 +918,6 @@ public class OptsAndParamsPage this.paramSet = paramSet; } - OptsParametersContainerI poparent; - OptionBox addOption(OptionI opt) { OptionBox cb = optSet.get(opt.getName()); @@ -855,9 +961,9 @@ public class OptsAndParamsPage } else { - throw new Error("Invalid value " + string + " for option " + option); + throw new Error(String.format("Invalid value '%s' for option '%s'", + string, option.getName())); } - } if (option.isRequired() && !cb.enabled.isSelected()) { @@ -887,7 +993,7 @@ public class OptsAndParamsPage */ public List getCurrentSettings() { - List argSet = new ArrayList(); + List argSet = new ArrayList<>(); for (OptionBox opts : getOptSet().values()) { OptionI opt = opts.getOptionIfEnabled();