JAL-2629 add basic parameter adjustment to hmmsearch/align
[jalview.git] / src / jalview / renderer / seqfeatures / FeatureRenderer.java
index 49b98a5..9f57510 100644 (file)
@@ -37,12 +37,6 @@ public class FeatureRenderer extends FeatureRendererModel
   private static final AlphaComposite NO_TRANSPARENCY = AlphaComposite
           .getInstance(AlphaComposite.SRC_OVER, 1.0f);
 
-  protected SequenceI lastSeq;
-
-  private volatile SequenceFeature[] lastSequenceFeatures;
-
-  int sfSize;
-
   /**
    * Constructor given a viewport
    * 
@@ -104,8 +98,7 @@ public class FeatureRenderer extends FeatureRendererModel
 
       g.setColor(featureColour);
 
-      g.fillRect((i - start) * charWidth, y1, charWidth,
-              charHeight);
+      g.fillRect((i - start) * charWidth, y1, charWidth, charHeight);
 
       if (colourOnly || !validCharWidth)
       {
@@ -114,8 +107,8 @@ public class FeatureRenderer extends FeatureRendererModel
 
       g.setColor(Color.white);
       int charOffset = (charWidth - fm.charWidth(s)) / 2;
-      g.drawString(String.valueOf(s), charOffset
-              + (charWidth * (i - start)), pady);
+      g.drawString(String.valueOf(s),
+              charOffset + (charWidth * (i - start)), pady);
     }
     return true;
   }
@@ -203,8 +196,8 @@ public class FeatureRenderer extends FeatureRendererModel
 
       g.setColor(Color.black);
       int charOffset = (charWidth - fm.charWidth(s)) / 2;
-      g.drawString(String.valueOf(s), charOffset
-              + (charWidth * (i - start)), pady);
+      g.drawString(String.valueOf(s),
+              charOffset + (charWidth * (i - start)), pady);
     }
     return true;
   }
@@ -221,45 +214,36 @@ public class FeatureRenderer extends FeatureRendererModel
     }
 
     SequenceFeature[] sequenceFeatures = seq.getSequenceFeatures();
-    if (seq != lastSeq)
-    {
-      lastSeq = seq;
-      lastSequenceFeatures = sequenceFeatures;
-      if (lastSequenceFeatures != null)
-      {
-        sfSize = lastSequenceFeatures.length;
-      }
-    }
-    else
-    {
-      if (lastSequenceFeatures != sequenceFeatures)
-      {
-        lastSequenceFeatures = sequenceFeatures;
-        if (lastSequenceFeatures != null)
-        {
-          sfSize = lastSequenceFeatures.length;
-        }
-      }
-    }
 
-    if (lastSequenceFeatures == null || sfSize == 0)
+    if (sequenceFeatures == null || sequenceFeatures.length == 0)
     {
       return null;
     }
 
-    if (Comparison.isGap(lastSeq.getCharAt(column)))
+    if (Comparison.isGap(seq.getCharAt(column)))
     {
-      return Color.white;
+      /*
+       * returning null allows the colour scheme to provide gap colour
+       * - normally white, but can be customised otherwise
+       */
+      return null;
     }
 
     Color renderedColour = null;
     if (transparency == 1.0f)
     {
+      /*
+       * simple case - just find the topmost rendered visible feature colour
+       */
       renderedColour = findFeatureColour(seq, seq.findPosition(column));
     }
     else
     {
-      renderedColour = drawSequence(g, lastSeq, column, column, 0, true);
+      /*
+       * transparency case - draw all visible features in render order to
+       * build up a composite colour on the graphics context
+       */
+      renderedColour = drawSequence(g, seq, column, column, 0, true);
     }
     return renderedColour;
   }
@@ -296,13 +280,6 @@ public class FeatureRenderer extends FeatureRendererModel
 
     updateFeatures();
 
