X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FFeatureTypeSettings.java;h=1ba24b5d1a5e0d8444354155aee03a5de8fe8f4d;hb=2bdebf83bfd259c937afb4c30ca8d06d1bd5e6f9;hp=c3567315ab2564ad590d06ae805777f972a527a4;hpb=b320470d1ddb95476d3678477b72f6f791a51404;p=jalview.git diff --git a/src/jalview/gui/FeatureTypeSettings.java b/src/jalview/gui/FeatureTypeSettings.java index c356731..1ba24b5 100644 --- a/src/jalview/gui/FeatureTypeSettings.java +++ b/src/jalview/gui/FeatureTypeSettings.java @@ -29,6 +29,7 @@ import jalview.datamodel.features.FeatureMatcher; import jalview.datamodel.features.FeatureMatcherI; import jalview.datamodel.features.FeatureMatcherSet; import jalview.datamodel.features.FeatureMatcherSetI; +import jalview.gui.JalviewColourChooser.ColourChooserListener; import jalview.schemes.FeatureColour; import jalview.util.ColorUtils; import jalview.util.MessageManager; @@ -56,19 +57,15 @@ import javax.swing.BoxLayout; import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JCheckBox; -import javax.swing.JColorChooser; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JSlider; -import javax.swing.JTabbedPane; import javax.swing.JTextField; -import javax.swing.SwingConstants; import javax.swing.border.LineBorder; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; -import javax.swing.plaf.basic.BasicArrowButton; /** * A dialog where the user can configure colour scheme, and any filters, for one @@ -107,14 +104,15 @@ public class FeatureTypeSettings extends JalviewDialog /* * FeatureRenderer holds colour scheme and filters for feature types */ - private final FeatureRenderer fr; // todo refactor to allow interface type here + private final FeatureRenderer fr; // todo refactor to allow interface type + // here /* * the view panel to update when settings change */ - private final AlignmentViewPanel ap; + final AlignmentViewPanel ap; - private final String featureType; + final String featureType; /* * the colour and filters to reset to on Cancel @@ -127,7 +125,7 @@ public class FeatureTypeSettings extends JalviewDialog * set flag to true when setting values programmatically, * to avoid invocation of action handlers */ - private boolean adjusting = false; + boolean adjusting = false; /* * minimum of the value range for graduated colour @@ -143,29 +141,33 @@ public class FeatureTypeSettings extends JalviewDialog /* * scale factor for conversion between absolute min-max and slider */ - private float scaleFactor; + float scaleFactor; /* * radio button group, to select what to colour by: * simple colour, by category (text), or graduated */ - private JRadioButton simpleColour = new JRadioButton(); + JRadioButton simpleColour = new JRadioButton(); - private JRadioButton byCategory = new JRadioButton(); + JRadioButton byCategory = new JRadioButton(); - private JRadioButton graduatedColour = new JRadioButton(); + JRadioButton graduatedColour = new JRadioButton(); - private JPanel singleColour = new JPanel(); + JPanel coloursPanel; + + JPanel filtersPanel; - private JPanel minColour = new JPanel(); + JPanel singleColour = new JPanel(); - private JPanel maxColour = new JPanel(); + JPanel minColour = new JPanel(); + + JPanel maxColour = new JPanel(); private JComboBox threshold = new JComboBox<>(); - private JSlider slider = new JSlider(); + JSlider slider = new JSlider(); - private JTextField thresholdValue = new JTextField(20); + JTextField thresholdValue = new JTextField(20); private JCheckBox thresholdIsMin = new JCheckBox(); @@ -197,15 +199,10 @@ public class FeatureTypeSettings extends JalviewDialog /* * filters for the currently selected feature type */ - private List filters; - - // set white normally, black to debug layout - private Color debugBorderColour = Color.white; + List filters; private JPanel chooseFiltersPanel; - private JTabbedPane tabbedPane; - /** * Constructor * @@ -214,28 +211,14 @@ public class FeatureTypeSettings extends JalviewDialog */ public FeatureTypeSettings(FeatureRenderer frender, String theType) { - this(frender, false, theType); - } - - /** - * Constructor, with option to make a blocking dialog (has to complete in the - * AWT event queue thread). Currently this option is always set to false. - * - * @param frender - * @param blocking - * @param theType - */ - FeatureTypeSettings(FeatureRenderer frender, boolean blocking, - String theType) - { this.fr = frender; this.featureType = theType; ap = fr.ap; originalFilter = fr.getFeatureFilter(theType); originalColour = fr.getFeatureColours().get(theType); - + adjusting = true; - + try { initialise(); @@ -244,28 +227,27 @@ public class FeatureTypeSettings extends JalviewDialog ex.printStackTrace(); return; } - - updateColoursTab(); - - updateFiltersTab(); - + + updateColoursPanel(); + + updateFiltersPanel(); + adjusting = false; - + colourChanged(false); - + String title = MessageManager .formatMessage("label.display_settings_for", new String[] { theType }); - initDialogFrame(this, true, blocking, title, 600, 360); - + initDialogFrame(this, true, false, title, 580, 500); waitForInput(); } /** - * Configures the widgets on the Colours tab according to the current feature + * Configures the widgets on the Colours panel according to the current feature * colour scheme */ - private void updateColoursTab() + private void updateColoursPanel() { FeatureColourI fc = fr.getFeatureColours().get(featureType); @@ -280,9 +262,9 @@ public class FeatureTypeSettings extends JalviewDialog */ if (fc.isSimpleColour()) { - simpleColour.setSelected(true); singleColour.setBackground(fc.getColour()); singleColour.setForeground(fc.getColour()); + simpleColour.setSelected(true); } /* @@ -295,8 +277,8 @@ public class FeatureTypeSettings extends JalviewDialog if (fc.isColourByAttribute()) { String[] attributeName = fc.getAttributeName(); - colourByTextCombo - .setSelectedItem(toAttributeDisplayName(attributeName)); + colourByTextCombo.setSelectedItem( + FeatureMatcher.toAttributeDisplayName(attributeName)); } else { @@ -325,6 +307,7 @@ public class FeatureTypeSettings extends JalviewDialog * Graduated colour, by score or attribute value range */ graduatedColour.setSelected(true); + updateColourMinMax(); // ensure min, max are set colourByRangeCombo.setEnabled(colourByRangeCombo.getItemCount() > 1); minColour.setEnabled(true); maxColour.setEnabled(true); @@ -336,8 +319,8 @@ public class FeatureTypeSettings extends JalviewDialog if (fc.isColourByAttribute()) { String[] attributeName = fc.getAttributeName(); - colourByRangeCombo - .setSelectedItem(toAttributeDisplayName(attributeName)); + colourByRangeCombo.setSelectedItem( + FeatureMatcher.toAttributeDisplayName(attributeName)); } else { @@ -402,8 +385,6 @@ public class FeatureTypeSettings extends JalviewDialog private void initialise() { this.setLayout(new BorderLayout()); - tabbedPane = new JTabbedPane(); - this.add(tabbedPane, BorderLayout.CENTER); /* * an ActionListener that applies colour changes @@ -418,18 +399,16 @@ public class FeatureTypeSettings extends JalviewDialog }; /* - * first tab: colour options + * first panel: colour options */ JPanel coloursPanel = initialiseColoursPanel(); - tabbedPane.addTab(MessageManager.getString("action.colour"), - coloursPanel); + this.add(coloursPanel, BorderLayout.NORTH); /* - * second tab: filter options + * second panel: filter options */ JPanel filtersPanel = initialiseFiltersPanel(); - tabbedPane.addTab(MessageManager.getString("label.filters"), - filtersPanel); + this.add(filtersPanel, BorderLayout.CENTER); JPanel okCancelPanel = initialiseOkCancelPanel(); @@ -478,7 +457,7 @@ public class FeatureTypeSettings extends JalviewDialog { // colour by attribute range minMax = FeatureAttributes.getInstance().getMinMax(featureType, - fromAttributeDisplayName(attName)); + FeatureMatcher.fromAttributeDisplayName(attName)); } return minMax; } @@ -506,6 +485,7 @@ public class FeatureTypeSettings extends JalviewDialog graduatedColour = new JRadioButton( MessageManager.getString("label.by_range_of") + COLON); graduatedColour.setPreferredSize(new Dimension(RADIO_WIDTH, 20)); + graduatedColour.setOpaque(false); graduatedColour.addItemListener(new ItemListener() { @Override @@ -557,7 +537,8 @@ public class FeatureTypeSettings extends JalviewDialog { if (minColour.isEnabled()) { - showColourChooser(minColour, "label.select_colour_minimum_value"); + String ttl = MessageManager.getString("label.select_colour_minimum_value"); + showColourChooser(minColour, ttl); } } }); @@ -573,19 +554,19 @@ public class FeatureTypeSettings extends JalviewDialog { if (maxColour.isEnabled()) { - showColourChooser(maxColour, "label.select_colour_maximum_value"); + String ttl = MessageManager.getString("label.select_colour_maximum_value"); + showColourChooser(maxColour, ttl); } } }); maxColour.setBorder(new LineBorder(Color.black)); /* - * default max colour to current colour (if a plain colour), - * or to Black if colour by label; make min colour a pale - * version of max colour + * default max colour to last plain colour; + * make min colour a pale version of max colour */ FeatureColourI fc = fr.getFeatureColours().get(featureType); - Color bg = fc.isSimpleColour() ? fc.getColour() : Color.BLACK; + Color bg = fc.getColour() == null ? Color.BLACK : fc.getColour(); maxColour.setBackground(bg); minColour.setBackground(ColorUtils.bleachColour(bg, 0.9f)); @@ -735,20 +716,22 @@ public class FeatureTypeSettings extends JalviewDialog private JPanel initialiseColoursPanel() { JPanel colourByPanel = new JPanel(); + colourByPanel.setBackground(Color.white); colourByPanel.setLayout(new BoxLayout(colourByPanel, BoxLayout.Y_AXIS)); + JvSwingUtils.createTitledBorder(colourByPanel, + MessageManager.getString("action.colour"), true); /* * simple colour radio button and colour picker */ JPanel simpleColourPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); simpleColourPanel.setBackground(Color.white); - JvSwingUtils.createTitledBorder(simpleColourPanel, - MessageManager.getString("label.simple"), true); colourByPanel.add(simpleColourPanel); simpleColour = new JRadioButton( MessageManager.getString("label.simple_colour")); simpleColour.setPreferredSize(new Dimension(RADIO_WIDTH, 20)); + simpleColour.setOpaque(false); simpleColour.addItemListener(new ItemListener() { @Override @@ -756,15 +739,24 @@ public class FeatureTypeSettings extends JalviewDialog { if (simpleColour.isSelected() && !adjusting) { - showColourChooser(singleColour, "label.select_colour"); + colourChanged(true); } } - }); - + singleColour.setFont(JvSwingUtils.getLabelFont()); singleColour.setBorder(BorderFactory.createLineBorder(Color.black)); singleColour.setPreferredSize(new Dimension(40, 20)); + if (originalColour.isGraduatedColour()) + { + singleColour.setBackground(originalColour.getMaxColour()); + singleColour.setForeground(originalColour.getMaxColour()); + } + else + { + singleColour.setBackground(originalColour.getColour()); + singleColour.setForeground(originalColour.getColour()); + } singleColour.addMouseListener(new MouseAdapter() { @Override @@ -772,7 +764,8 @@ public class FeatureTypeSettings extends JalviewDialog { if (simpleColour.isSelected()) { - showColourChooser(singleColour, "label.select_colour"); + String ttl = MessageManager.formatMessage("label.select_colour_for", featureType); + showColourChooser(singleColour, ttl); } } }); @@ -790,6 +783,7 @@ public class FeatureTypeSettings extends JalviewDialog byCategory = new JRadioButton( MessageManager.getString("label.by_text_of") + COLON); byCategory.setPreferredSize(new Dimension(RADIO_WIDTH, 20)); + byCategory.setOpaque(false); byCategory.addItemListener(new ItemListener() { @Override @@ -834,23 +828,35 @@ public class FeatureTypeSettings extends JalviewDialog return colourByPanel; } - private void showColourChooser(JPanel colourPanel, String key) + /** + * Shows a colour chooser dialog, and if a selection is made, updates the + * colour of the given panel + * + * @param colourPanel + * the panel whose background colour is being picked + * @param title + */ + void showColourChooser(JPanel colourPanel, String title) { - Color col = JColorChooser.showDialog(this, - MessageManager.getString(key), colourPanel.getBackground()); - if (col != null) + ColourChooserListener listener = new ColourChooserListener() { - colourPanel.setBackground(col); - colourPanel.setForeground(col); - } - colourPanel.repaint(); - colourChanged(true); + @Override + public void colourSelected(Color col) + { + colourPanel.setBackground(col); + colourPanel.setForeground(col); + colourPanel.repaint(); + colourChanged(true); + } + }; + JalviewColourChooser.showColourChooser(this, title, + colourPanel.getBackground(), listener); } /** - * Constructs and sets the selected colour options as the colour for the feature - * type, and repaints the alignment, and optionally the Overview and/or - * structure viewer if open + * Constructs and sets the selected colour options as the colour for the + * feature type, and repaints the alignment, and optionally the Overview + * and/or structure viewer if open * * @param updateStructsAndOverview */ @@ -878,7 +884,7 @@ public class FeatureTypeSettings extends JalviewDialog fr.setColour(featureType, acg); ap.paintAlignment(updateStructsAndOverview, updateStructsAndOverview); - updateColoursTab(); + updateColoursPanel(); } /** @@ -901,13 +907,14 @@ public class FeatureTypeSettings extends JalviewDialog */ if (byCategory.isSelected()) { - Color c = this.getBackground(); - FeatureColourI fc = new FeatureColour(c, c, null, 0f, 0f); + Color c = singleColour.getBackground(); + FeatureColourI fc = new FeatureColour(c); fc.setColourByLabel(true); String byWhat = (String) colourByTextCombo.getSelectedItem(); if (!LABEL_18N.equals(byWhat)) { - fc.setAttributeName(fromAttributeDisplayName(byWhat)); + fc.setAttributeName( + FeatureMatcher.fromAttributeDisplayName(byWhat)); } return fc; } @@ -940,7 +947,7 @@ public class FeatureTypeSettings extends JalviewDialog */ float minValue = min; float maxValue = max; - final int thresholdOption = threshold.getSelectedIndex(); + int thresholdOption = threshold.getSelectedIndex(); if (thresholdIsMin.isSelected() && thresholdOption == ABOVE_THRESHOLD_OPTION) { @@ -964,7 +971,7 @@ public class FeatureTypeSettings extends JalviewDialog String byWhat = (String) colourByRangeCombo.getSelectedItem(); if (!SCORE_18N.equals(byWhat)) { - fc.setAttributeName(fromAttributeDisplayName(byWhat)); + fc.setAttributeName(FeatureMatcher.fromAttributeDisplayName(byWhat)); } /* @@ -989,30 +996,6 @@ public class FeatureTypeSettings extends JalviewDialog return fc; } - /** - * A helper method that converts a 'compound' attribute name from its display - * form, e.g. CSQ:PolyPhen to array form, e.g. { "CSQ", "PolyPhen" } - * - * @param attribute - * @return - */ - private String[] fromAttributeDisplayName(String attribute) - { - return attribute == null ? null : attribute.split(COLON); - } - - /** - * A helper method that converts a 'compound' attribute name to its display - * form, e.g. CSQ:PolyPhen from its array form, e.g. { "CSQ", "PolyPhen" } - * - * @param attName - * @return - */ - private String toAttributeDisplayName(String[] attName) - { - return attName == null ? "" : String.join(COLON, attName); - } - @Override protected void raiseClosed() { @@ -1087,8 +1070,8 @@ public class FeatureTypeSettings extends JalviewDialog /** * 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 + * scaleFactor. Rounding errors are squashed by forcing min/max of slider + * range to the actual min/max of feature score range * * @return */ @@ -1111,11 +1094,11 @@ public class FeatureTypeSettings extends JalviewDialog } /** - * A helper method to build the drop-down choice of attributes for a feature. If - * 'withRange' is true, then Score, and any attributes with a min-max range, are - * added. If 'withText' is true, Label and any known attributes are added. This - * allows 'categorical numerical' attributes e.g. codon position to be coloured - * by text. + * A helper method to build the drop-down choice of attributes for a feature. + * If 'withRange' is true, then Score, and any attributes with a min-max + * range, are added. If 'withText' is true, Label and any known attributes are + * added. This allows 'categorical numerical' attributes e.g. codon position + * to be coloured by text. *

