X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FFeatureTypeSettings.java;h=6eb583c5ba046f110e6364a271d148ef4f7f984e;hb=71b0134718413dd9179768fa51e26170684c2f2c;hp=835f1fcecde482f9ed752998153354a9f1daa392;hpb=ef14d83cfe8ca0bb2271d50d638516cdc90c2b8b;p=jalview.git diff --git a/src/jalview/gui/FeatureTypeSettings.java b/src/jalview/gui/FeatureTypeSettings.java index 835f1fc..6eb583c 100644 --- a/src/jalview/gui/FeatureTypeSettings.java +++ b/src/jalview/gui/FeatureTypeSettings.java @@ -38,7 +38,7 @@ import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; -import java.awt.LayoutManager; +import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusAdapter; @@ -79,6 +79,12 @@ import javax.swing.plaf.basic.BasicArrowButton; */ public class FeatureTypeSettings extends JalviewDialog { + private final static String LABEL_18N = MessageManager + .getString("label.label"); + + private final static String SCORE_18N = MessageManager + .getString("label.score"); + private static final int RADIO_WIDTH = 130; private static final String COLON = ":"; @@ -289,13 +295,12 @@ public class FeatureTypeSettings extends JalviewDialog if (fc.isColourByAttribute()) { String[] attributeName = fc.getAttributeName(); - colourByTextCombo - .setSelectedItem(toAttributeDisplayName(attributeName)); + colourByTextCombo.setSelectedItem( + FeatureMatcher.toAttributeDisplayName(attributeName)); } else { - colourByTextCombo - .setSelectedItem(MessageManager.getString("label.label")); + colourByTextCombo.setSelectedItem(LABEL_18N); } } else @@ -320,6 +325,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); @@ -331,13 +337,12 @@ public class FeatureTypeSettings extends JalviewDialog if (fc.isColourByAttribute()) { String[] attributeName = fc.getAttributeName(); - colourByRangeCombo - .setSelectedItem(toAttributeDisplayName(attributeName)); + colourByRangeCombo.setSelectedItem( + FeatureMatcher.toAttributeDisplayName(attributeName)); } else { - colourByRangeCombo - .setSelectedItem(MessageManager.getString("label.score")); + colourByRangeCombo.setSelectedItem(SCORE_18N); } Color noColour = fc.getNoColour(); if (noColour == null) @@ -444,8 +449,7 @@ public class FeatureTypeSettings extends JalviewDialog } String colourBy = (String) colourByRangeCombo.getSelectedItem(); - String[] attNames = fromAttributeDisplayName(colourBy); - float[] minMax = getMinMax(attNames); + float[] minMax = getMinMax(colourBy); if (minMax != null) { @@ -461,13 +465,13 @@ public class FeatureTypeSettings extends JalviewDialog *
  • else of the selected attribute
  • * * - * @param attNames + * @param attName * @return */ - private float[] getMinMax(String[] attNames) + private float[] getMinMax(String attName) { float[] minMax = null; - if (MessageManager.getString("label.score").equals(attNames[0])) + if (SCORE_18N.equals(attName)) { minMax = fr.getMinMax().get(featureType)[0]; } @@ -475,7 +479,7 @@ public class FeatureTypeSettings extends JalviewDialog { // colour by attribute range minMax = FeatureAttributes.getInstance().getMinMax(featureType, - attNames); + FeatureMatcher.fromAttributeDisplayName(attName)); } return minMax; } @@ -902,9 +906,10 @@ public class FeatureTypeSettings extends JalviewDialog FeatureColourI fc = new FeatureColour(c, c, null, 0f, 0f); fc.setColourByLabel(true); String byWhat = (String) colourByTextCombo.getSelectedItem(); - if (!MessageManager.getString("label.label").equals(byWhat)) + if (!LABEL_18N.equals(byWhat)) { - fc.setAttributeName(fromAttributeDisplayName(byWhat)); + fc.setAttributeName( + FeatureMatcher.fromAttributeDisplayName(byWhat)); } return fc; } @@ -959,9 +964,9 @@ public class FeatureTypeSettings extends JalviewDialog * set attribute to colour by if selected */ String byWhat = (String) colourByRangeCombo.getSelectedItem(); - if (!MessageManager.getString("label.score").equals(byWhat)) + if (!SCORE_18N.equals(byWhat)) { - fc.setAttributeName(fromAttributeDisplayName(byWhat)); + fc.setAttributeName(FeatureMatcher.fromAttributeDisplayName(byWhat)); } /* @@ -986,30 +991,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() { @@ -1134,7 +1115,7 @@ public class FeatureTypeSettings extends JalviewDialog if (withText) { - displayAtts.add(MessageManager.getString("label.label")); + displayAtts.add(LABEL_18N); tooltips.add(MessageManager.getString("label.description")); } if (withRange) @@ -1142,8 +1123,8 @@ public class FeatureTypeSettings extends JalviewDialog float[][] minMax = fr.getMinMax().get(featureType); if (minMax != null && minMax[0][0] != minMax[0][1]) { - displayAtts.add(MessageManager.getString("label.score")); - tooltips.add(MessageManager.getString("label.score")); + displayAtts.add(SCORE_18N); + tooltips.add(SCORE_18N); } } @@ -1156,7 +1137,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) { @@ -1188,11 +1169,11 @@ public class FeatureTypeSettings extends JalviewDialog filtersPanel.add(andOrPanel); /* - * panel with filters - populated by refreshFiltersDisplay + * panel with filters - populated by refreshFiltersDisplay, + * which also sets the layout manager */ chooseFiltersPanel = new JPanel(); - LayoutManager box = new BoxLayout(chooseFiltersPanel, BoxLayout.Y_AXIS); - chooseFiltersPanel.setLayout(box); + chooseFiltersPanel.setBackground(Color.white); filtersPanel.add(chooseFiltersPanel); return filtersPanel; @@ -1267,9 +1248,21 @@ public class FeatureTypeSettings extends JalviewDialog /* * and an empty filter for the user to populate (add) */ - FeatureMatcherI noFilter = FeatureMatcher.byLabel(Condition.values()[0], - ""); - filters.add(noFilter); + filters.add(FeatureMatcher.NULL_MATCHER); + + /* + * use GridLayout to 'justify' rows to the top of the panel, until + * there are too many to fit in, then fall back on BoxLayout + */ + if (filters.size() <= 5) + { + chooseFiltersPanel.setLayout(new GridLayout(5, 1)); + } + else + { + chooseFiltersPanel.setLayout( + new BoxLayout(chooseFiltersPanel, BoxLayout.Y_AXIS)); + } /* * render the conditions in rows, each in its own JPanel @@ -1277,11 +1270,7 @@ public class FeatureTypeSettings extends JalviewDialog int filterIndex = 0; for (FeatureMatcherI filter : filters) { - String[] attName = filter.getKey(); - Condition condition = filter.getMatcher().getCondition(); - String pattern = filter.getMatcher().getPattern(); - JPanel row = addFilter(attName, attNames, condition, pattern, - filterIndex); + JPanel row = addFilter(filter, attNames, filterIndex); row.setBorder(BorderFactory.createLineBorder(debugBorderColour)); chooseFiltersPanel.add(row); filterIndex++; @@ -1294,25 +1283,36 @@ public class FeatureTypeSettings extends JalviewDialog /** * A helper method that constructs a row (panel) with one filter condition: * - * If attribute, condition or pattern are not null, they are set as defaults for - * the input fields. The 'remove' button is added unless the pattern is null or - * empty (incomplete filter condition). + * The filter values are set as defaults for the input fields. The 'remove' + * button is added unless the pattern is empty (incomplete filter condition). + *

    + * Action handlers on these fields provide for + *

    * - * @param attName + * @param filter * @param attNames - * @param cond - * @param pattern * @param filterIndex * @return */ - protected JPanel addFilter(String[] attName, List attNames, - Condition cond, String pattern, int filterIndex) + protected JPanel addFilter(FeatureMatcherI filter, + List attNames, int filterIndex) { + String[] attName = filter.getAttribute(); + Condition cond = filter.getMatcher().getCondition(); + String pattern = filter.getMatcher().getPattern(); + JPanel filterRow = new JPanel(new FlowLayout(FlowLayout.LEFT)); filterRow.setBackground(Color.white); @@ -1322,8 +1322,12 @@ public class FeatureTypeSettings extends JalviewDialog */ final JComboBox attCombo = populateAttributesDropdown(attNames, true, true); + String filterBy = setSelectedAttribute(attCombo, filter); + JComboBox condCombo = new JComboBox<>(); + JTextField patternField = new JTextField(8); + patternField.setText(pattern); /* * action handlers that validate and (if valid) apply changes @@ -1351,13 +1355,14 @@ public class FeatureTypeSettings extends JalviewDialog } }; - if (attName == null) // the 'add a condition' row + if (filter == FeatureMatcher.NULL_MATCHER) // the 'add a condition' row { attCombo.setSelectedIndex(0); } else { - attCombo.setSelectedItem(toAttributeDisplayName(attName)); + attCombo.setSelectedItem( + FeatureMatcher.toAttributeDisplayName(attName)); } attCombo.addItemListener(new ItemListener() { @@ -1369,7 +1374,8 @@ public class FeatureTypeSettings extends JalviewDialog * ensure it is appropriate for the attribute datatype */ populateConditions((String) attCombo.getSelectedItem(), - (Condition) condCombo.getSelectedItem(), condCombo); + (Condition) condCombo.getSelectedItem(), condCombo, + patternField); actionListener.actionPerformed(null); } }); @@ -1379,8 +1385,7 @@ public class FeatureTypeSettings extends JalviewDialog /* * drop-down choice of test condition */ - populateConditions((String) attCombo.getSelectedItem(), cond, - condCombo); + populateConditions(filterBy, cond, condCombo, patternField); condCombo.setPreferredSize(new Dimension(150, 20)); condCombo.addItemListener(itemListener); filterRow.add(condCombo); @@ -1388,7 +1393,6 @@ public class FeatureTypeSettings extends JalviewDialog /* * pattern to match against */ - patternField.setText(pattern); patternField.addActionListener(actionListener); patternField.addFocusListener(new FocusAdapter() { @@ -1404,16 +1408,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 */ - updatePatternTooltip(attName, selectedCondition, patternField); + setPatternTooltip(filterBy, selectedCondition, patternField); /* * add remove button if filter is populated (non-empty pattern) @@ -1441,6 +1442,33 @@ public class FeatureTypeSettings extends JalviewDialog } /** + * Sets the selected item in the Label/Score/Attribute drop-down to match the + * filter + * + * @param attCombo + * @param filter + */ + private String setSelectedAttribute(JComboBox attCombo, + FeatureMatcherI filter) + { + String item = null; + if (filter.isByScore()) + { + item = SCORE_18N; + } + else if (filter.isByLabel()) + { + item = LABEL_18N; + } + else + { + 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 * @@ -1448,7 +1476,7 @@ public class FeatureTypeSettings extends JalviewDialog * @param selectedCondition * @param patternField */ - private void updatePatternTooltip(String[] attName, + private void setPatternTooltip(String attName, Condition selectedCondition, JTextField patternField) { patternField.setToolTipText(""); @@ -1469,22 +1497,24 @@ public class FeatureTypeSettings extends JalviewDialog * 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. + * 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, - JComboBox condCombo) + JComboBox condCombo, JTextField patternField) { Datatype type = FeatureAttributes.getInstance().getDatatype(featureType, - fromAttributeDisplayName(attName)); - if (MessageManager.getString("label.label").equals(attName)) + FeatureMatcher.fromAttributeDisplayName(attName)); + if (LABEL_18N.equals(attName)) { type = Datatype.Character; } - else if (MessageManager.getString("label.score").equals(attName)) + else if (SCORE_18N.equals(attName)) { type = Datatype.Number; } @@ -1522,6 +1552,24 @@ public class FeatureTypeSettings extends JalviewDialog } condCombo.addItemListener(listener); + + /* + * clear pattern if it is now invalid for condition + */ + if (((Condition) condCombo.getSelectedItem()).isNumeric()) + { + try + { + String pattern = patternField.getText().trim(); + if (pattern.length() > 0) + { + Float.valueOf(pattern); + } + } catch (NumberFormatException e) + { + patternField.setText(""); + } + } } /** @@ -1544,7 +1592,7 @@ public class FeatureTypeSettings extends JalviewDialog } Condition cond = (Condition) condCombo.getSelectedItem(); - if (cond.needsAPattern()) + if (!cond.needsAPattern()) { return true; } @@ -1598,11 +1646,11 @@ public class FeatureTypeSettings extends JalviewDialog Condition cond = (Condition) condCombo.getSelectedItem(); String pattern = valueField.getText().trim(); - updatePatternTooltip(fromAttributeDisplayName(attName), cond, - valueField); + setPatternTooltip(attName, cond, valueField); if (pattern.length() == 0 && cond.needsAPattern()) { + valueField.setEnabled(true); // ensure pattern field is enabled! return false; } @@ -1611,18 +1659,18 @@ public class FeatureTypeSettings extends JalviewDialog * or named attribute */ FeatureMatcherI km = null; - if (MessageManager.getString("label.label").equals(attName)) + if (LABEL_18N.equals(attName)) { km = FeatureMatcher.byLabel(cond, pattern); } - else if (MessageManager.getString("label.score").equals(attName)) + else if (SCORE_18N.equals(attName)) { km = FeatureMatcher.byScore(cond, pattern); } else { km = FeatureMatcher.byAttribute(cond, pattern, - fromAttributeDisplayName(attName)); + FeatureMatcher.fromAttributeDisplayName(attName)); } filters.set(filterIndex, km);