JAL-3210 fudge for JalviewJS to avoid IntervalStore incompatibility
[jalview.git] / src / jalview / viewmodel / seqfeatures / FeatureRendererModel.java
index 838c41a..68345b9 100644 (file)
  */
 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<SequenceFeature> 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<String> 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
      */
@@ -1208,7 +1245,7 @@ public abstract class FeatureRendererModel
         int toRes = match.getEnd();
         mapFrom = match.getSequence();
         List<SequenceFeature> fs = findFeaturesAtResidue(
-                match.getSequence(), fromRes, toRes);
+                mapFrom, fromRes, toRes);
         for (SequenceFeature sf : fs)
         {
           if (!found.contains(sf))
@@ -1281,5 +1318,4 @@ public abstract class FeatureRendererModel
     }
     return true;
   }
-
 }