* Where metadata is available with a description for an attribute, that is * added as a tooltip. @@ -1159,7 +1142,7 @@ public class FeatureTypeSettings extends JalviewDialog { continue; } - displayAtts.add(toAttributeDisplayName(attName)); + displayAtts.add(FeatureMatcher.toAttributeDisplayName(attName)); String desc = fa.getDescription(featureType, attName); if (desc != null && desc.length() > MAX_TOOLTIP_LENGTH) { @@ -1210,9 +1193,10 @@ public class FeatureTypeSettings extends JalviewDialog { JPanel andOrPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); andOrPanel.setBackground(Color.white); - andOrPanel.setBorder(BorderFactory.createLineBorder(debugBorderColour)); andFilters = new JRadioButton(MessageManager.getString("label.and")); orFilters = new JRadioButton(MessageManager.getString("label.or")); + andFilters.setOpaque(false); + orFilters.setOpaque(false); ActionListener actionListener = new ActionListener() { @Override @@ -1240,7 +1224,7 @@ public class FeatureTypeSettings extends JalviewDialog * for adding a condition. This should be called after a filter has been * removed, added or amended. */ - private void updateFiltersTab() + private void updateFiltersPanel() { /* * clear the panel and list of filter conditions @@ -1264,7 +1248,12 @@ public class FeatureTypeSettings extends JalviewDialog { orFilters.setSelected(true); } - featureFilters.getMatchers().forEach(matcher -> filters.add(matcher)); + // avoid use of lambda expression to keep SwingJS happy + // featureFilters.getMatchers().forEach(item -> filters.add(item)); + for (FeatureMatcherI matcher : featureFilters.getMatchers()) + { + filters.add(matcher); + } } /* @@ -1293,7 +1282,6 @@ public class FeatureTypeSettings extends JalviewDialog for (FeatureMatcherI filter : filters) { JPanel row = addFilter(filter, attNames, filterIndex); - row.setBorder(BorderFactory.createLineBorder(debugBorderColour)); chooseFiltersPanel.add(row); filterIndex++; } @@ -1305,7 +1293,8 @@ public class FeatureTypeSettings extends JalviewDialog /** * A helper method that constructs a row (panel) with one filter condition: *

    - *
  • a drop-down list of Label, Score and attribute names to choose from
  • + *
  • a drop-down list of Label, Score and attribute names to choose + * from
  • *
  • a drop-down list of conditions to choose from
  • *
  • a text field for input of a match pattern
  • *
  • optionally, a 'remove' button
  • @@ -1342,8 +1331,8 @@ public class FeatureTypeSettings extends JalviewDialog * drop-down choice of attribute, with description as a tooltip * if we can obtain it */ - final JComboBox attCombo = populateAttributesDropdown(attNames, - true, true); + JComboBox attCombo = populateAttributesDropdown(attNames, true, + true); String filterBy = setSelectedAttribute(attCombo, filter); JComboBox condCombo = new JComboBox<>(); @@ -1383,7 +1372,8 @@ public class FeatureTypeSettings extends JalviewDialog } else { - attCombo.setSelectedItem(toAttributeDisplayName(attName)); + attCombo.setSelectedItem( + FeatureMatcher.toAttributeDisplayName(attName)); } attCombo.addItemListener(new ItemListener() { @@ -1429,16 +1419,13 @@ public class FeatureTypeSettings extends JalviewDialog * disable pattern field for condition 'Present / NotPresent' */ Condition selectedCondition = (Condition) condCombo.getSelectedItem(); - if (!selectedCondition.needsAPattern()) - { - patternField.setEnabled(false); - } + patternField.setEnabled(selectedCondition.needsAPattern()); /* * if a numeric condition is selected, show the value range * as a tooltip on the value input field */ - setPatternTooltip(filterBy, selectedCondition, patternField); + setNumericHints(filterBy, selectedCondition, patternField); /* * add remove button if filter is populated (non-empty pattern) @@ -1446,8 +1433,8 @@ public class FeatureTypeSettings extends JalviewDialog if (!patternField.isEnabled() || (pattern != null && pattern.trim().length() > 0)) { - // todo: gif for button drawing '-' or 'x' - JButton removeCondition = new BasicArrowButton(SwingConstants.WEST); + JButton removeCondition = new JButton("\u2717"); // Dingbats cursive x + removeCondition.setPreferredSize(new Dimension(23, 17)); removeCondition .setToolTipText(MessageManager.getString("label.delete_row")); removeCondition.addActionListener(new ActionListener() @@ -1486,22 +1473,27 @@ public class FeatureTypeSettings extends JalviewDialog } else { - item = toAttributeDisplayName(filter.getAttribute()); + item = FeatureMatcher.toAttributeDisplayName(filter.getAttribute()); } attCombo.setSelectedItem(item); return item; } /** - * If a numeric comparison condition is selected, retrieve the min-max range for - * the value (score or attribute), and set it as a tooltip on the value file + * If a numeric comparison condition is selected, retrieves the min-max range + * for the value (score or attribute), and sets it as a tooltip on the value + * field. If the field is currently empty, then pre-populates it with + *
      + *
    • the minimum value, if condition is > or >=
    • + *
    • the maximum value, if condition is < or <=
    • + *
    * * @param attName * @param selectedCondition * @param patternField */ - private void setPatternTooltip(String attName, - Condition selectedCondition, JTextField patternField) + private void setNumericHints(String attName, Condition selectedCondition, + JTextField patternField) { patternField.setToolTipText(""); @@ -1510,30 +1502,47 @@ public class FeatureTypeSettings extends JalviewDialog float[] minMax = getMinMax(attName); if (minMax != null) { - String tip = String.format("(%s - %s)", - DECFMT_2_2.format(minMax[0]), DECFMT_2_2.format(minMax[1])); + String minFormatted = DECFMT_2_2.format(minMax[0]); + String maxFormatted = DECFMT_2_2.format(minMax[1]); + String tip = String.format("(%s - %s)", minFormatted, maxFormatted); patternField.setToolTipText(tip); + if (patternField.getText().isEmpty()) + { + if (selectedCondition == Condition.GE + || selectedCondition == Condition.GT) + { + patternField.setText(minFormatted); + } + else + { + if (selectedCondition == Condition.LE + || selectedCondition == Condition.LT) + { + patternField.setText(maxFormatted); + } + } + } } } } /** - * Populates the drop-down list of comparison conditions for the given attribute - * name. The conditions added depend on the datatype of the attribute values. - * The supplied condition is set as the selected item in the list, provided it - * is in the list. If the pattern is now invalid (non-numeric pattern for a - * numeric condition), it is cleared. + * Populates the drop-down list of comparison conditions for the given + * attribute name. The conditions added depend on the datatype of the + * attribute values. The supplied condition is set as the selected item in the + * list, provided it is in the list. If the pattern is now invalid + * (non-numeric pattern for a numeric condition), it is cleared. * * @param attName * @param cond * @param condCombo * @param patternField */ - private void populateConditions(String attName, Condition cond, + void populateConditions(String attName, Condition cond, JComboBox condCombo, JTextField patternField) { Datatype type = FeatureAttributes.getInstance().getDatatype(featureType, - fromAttributeDisplayName(attName)); + FeatureMatcher.fromAttributeDisplayName(attName)); if (LABEL_18N.equals(attName)) { type = Datatype.Character; @@ -1549,10 +1558,11 @@ public class FeatureTypeSettings extends JalviewDialog ItemListener listener = condCombo.getItemListeners()[0]; condCombo.removeItemListener(listener); boolean condIsValid = false; + condCombo.removeAllItems(); for (Condition c : Condition.values()) { - if ((c.isNumeric() && type != Datatype.Character) + if ((c.isNumeric() && type == Datatype.Number) || (!c.isNumeric() && type != Datatype.Number)) { condCombo.addItem(c); @@ -1575,8 +1585,6 @@ public class FeatureTypeSettings extends JalviewDialog condCombo.setSelectedIndex(0); } - condCombo.addItemListener(listener); - /* * clear pattern if it is now invalid for condition */ @@ -1594,15 +1602,20 @@ public class FeatureTypeSettings extends JalviewDialog patternField.setText(""); } } + + /* + * restore the listener + */ + condCombo.addItemListener(listener); } /** - * Answers true unless a numeric condition has been selected with a non-numeric - * value. Sets the value field to RED with a tooltip if in error. + * Answers true unless a numeric condition has been selected with a + * non-numeric value. Sets the value field to RED with a tooltip if in error. *

    - * If the pattern is expected but is empty, this method returns false, but does - * not mark the field as invalid. This supports selecting an attribute for a new - * condition before a match pattern has been entered. + * If the pattern is expected but is empty, this method returns false, but + * does not mark the field as invalid. This supports selecting an attribute + * for a new condition before a match pattern has been entered. * * @param value * @param condCombo @@ -1648,14 +1661,15 @@ public class FeatureTypeSettings extends JalviewDialog /** * Constructs a filter condition from the given input fields, and replaces the - * condition at filterIndex with the new one. Does nothing if the pattern field - * is blank (unless the match condition is one that doesn't require a pattern, - * e.g. 'Is present'). Answers true if the filter was updated, else false. + * condition at filterIndex with the new one. Does nothing if the pattern + * field is blank (unless the match condition is one that doesn't require a + * pattern, e.g. 'Is present'). Answers true if the filter was updated, else + * false. *

    * This method may update the tooltip on the filter value field to show the - * value range, if a numeric condition is selected. This ensures the tooltip is - * updated when a numeric valued attribute is chosen on the last 'add a filter' - * row. + * value range, if a numeric condition is selected. This ensures the tooltip + * is updated when a numeric valued attribute is chosen on the last 'add a + * filter' row. * * @param attCombo * @param condCombo @@ -1670,10 +1684,11 @@ public class FeatureTypeSettings extends JalviewDialog Condition cond = (Condition) condCombo.getSelectedItem(); String pattern = valueField.getText().trim(); - setPatternTooltip(attName, cond, valueField); + setNumericHints(attName, cond, valueField); if (pattern.length() == 0 && cond.needsAPattern()) { + valueField.setEnabled(true); // ensure pattern field is enabled! return false; } @@ -1693,7 +1708,7 @@ public class FeatureTypeSettings extends JalviewDialog else { km = FeatureMatcher.byAttribute(cond, pattern, - fromAttributeDisplayName(attName)); + FeatureMatcher.fromAttributeDisplayName(attName)); } filters.set(filterIndex, km); @@ -1702,17 +1717,6 @@ public class FeatureTypeSettings extends JalviewDialog } /** - * Makes the dialog visible, at the Feature Colour tab or at the Filters tab - * - * @param coloursTab - */ - public void showTab(boolean coloursTab) - { - setVisible(true); - tabbedPane.setSelectedIndex(coloursTab ? 0 : 1); - } - - /** * Action on any change to feature filtering, namely *

      *
    • change of selected attribute
    • @@ -1720,8 +1724,8 @@ public class FeatureTypeSettings extends JalviewDialog *
    • change of match pattern
    • *
    • removal of a condition
    • *
    - * The inputs are parsed into a combined filter and this is set for the feature - * type, and the alignment redrawn. + * The inputs are parsed into a combined filter and this is set for the + * feature type, and the alignment redrawn. */ protected void filtersChanged() { @@ -1755,6 +1759,6 @@ public class FeatureTypeSettings extends JalviewDialog fr.setFeatureFilter(featureType, combined.isEmpty() ? null : combined); ap.paintAlignment(true, true); - updateFiltersTab(); + updateFiltersPanel(); } }