From a3d80544cd19436e1ee4abbcfa9befcc926784bf Mon Sep 17 00:00:00 2001 From: gmungoc Date: Fri, 19 Jul 2019 11:22:38 +0100 Subject: [PATCH] JAL-3371 use gui.Slider for OptAndParamPage min-max parameters --- src/jalview/gui/OptsAndParamsPage.java | 161 +++++++++++++++++--------------- src/jalview/gui/Slider.java | 12 ++- 2 files changed, 92 insertions(+), 81 deletions(-) diff --git a/src/jalview/gui/OptsAndParamsPage.java b/src/jalview/gui/OptsAndParamsPage.java index 5342c90..acd8445 100644 --- a/src/jalview/gui/OptsAndParamsPage.java +++ b/src/jalview/gui/OptsAndParamsPage.java @@ -53,7 +53,6 @@ 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; @@ -277,7 +276,7 @@ public class OptsAndParamsPage boolean choice = false; - JComboBox choicebox; + JComboBox choicebox; JPanel controlPanel = new JPanel(); @@ -299,7 +298,12 @@ public class OptsAndParamsPage JButton showDesc = new JButton(); - JSlider slider = null; + Slider slider = null; + + /* + * true minimum corresponding to 0 (minimum) of the slider + */ + int sliderZeroValue; JTextArea string = new JTextArea(); @@ -363,7 +367,7 @@ public class OptsAndParamsPage validate(); } - private void makeExpanderParam(ParameterI parm) + private void makeExpanderParam(final ParameterI parm) { setPreferredSize(new Dimension(PARAM_WIDTH, PARAM_CLOSEDHEIGHT)); setBorder(new TitledBorder(parm.getName())); @@ -451,6 +455,9 @@ public class OptsAndParamsPage validate(); } + /** + * Action on input in text field + */ @Override public void actionPerformed(ActionEvent e) { @@ -467,24 +474,19 @@ 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 Object getCurrentValue() + { + return choice ? choicebox.getSelectedItem() : valueField.getText(); } @Override @@ -566,16 +568,20 @@ public class OptsAndParamsPage } + /** + * Action on change of slider value + */ @Override public void stateChanged(ChangeEvent e) { if (!adjusting) { - valueField.setText("" + ((integ) ? ("" + slider.getValue()) - : ("" + slider.getValue() / 1000f))); + float value = slider.getSliderValue(); + valueField.setText( + integ ? Integer.toString((int) value) + : Float.toString(value)); checkIfModified(); } - } public void updateControls(ParameterI parm) @@ -592,8 +598,6 @@ public class OptsAndParamsPage } else { - slider = new JSlider(); - slider.addChangeListener(this); valueField = new JTextField(); valueField.addActionListener(this); valueField.addKeyListener(new KeyListener() @@ -622,9 +626,11 @@ public class OptsAndParamsPage } }); valueField.setPreferredSize(new Dimension(60, 25)); + slider = makeSlider(parm.getValidValue()); + slider.addChangeListener(this); + controlPanel.add(slider, BorderLayout.WEST); controlPanel.add(valueField, BorderLayout.EAST); - } } @@ -634,8 +640,8 @@ public class OptsAndParamsPage { if (init) { - List vals = parm.getPossibleValues(); - for (Object val : vals) + List vals = parm.getPossibleValues(); + for (String val : vals) { choicebox.addItem(val); } @@ -651,96 +657,105 @@ public class OptsAndParamsPage 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()); } - ; - // update value field to reflect any bound checking we performed. - valueField.setText("" + iVal); - if (validator.getMin() != null && validator.getMax() != null) + if (minValue != null || maxValue != null) { - slider.getModel().setRangeProperties(iVal, 1, - validator.getMin().intValue(), - validator.getMax().intValue() + 1, 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 * 1000f), 1, - (int) (validator.getMin().floatValue() * 1000f), - 1 + (int) (validator.getMax().floatValue() * 1000f), - true); + slider.setSliderModel(minValue.floatValue(), + maxValue.floatValue(), fVal); } else { slider.setVisible(false); } - return new float[] { fVal }; } } else @@ -748,14 +763,8 @@ public class OptsAndParamsPage if (!choice) { slider.setVisible(false); - return new String[] { valueField.getText().trim() }; - } - else - { - return new String[] { (String) choicebox.getSelectedItem() }; } } - } } @@ -801,9 +810,9 @@ public class OptsAndParamsPage URL linkImageURL = getClass().getResource("/images/link.gif"); - Map optSet = new java.util.LinkedHashMap(); + Map optSet = new java.util.LinkedHashMap<>(); - Map paramSet = new java.util.LinkedHashMap(); + Map paramSet = new java.util.LinkedHashMap<>(); public Map getOptSet() { @@ -904,7 +913,7 @@ public class OptsAndParamsPage */ public List getCurrentSettings() { - List argSet = new ArrayList(); + List argSet = new ArrayList<>(); for (OptionBox opts : getOptSet().values()) { OptionI opt = opts.getOptionIfEnabled(); diff --git a/src/jalview/gui/Slider.java b/src/jalview/gui/Slider.java index b913ba0..c8f673d 100644 --- a/src/jalview/gui/Slider.java +++ b/src/jalview/gui/Slider.java @@ -29,7 +29,7 @@ public class Slider extends JSlider * scaleFactor applied to true value range to give a * slider range of 0 - 100 */ - private int sliderScaleFactor; + private float sliderScaleFactor; /** * Constructor that rescales min - max to 0 - 100 for the slider @@ -57,9 +57,11 @@ public class Slider extends JSlider trueMin = min; trueMax = max; setMinimum(0); - sliderScaleFactor = (int) (100f / (max - min)); + sliderScaleFactor = 100f / (max - min); int sliderMax = (int) ((max - min) * sliderScaleFactor); - setMaximum(sliderMax); + int extent = 1; + setExtent(extent); + setMaximum(sliderMax + extent); setSliderValue(value); } @@ -75,7 +77,7 @@ public class Slider extends JSlider */ int value = getValue(); return value == getMaximum() ? trueMax - : value / (float) sliderScaleFactor + trueMin; + : value / sliderScaleFactor + trueMin; } /** @@ -85,7 +87,7 @@ public class Slider extends JSlider */ public void setSliderValue(float value) { - setValue((int) ((value - trueMin) * sliderScaleFactor)); + setValue(Math.round((value - trueMin) * sliderScaleFactor)); } /** -- 1.7.10.2