Merge branch 'feature/JAL-2664' into feature/JAL-2527
[jalview.git] / src / jalview / viewmodel / seqfeatures / FeatureRendererModel.java
index 84c9477..81d1b7e 100644 (file)
@@ -36,6 +36,7 @@ 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;
@@ -43,8 +44,8 @@ import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
-public abstract class FeatureRendererModel implements
-        jalview.api.FeatureRenderer
+public abstract class FeatureRendererModel
+        implements jalview.api.FeatureRenderer
 {
 
   /**
@@ -214,7 +215,8 @@ public abstract class FeatureRendererModel implements
       if (r[0] != 0 || mm[0] < 0.0)
       {
         r[0] = 1;
-        r[1] = (byte) ((int) 128.0 + 127.0 * (sequenceFeature.score / mm[1]));
+        r[1] = (byte) ((int) 128.0
+                + 127.0 * (sequenceFeature.score / mm[1]));
       }
       else
       {
@@ -263,7 +265,8 @@ public abstract class FeatureRendererModel implements
   }
 
   @Override
-  public List<SequenceFeature> findFeaturesAtRes(SequenceI sequence, int res)
+  public List<SequenceFeature> findFeaturesAtRes(SequenceI sequence,
+          int res)
   {
     ArrayList<SequenceFeature> tmp = new ArrayList<SequenceFeature>();
     SequenceFeature[] features = sequence.getSequenceFeatures();
@@ -272,15 +275,13 @@ public abstract class FeatureRendererModel implements
     {
       for (int i = 0; i < features.length; i++)
       {
-        if (!av.areFeaturesDisplayed()
-                || !av.getFeaturesDisplayed().isVisible(
-                        features[i].getType()))
+        if (!av.areFeaturesDisplayed() || !av.getFeaturesDisplayed()
+                .isVisible(features[i].getType()))
         {
           continue;
         }
 
-        if (features[i].featureGroup != null
-                && featureGroups != null
+        if (features[i].featureGroup != null && featureGroups != null
                 && featureGroups.containsKey(features[i].featureGroup)
                 && !featureGroups.get(features[i].featureGroup)
                         .booleanValue())
@@ -292,8 +293,8 @@ public abstract class FeatureRendererModel implements
         // lies between start and end
         if ((features[i].getBegin() == res || features[i].getEnd() == res)
                 || (!features[i].isContactFeature()
-                        && (features[i].getBegin() < res) && (features[i]
-                        .getEnd() >= res)))
+                        && (features[i].getBegin() < res)
+                        && (features[i].getEnd() >= res)))
         {
           tmp.add(features[i]);
         }
@@ -344,6 +345,8 @@ public abstract class FeatureRendererModel implements
     {
       minmax = new Hashtable<String, float[][]>();
     }
+
+    Set<String> oldGroups = new HashSet<String>(featureGroups.keySet());
     AlignmentI alignment = av.getAlignment();
     for (int i = 0; i < alignment.getHeight(); i++)
     {
@@ -358,9 +361,10 @@ public abstract class FeatureRendererModel implements
       int index = 0;
       while (index < features.length)
       {
+        String fgrp = features[index].getFeatureGroup();
+        oldGroups.remove(fgrp);
         if (!featuresDisplayed.isRegistered(features[index].getType()))
         {
-          String fgrp = features[index].getFeatureGroup();
           if (fgrp != null)
           {
             Boolean groupDisplayed = featureGroups.get(fgrp);
@@ -424,6 +428,16 @@ public abstract class FeatureRendererModel implements
         index++;
       }
     }
+
+    /*
+     * oldGroups now consists of groups that no longer 
+     * have any feature in them - remove these
+     */
+    for (String grp : oldGroups)
+    {
+      featureGroups.remove(grp);
+    }
+
     updateRenderOrder(allfeatures);
     findingFeatures = false;
   }
@@ -456,7 +470,8 @@ public abstract class FeatureRendererModel implements
         {
           if (initOrders)
           {
-            setOrder(oldRender[j], (1 - (1 + (float) j) / oldRender.length));
+            setOrder(oldRender[j],
+                    (1 - (1 + (float) j) / oldRender.length));
           }
           if (allfeatures.contains(oldRender[j]))
           {
@@ -561,9 +576,17 @@ public abstract class FeatureRendererModel implements
   public Color getColour(SequenceFeature feature)
   {
     FeatureColourI fc = getFeatureStyle(feature.getType());
-    return fc.getColor(feature);
+    return fc.isColored(feature) ? fc.getColor(feature) : null;
   }
 
+  /**
+   * Answers true unless the feature has a score value which lies outside a
+   * minimum or maximum threshold configured for colouring. This method does not
+   * check feature type or group visibility.
+   * 
+   * @param sequenceFeature
+   * @return
+   */
   protected boolean showFeature(SequenceFeature sequenceFeature)
   {
     FeatureColourI fc = getFeatureStyle(sequenceFeature.type);
@@ -684,7 +707,8 @@ public abstract class FeatureRendererModel implements
       }
       else
       {
-        av.setFeaturesDisplayed(av_featuresdisplayed = new FeaturesDisplayed());
+        av.setFeaturesDisplayed(
+                av_featuresdisplayed = new FeaturesDisplayed());
       }
     }
     else
@@ -796,11 +820,12 @@ public abstract class FeatureRendererModel implements
   {
     // conflict between applet and desktop - featureGroups returns the map in
     // the desktop featureRenderer
-    return (featureGroups == null) ? Arrays.asList(new String[0]) : Arrays
-            .asList(featureGroups.keySet().toArray(new String[0]));
+    return (featureGroups == null) ? Arrays.asList(new String[0])
+            : Arrays.asList(featureGroups.keySet().toArray(new String[0]));
   }
 
-  public boolean checkGroupVisibility(String group, boolean newGroupsVisible)
+  public boolean checkGroupVisibility(String group,
+          boolean newGroupsVisible)
   {
     if (featureGroups == null)
     {