X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fjalview%2Fdatamodel%2FColumnSelection.java;h=3ccaab869730a770f4463eee8cb7242f136b43c1;hb=a83adb45bdf9554e270921b4baad94defd314b36;hp=4cdd7afb29332494f91728e96353b571f9fad5ac;hpb=163ed5b997bbda48e4cdd950e87a8fe01baae7fb;p=jalview.git diff --git a/src/jalview/datamodel/ColumnSelection.java b/src/jalview/datamodel/ColumnSelection.java index 4cdd7af..3ccaab8 100644 --- a/src/jalview/datamodel/ColumnSelection.java +++ b/src/jalview/datamodel/ColumnSelection.java @@ -27,6 +27,7 @@ import java.util.ArrayList; import java.util.BitSet; import java.util.Collections; import java.util.List; +import java.util.regex.PatternSyntaxException; /** * Data class holding the selected columns and hidden column ranges for a view. @@ -59,7 +60,7 @@ public class ColumnSelection */ IntList() { - order = new ArrayList(); + order = new ArrayList<>(); _uorder = Collections.unmodifiableList(order); selected = new BitSet(); } @@ -230,7 +231,7 @@ public class ColumnSelection */ List getRanges() { - List rlist = new ArrayList(); + List rlist = new ArrayList<>(); if (selected.isEmpty()) { return rlist; @@ -263,7 +264,7 @@ public class ColumnSelection } } - IntList selection = new IntList(); + private IntList selection = new IntList(); /** * Add a column to the selection @@ -401,7 +402,6 @@ public class ColumnSelection } - /** * Hides the specified column and any adjacent selected columns * @@ -444,10 +444,6 @@ public class ColumnSelection hidden.hideColumns(min, max); } - - - - /** * Copy constructor * @@ -468,11 +464,6 @@ public class ColumnSelection { } - - - - - /** * Invert the column selection from first to end-1. leaves hiddenColumns * untouched (and unselected) @@ -534,7 +525,6 @@ public class ColumnSelection } } - /** * * @return true if there are columns marked @@ -544,92 +534,109 @@ public class ColumnSelection return (selection != null && selection.size() > 0); } - - - public boolean filterAnnotations(Annotation[] annotations, + /** + * Selects columns where the given annotation matches the provided filter + * condition(s). Any existing column selections are first cleared. Answers the + * number of columns added. + * + * @param annotations + * @param filterParams + * @return + */ + public int filterAnnotations(Annotation[] annotations, AnnotationFilterParameter filterParams) { // JBPNote - this method needs to be refactored to become independent of // viewmodel package this.clear(); - int count = 0; + int addedCount = 0; + int column = 0; do { - if (annotations[count] != null) + Annotation ann = annotations[column]; + if (ann != null) { - - boolean itemMatched = false; - - if (filterParams.getThresholdType() == AnnotationFilterParameter.ThresholdType.ABOVE_THRESHOLD - && annotations[count].value >= filterParams - .getThresholdValue()) + boolean matched = false; + + /* + * filter may have multiple conditions - + * these are or'd until a match is found + */ + if (filterParams + .getThresholdType() == AnnotationFilterParameter.ThresholdType.ABOVE_THRESHOLD + && ann.value > filterParams.getThresholdValue()) { - itemMatched = true; + matched = true; } - if (filterParams.getThresholdType() == AnnotationFilterParameter.ThresholdType.BELOW_THRESHOLD - && annotations[count].value <= filterParams - .getThresholdValue()) + + if (!matched && filterParams + .getThresholdType() == AnnotationFilterParameter.ThresholdType.BELOW_THRESHOLD + && ann.value < filterParams.getThresholdValue()) { - itemMatched = true; + matched = true; } - if (filterParams.isFilterAlphaHelix() - && annotations[count].secondaryStructure == 'H') + if (!matched && filterParams.isFilterAlphaHelix() + && ann.secondaryStructure == 'H') { - itemMatched = true; + matched = true; } - if (filterParams.isFilterBetaSheet() - && annotations[count].secondaryStructure == 'E') + if (!matched && filterParams.isFilterBetaSheet() + && ann.secondaryStructure == 'E') { - itemMatched = true; + matched = true; } - if (filterParams.isFilterTurn() - && annotations[count].secondaryStructure == 'S') + if (!matched && filterParams.isFilterTurn() + && ann.secondaryStructure == 'S') { - itemMatched = true; + matched = true; } String regexSearchString = filterParams.getRegexString(); - if (regexSearchString != null - && !filterParams.getRegexSearchFields().isEmpty()) + if (!matched && regexSearchString != null) { List fields = filterParams .getRegexSearchFields(); - try + for (SearchableAnnotationField field : fields) { - if (fields.contains(SearchableAnnotationField.DISPLAY_STRING) - && annotations[count].displayCharacter - .matches(regexSearchString)) + String compareTo = field == SearchableAnnotationField.DISPLAY_STRING + ? ann.displayCharacter // match 'Label' + : ann.description; // and/or 'Description' + if (compareTo != null) { - itemMatched = true; - } - } catch (java.util.regex.PatternSyntaxException pse) - { - if (annotations[count].displayCharacter - .equals(regexSearchString)) - { - itemMatched = true; + try + { + if (compareTo.matches(regexSearchString)) + { + matched = true; + } + } catch (PatternSyntaxException pse) + { + if (compareTo.equals(regexSearchString)) + { + matched = true; + } + } + if (matched) + { + break; + } } } - if (fields.contains(SearchableAnnotationField.DESCRIPTION) - && annotations[count].description != null - && annotations[count].description - .matches(regexSearchString)) - { - itemMatched = true; - } } - if (itemMatched) + if (matched) { - this.addElement(count); + this.addElement(column); + addedCount++; } } - count++; - } while (count < annotations.length); - return false; + column++; + } while (column < annotations.length); + + return addedCount; } /** @@ -691,8 +698,8 @@ public class ColumnSelection * * @return */ - public boolean markColumns(BitSet markedColumns, int startCol, - int endCol, boolean invert, boolean extendCurrent, boolean toggle) + public boolean markColumns(BitSet markedColumns, int startCol, int endCol, + boolean invert, boolean extendCurrent, boolean toggle) { boolean changed = false; if (!extendCurrent && !toggle)