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();