*/
package jalview.gui;
-import static jalview.ws.params.simple.LogarithmicParameter.LOGSLIDERSCALE;
-
-import jalview.bin.Cache;
import jalview.util.MessageManager;
import jalview.ws.params.ArgumentI;
import jalview.ws.params.OptionI;
import jalview.ws.params.simple.StringParameter;
import java.awt.BorderLayout;
+import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
public class ParamBox extends JPanel
implements ChangeListener, ActionListener, MouseListener
{
- private static final float SLIDERSCALE = 1000f;
+ /*
+ * parameter values (or their logs) are multiplied by this
+ * scaling factor to ensure an integer range for the slider
+ */
+ private int sliderScaleFactor = 1;
boolean isLogarithmicParameter;
finfo = parm.getFurtherDetails();
validator = parm.getValidValue();
parameter = parm;
+
+ isLogarithmicParameter = parm instanceof LogarithmicParameter;
+
if (validator != null)
{
- isIntegerParameter = validator.getType() == ValueType.Integer;
- }
- else if (parameter.getPossibleValues() != null)
- {
- isChoiceParameter = true;
+ ValueType type = validator.getType();
+ isIntegerParameter = type == ValueType.Integer;
+
+ /*
+ * ensure slider has an integer range corresponding to
+ * the min-max range of the parameter
+ */
+ if (validator.getMin() != null && !isIntegerParameter)
+ {
+ double min = validator.getMin().doubleValue();
+ double max = validator.getMax().doubleValue();
+ if (isLogarithmicParameter)
+ {
+ min = Math.log(min);
+ max = Math.log(max);
+ }
+ sliderScaleFactor = (int) (1000000 / (max - min));
+ // todo scaleMin, scaleMax could also be final fields
+ }
}
- if (parm instanceof LogarithmicParameter)
+ else
{
- isLogarithmicParameter = true;
+ isChoiceParameter = parameter.getPossibleValues() != null;
}
if (compact)
@Override
public void mouseEntered(MouseEvent e)
{
- // TODO Auto-generated method stub
-
}
@Override
public void mouseExited(MouseEvent e)
{
- // TODO Auto-generated method stub
-
}
@Override
@Override
public void mouseReleased(MouseEvent e)
{
- // TODO Auto-generated method stub
-
}
@Override
/*
* set (int or float formatted) text field value
*/
- valueField.setText(isIntegerParameter ? String.valueOf(slider.getValue())
- : String.valueOf(slider.getValue() / SLIDERSCALE));
+ valueField.setText(isIntegerParameter
+ ? String.valueOf(slider.getValue())
+ : formatDouble(
+ slider.getValue() / (float) sliderScaleFactor));
}
else
{
- double base = ((LogarithmicParameter) parameter).getBase();
- double value = Math.pow(base, slider.getValue() / LOGSLIDERSCALE);
+ double value = Math.pow(Math.E,
+ slider.getValue() / (double) sliderScaleFactor);
valueField.setText(formatDouble(value));
}
checkIfModified();
}
-
}
/**
*/
String formatDouble(double value)
{
- String format = value < 0.001 ? "%3.3e" : "%3.3f";
+ String format = value < 0.001 ? "%3.1E" : "%3.3f";
return String.format(format, value);
}
+ /**
+ * Formats a number as integer or float (3dp) or scientific notation (1dp)
+ *
+ * @param n
+ * @return
+ */
+ String formatNumber(Number n)
+ {
+ return n instanceof Integer ? String.valueOf(n.intValue())
+ : formatDouble(n.doubleValue());
+ }
+
void updateControls(ParameterI parm)
{
adjusting = true;
}
}
});
- valueField.setPreferredSize(new Dimension(60, 25));
+ valueField.setPreferredSize(new Dimension(65, 25));
controlsPanel.add(slider, BorderLayout.WEST);
controlsPanel.add(valueField, BorderLayout.EAST);
}
choicebox.addItem(val);
}
}
-
if (parm.getValue() != null)
{
choicebox.setSelectedItem(parm.getValue());
}
else
{
- 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());
- }
+ valueField.setText(parm.getValue());
}
}
lastVal = updateSliderFromValueField();
{
if (validator == null)
{
- if (!isChoiceParameter)
+ if (isChoiceParameter)
{
- slider.setVisible(false);
- return valueField.getText().trim();
+ return choicebox.getSelectedItem();
}
- else
+ slider.setVisible(false);
+ return valueField.getText().trim();
+ }
+
+ valueField.setText(valueField.getText().trim());
+
+ /*
+ * ensure not outside min-max range
+ * TODO: provide some visual indicator if limit reached
+ */
+ try
+ {
+ valueField.setBackground(Color.WHITE);
+ double d = Double.parseDouble(valueField.getText());
+ if (validator.getMin() != null
+ && validator.getMin().doubleValue() > d)
{
- return choicebox.getSelectedItem();
+ valueField.setText(formatNumber(validator.getMin()));
}
+ if (validator.getMax() != null
+ && validator.getMax().doubleValue() < d)
+ {
+ valueField.setText(formatNumber(validator.getMax()));
+ }
+ } catch (NumberFormatException e)
+ {
+ valueField.setBackground(Color.yellow);
+ return Float.NaN;
}
+
if (isIntegerParameter)
{
int iVal = 0;
try
{
- valueField.setText(valueField.getText().trim());
iVal = Integer.valueOf(valueField.getText());
-
- /*
- * ensure not outside min-max range
- * TODO: provide some visual indicator if limit reached
- */
- if (validator.getMin() != null
- && validator.getMin().intValue() > iVal)
- {
- iVal = validator.getMin().intValue();
- valueField.setText(String.valueOf(iVal));
- }
- if (validator.getMax() != null
- && validator.getMax().intValue() < iVal)
- {
- iVal = validator.getMax().intValue();
- valueField.setText(String.valueOf(iVal));
- }
} catch (Exception e)
{
- Cache.log.error(e.getMessage());
+ valueField.setBackground(Color.yellow);
+ return Integer.valueOf(0);
}
if (validator.getMin() != null && validator.getMax() != null)
}
return new Integer(iVal);
}
- else if (isLogarithmicParameter)
+
+ if (isLogarithmicParameter)
{
double dVal = 0d;
try
{
- valueField.setText(valueField.getText().trim());
double eValue = Double.valueOf(valueField.getText());
-
- dVal = Math.log(eValue)
- / Math.log(((LogarithmicParameter) parameter).getBase())
- * LOGSLIDERSCALE;
-
- /*
- * ensure not outside min-max range
- * TODO: provide some visual indicator if limit reached
- */
- if (validator.getMin() != null
- && validator.getMin().doubleValue() > dVal)
- {
- dVal = validator.getMin().doubleValue();
- valueField.setText(formatDouble(eValue));
- }
- if (validator.getMax() != null
- && validator.getMax().doubleValue() < dVal)
- {
- dVal = validator.getMax().doubleValue();
- valueField.setText(formatDouble(eValue));
- }
+ dVal = Math.log(eValue) * sliderScaleFactor;
} catch (Exception e)
{
+ // shouldn't be possible here
+ valueField.setBackground(Color.yellow);
+ return Double.NaN;
}
-
if (validator.getMin() != null && validator.getMax() != null)
{
+ double scaleMin = Math.log(validator.getMin().doubleValue())
+ * sliderScaleFactor;
+ double scaleMax = Math.log(validator.getMax().doubleValue())
+ * sliderScaleFactor;
slider.getModel().setRangeProperties((int) (dVal), 1,
- (int) (validator.getMin().doubleValue()),
- 1 + (int) (validator.getMax().doubleValue()), true);
+ (int) scaleMin, 1 + (int) scaleMax, true);
}
else
{
}
return new Double(dVal);
}
+
+ float fVal = 0f;
+ try
+ {
+ fVal = Float.valueOf(valueField.getText());
+ } catch (Exception e)
+ {
+ return Float.valueOf(0f); // shouldn't happen
+ }
+ if (validator.getMin() != null && validator.getMax() != null)
+ {
+ float scaleMin = validator.getMin().floatValue()
+ * sliderScaleFactor;
+ float scaleMax = validator.getMax().floatValue()
+ * sliderScaleFactor;
+ slider.getModel().setRangeProperties(
+ (int) (fVal * sliderScaleFactor), 1, (int) scaleMin,
+ 1 + (int) scaleMax, true);
+ }
else
{
- float fVal = 0f;
- try
- {
- valueField.setText(valueField.getText().trim());
- fVal = Float.valueOf(valueField.getText());
-
- /*
- * ensure not outside min-max range
- * TODO: provide some visual indicator if limit reached
- */
- if (validator.getMin() != null
- && validator.getMin().floatValue() > fVal)
- {
- fVal = validator.getMin().floatValue();
- valueField.setText(String.valueOf(fVal));
- }
- if (validator.getMax() != null
- && validator.getMax().floatValue() < fVal)
- {
- fVal = validator.getMax().floatValue();
- valueField.setText(String.valueOf(fVal));
- }
- } catch (Exception e)
- {
- }
-
- if (validator.getMin() != null && validator.getMax() != null)
- {
- 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);
+ slider.setVisible(false);
}
+ return new Float(fVal);
}
}