-    if (lastSeq == null || seq != lastSeq
-            || sequenceFeatures != lastSequenceFeatures)
-    {
-      lastSeq = seq;
-      lastSequenceFeatures = sequenceFeatures;
-    }
-
     if (transparency != 1f && g != null)
     {
       Graphics2D g2 = (Graphics2D) g;
@@ -310,10 +287,10 @@ public class FeatureRenderer extends FeatureRendererModel
               transparency));
     }
 
-    int startPos = lastSeq.findPosition(start);
-    int endPos = lastSeq.findPosition(end);
+    int startPos = seq.findPosition(start);
+    int endPos = seq.findPosition(end);
 
-    sfSize = lastSequenceFeatures.length;
+    int sfSize = sequenceFeatures.length;
     Color drawnColour = null;
 
     /*
@@ -331,7 +308,7 @@ public class FeatureRenderer extends FeatureRendererModel
       // current feature to render
       for (int sfindex = 0; sfindex < sfSize; sfindex++)
       {
-        final SequenceFeature sequenceFeature = lastSequenceFeatures[sfindex];
+        final SequenceFeature sequenceFeature = sequenceFeatures[sfindex];
         if (!sequenceFeature.type.equals(type))
         {
           continue;
@@ -357,6 +334,12 @@ public class FeatureRenderer extends FeatureRendererModel
         }
 
         Color featureColour = getColour(sequenceFeature);
+        if (featureColour == null)
+        {
+          // score feature outwith threshold for colouring
+          continue;
+        }
+
         boolean isContactFeature = sequenceFeature.isContactFeature();
 
         if (isContactFeature)
@@ -374,7 +357,7 @@ public class FeatureRenderer extends FeatureRendererModel
             drawnColour = featureColour;
           }
         }
-        else if (showFeature(sequenceFeature))
+        else
         {
           if (av.isShowSequenceFeaturesHeight()
                   && !Float.isNaN(sequenceFeature.score))
@@ -426,8 +409,7 @@ public class FeatureRenderer extends FeatureRendererModel
   protected boolean featureGroupNotShown(
           final SequenceFeature sequenceFeature)
   {
-    return featureGroups != null
-            && sequenceFeature.featureGroup != null
+    return featureGroups != null && sequenceFeature.featureGroup != null
             && sequenceFeature.featureGroup.length() != 0
             && featureGroups.containsKey(sequenceFeature.featureGroup)
             && !featureGroups.get(sequenceFeature.featureGroup)
@@ -442,7 +424,6 @@ public class FeatureRenderer extends FeatureRendererModel
   @Override
   public void featuresAdded()
   {
-    lastSeq = null;
     findAllFeatures();
   }
 
@@ -463,14 +444,18 @@ public class FeatureRenderer extends FeatureRendererModel
     {
       return null;
     }
-  
-    // updateFeatures();
+
+    /*
+     * check for new feature added while processing
+     */
+    updateFeatures();
 
     /*
      * inspect features in reverse renderOrder (the last in the array is 
      * displayed on top) until we find one that is rendered at the position
      */
-    for (int renderIndex = renderOrder.length - 1; renderIndex >= 0; renderIndex--)
+    for (int renderIndex = renderOrder.length
+            - 1; renderIndex >= 0; renderIndex--)
     {
       String type = renderOrder[renderIndex];
       if (!showFeatureOfType(type))
@@ -491,6 +476,10 @@ public class FeatureRenderer extends FeatureRendererModel
           continue;
         }
 
+        /*
+         * check the column position is within the feature range
+         * (or is one of the two contact positions for a contact feature)
+         */
         boolean featureIsAtPosition = sequenceFeature.begin <= pos
                 && sequenceFeature.end >= pos;
         if (sequenceFeature.isContactFeature())
@@ -504,7 +493,7 @@ public class FeatureRenderer extends FeatureRendererModel
         }
       }
     }
-  
+
     /*
      * no displayed feature found at position
      */