X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fviewmodel%2Fseqfeatures%2FFeatureRendererModel.java;h=68345b9fd7bc9b08f0dd3230b0d0c38f79f44a48;hb=60c6ea6da3878e1807c961046296f578605bcf39;hp=2a17bf203587aeaab09b46e5a8a22316aaebe7ce;hpb=74393b51f368cb9f58589472d432a433d9c4386d;p=jalview.git diff --git a/src/jalview/viewmodel/seqfeatures/FeatureRendererModel.java b/src/jalview/viewmodel/seqfeatures/FeatureRendererModel.java index 2a17bf2..68345b9 100644 --- a/src/jalview/viewmodel/seqfeatures/FeatureRendererModel.java +++ b/src/jalview/viewmodel/seqfeatures/FeatureRendererModel.java @@ -20,6 +20,21 @@ */ package jalview.viewmodel.seqfeatures; +import java.awt.Color; +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Hashtable; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + import jalview.api.AlignViewportI; import jalview.api.FeatureColourI; import jalview.api.FeaturesDisplayedI; @@ -37,20 +52,7 @@ import jalview.datamodel.features.SequenceFeatures; import jalview.renderer.seqfeatures.FeatureRenderer; import jalview.schemes.FeatureColour; import jalview.util.ColorUtils; - -import java.awt.Color; -import java.beans.PropertyChangeListener; -import java.beans.PropertyChangeSupport; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Hashtable; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; +import jalview.util.Platform; public abstract class FeatureRendererModel implements jalview.api.FeatureRenderer @@ -618,7 +620,7 @@ public abstract class FeatureRendererModel * @param type * @return */ - protected boolean showFeatureOfType(String type) + public boolean showFeatureOfType(String type) { return type == null ? false : (av.getFeaturesDisplayed() == null ? true : av.getFeaturesDisplayed().isVisible(type)); @@ -1045,6 +1047,14 @@ public abstract class FeatureRendererModel public void filterFeaturesForDisplay(List features) { /* + * fudge: JalviewJS's IntervalStore lacks the sort method called :-( + */ + if (Platform.isJS()) + { + return; + } + + /* * don't remove 'redundant' features if * - transparency is applied (feature count affects depth of feature colour) * - filters are applied (not all features may be displayable) @@ -1120,7 +1130,7 @@ public abstract class FeatureRendererModel /** * Answers the colour for the feature, or null if the feature is excluded by * feature group visibility, by filters, or by colour threshold settings. This - * method does not take feature visibility into account. + * method does not take feature type visibility into account. * * @param sf * @param fc @@ -1162,16 +1172,33 @@ public abstract class FeatureRendererModel } /** - * Answers a bean containing a mapping, and a list of features in this - * alignment at a position (or range) which is mappable from the given - * sequence residue position in a mapped alignment. Features are returned in - * render order of feature type (on top last), with order within feature type - * undefined. If no features or mapping are found, answers null. + * Answers true unless the specified group is set to hidden. Defaults to true + * if group visibility is not set. * - * @param sequence - * @param pos + * @param group * @return */ + public boolean isGroupVisible(String group) + { + if (!featureGroups.containsKey(group)) + { + return true; + } + return featureGroups.get(group); + } + + /** + * Orders features in render precedence (last in order is last to render, so + * displayed on top of other features) + * + * @param order + */ + public void orderFeatures(Comparator order) + { + Arrays.sort(renderOrder, order); + } + + @Override public MappedFeatures findComplementFeaturesAtResidue(SequenceI sequence, int pos) { @@ -1187,6 +1214,16 @@ public abstract class FeatureRendererModel .getCodonFrame(sequence); /* + * fudge: if no mapping found, check the complementary alignment + * todo: only store in one place? StructureSelectionManager? + */ + if (mappings.isEmpty()) + { + mappings = this.av.getCodingComplement().getAlignment() + .getCodonFrame(sequence); + } + + /* * todo: direct lookup of CDS for peptide and vice-versa; for now, * have to search through an unordered list of mappings for a candidate */ @@ -1195,9 +1232,8 @@ public abstract class FeatureRendererModel for (AlignedCodonFrame acf : mappings) { - mapping = acf.getMappingForSequence(sequence, true); - if (mapping == null || mapping.getMap().getFromRatio() == mapping - .getMap().getToRatio()) + mapping = acf.getMappingForSequence(sequence); + if (mapping == null || !mapping.getMap().isTripletMap()) { continue; // we are only looking for 3:1 or 1:3 mappings } @@ -1209,7 +1245,7 @@ public abstract class FeatureRendererModel int toRes = match.getEnd(); mapFrom = match.getSequence(); List fs = findFeaturesAtResidue( - match.getSequence(), fromRes, toRes); + mapFrom, fromRes, toRes); for (SequenceFeature sf : fs) { if (!found.contains(sf)) @@ -1282,5 +1318,4 @@ public abstract class FeatureRendererModel } return true; } - }