import jalview.api.AlignViewportI;
import jalview.api.AlignmentViewPanel;
import jalview.api.FeatureColourI;
-import jalview.bin.Cache;
+import jalview.bin.Console;
import jalview.datamodel.GraphLine;
import jalview.datamodel.features.FeatureAttributes;
import jalview.datamodel.features.FeatureAttributes.Datatype;
import java.awt.event.ItemListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
+import java.math.BigDecimal;
+import java.math.MathContext;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
-import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
*/
public class FeatureTypeSettings extends JalviewDialog
{
+ private final static MathContext FOUR_SIG_FIG = new MathContext(4);
+
private final static String LABEL_18N = MessageManager
.getString("label.label");
private float max;
/*
- * scale factor for conversion between absolute min-max and slider
- */
- float scaleFactor;
-
- /*
* radio button group, to select what to colour by:
* simple colour, by category (text), or graduated
*/
JRadioButton graduatedColour = new JRadioButton();
JPanel coloursPanel;
-
+
JPanel filtersPanel;
JPanel singleColour = new JPanel();
private JComboBox<Object> threshold = new JComboBox<>();
- JSlider slider = new JSlider();
+ private Slider slider;
JTextField thresholdValue = new JTextField(20);
private JPanel chooseFiltersPanel;
+ public boolean originalDisplay;
+
/**
* Constructor
*
* @param frender
* @param theType
+ * @param last
+ * - visibility of feature prior to adjustment
*/
- public FeatureTypeSettings(FeatureRenderer frender, String theType)
+ public FeatureTypeSettings(FeatureRenderer frender, String theType,
+ boolean last)
{
this.fr = frender;
this.featureType = theType;
ap = fr.ap;
originalFilter = fr.getFeatureFilter(theType);
originalColour = fr.getFeatureColours().get(theType);
-
+ originalDisplay = last;
adjusting = true;
-
+
try
{
initialise();
ex.printStackTrace();
return;
}
-
+
updateColoursPanel();
-
+
updateFiltersPanel();
-
+
adjusting = false;
-
+
colourChanged(false);
-
+
String title = MessageManager
.formatMessage("label.display_settings_for", new String[]
{ theType });
}
/**
- * Configures the widgets on the Colours panel according to the current feature
- * colour scheme
+ * Configures the widgets on the Colours panel according to the current
+ * feature colour scheme
*/
private void updateColoursPanel()
{
* update min-max scaling if there is a range to work with,
* else disable the widgets (this shouldn't happen if only
* valid options are offered in the combo box)
+ * offset slider to have only non-negative values if necessary (JAL-2983)
*/
- scaleFactor = (max == min) ? 1f : 100f / (max - min);
- float range = (max - min) * scaleFactor;
- slider.setMinimum((int) (min * scaleFactor));
- slider.setMaximum((int) (max * scaleFactor));
- slider.setMajorTickSpacing((int) (range / 10f));
+ slider.setSliderModel(min, max, min);
+ slider.setMajorTickSpacing(
+ (int) ((slider.getMaximum() - slider.getMinimum()) / 10f));
threshline = new GraphLine((max - min) / 2f, "Threshold",
Color.black);
fc.isAboveThreshold() ? ABOVE_THRESHOLD_OPTION
: BELOW_THRESHOLD_OPTION);
slider.setEnabled(true);
- slider.setValue((int) (fc.getThreshold() * scaleFactor));
- thresholdValue.setText(String.valueOf(fc.getThreshold()));
+ slider.setSliderValue(fc.getThreshold());
+ setThresholdValueText(fc.getThreshold());
thresholdValue.setEnabled(true);
thresholdIsMin.setEnabled(true);
}
{
if (minColour.isEnabled())
{
- String ttl = MessageManager.getString("label.select_colour_minimum_value");
+ String ttl = MessageManager
+ .getString("label.select_colour_minimum_value");
showColourChooser(minColour, ttl);
}
}
{
if (maxColour.isEnabled())
{
- String ttl = MessageManager.getString("label.select_colour_maximum_value");
+ String ttl = MessageManager
+ .getString("label.select_colour_maximum_value");
showColourChooser(maxColour, ttl);
}
}
thresholdValue_actionPerformed();
}
});
+ slider = new Slider(0f, 100f, 50f);
slider.setPaintLabels(false);
slider.setPaintTicks(true);
slider.setBackground(Color.white);
{
if (!adjusting)
{
- thresholdValue
- .setText(String.valueOf(slider.getValue() / scaleFactor));
+ setThresholdValueText(slider.getSliderValue());
thresholdValue.setBackground(Color.white); // to reset red for invalid
sliderValueChanged();
}
// }
// else
// {
- singleColour.setBackground(originalColour.getColour());
- singleColour.setForeground(originalColour.getColour());
+ singleColour.setBackground(originalColour.getColour());
+ singleColour.setForeground(originalColour.getColour());
// }
singleColour.addMouseListener(new MouseAdapter()
{
{
if (simpleColour.isSelected())
{
- String ttl = MessageManager.formatMessage("label.select_colour_for", featureType);
+ String ttl = MessageManager
+ .formatMessage("label.select_colour_for", featureType);
showColourChooser(singleColour, ttl);
}
}
colourChanged(true);
}
};
- JalviewColourChooser.showColourChooser(this, title,
- colourPanel.getBackground(), listener);
+ JalviewColourChooser.showColourChooser(this, title,
+ colourPanel.getBackground(), listener);
}
/**
{
fr.setColour(featureType, originalColour);
fr.setFeatureFilter(featureType, originalFilter);
+ if (!originalDisplay)
+ {
+ fr.getFeaturesDisplayed().setHidden(featureType);
+ }
refreshDisplay(true);
}
*/
adjusting = true;
float f = Float.parseFloat(thresholdValue.getText());
- f = Float.max(f, this.min);
+ f = Float.max(f, this.min);
f = Float.min(f, this.max);
- thresholdValue.setText(String.valueOf(f));
- slider.setValue((int) (f * scaleFactor));
+ setThresholdValueText(f);
+ slider.setSliderValue(f);
threshline.value = f;
thresholdValue.setBackground(Color.white); // ok
adjusting = false;
}
/**
+ * Sets the text field for threshold value, rounded to four significant
+ * figures
+ *
+ * @param f
+ */
+ void setThresholdValueText(float f)
+ {
+ BigDecimal formatted = new BigDecimal(f).round(FOUR_SIG_FIG)
+ .stripTrailingZeros();
+ thresholdValue.setText(formatted.toPlainString());
+ }
+
+ /**
* Action on change of threshold slider value. This may be done interactively
* (by moving the slider), or programmatically (to update the slider after
* manual input of a threshold value).
*/
protected void sliderValueChanged()
{
- threshline.value = getRoundedSliderValue();
+ threshline.value = slider.getSliderValue();
/*
* repaint alignment, but not Overview or structure,
colourChanged(false);
}
- /**
- * Converts the slider value to its absolute value by dividing by the
- * scaleFactor. Rounding errors are squashed by forcing min/max of slider
- * range to the actual min/max of feature score range
- *
- * @return
- */
- private float getRoundedSliderValue()
- {
- int value = slider.getValue();
- float f = value == slider.getMaximum() ? max
- : (value == slider.getMinimum() ? min : value / scaleFactor);
- return f;
- }
-
void addActionListener(ActionListener listener)
{
if (featureSettings != null)
{
- System.err.println(
+ jalview.bin.Console.errPrintln(
"IMPLEMENTATION ISSUE: overwriting action listener for FeatureColourChooser");
}
featureSettings = listener;
List<Object> displayAttsObjects = new ArrayList<>(displayAtts);
JComboBox<Object> attCombo = JvSwingUtils
.buildComboWithTooltips(displayAttsObjects, tooltips);
-
+
return attCombo;
}
attName = (String) attCombo.getSelectedItem();
} catch (Exception e)
{
- Cache.log.error("Problem casting Combo box entry to String");
+ Console.error("Problem casting Combo box entry to String");
attName = attCombo.getSelectedItem().toString();
}
Condition cond = (Condition) condCombo.getSelectedItem();