JAL-2588 (and JAL-2610, JAL-2603) mid refactor
[jalview.git] / src / jalview / renderer / OverviewRenderer.java
index 46490cd..77c3700 100644 (file)
@@ -23,10 +23,13 @@ package jalview.renderer;
 import jalview.api.AlignmentColsCollectionI;
 import jalview.api.AlignmentRowsCollectionI;
 import jalview.datamodel.AlignmentAnnotation;
+import jalview.datamodel.AlignmentI;
 import jalview.datamodel.Annotation;
+import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
 import jalview.renderer.seqfeatures.FeatureColourFinder;
 import jalview.renderer.seqfeatures.FeatureRenderer;
+import jalview.util.Comparison;
 import jalview.viewmodel.OverviewDimensions;
 
 import java.awt.Color;
@@ -51,12 +54,21 @@ public class OverviewRenderer
   // flag to indicate whether to halt drawing
   private volatile boolean redraw = false;
 
+  // reference to alignment, needed to get sequence groups
+  private AlignmentI al;
+
+  private ResidueShaderI shader;
+
   public OverviewRenderer(jalview.api.SequenceRenderer seqRenderer,
-          FeatureRenderer fr, OverviewDimensions od)
+          FeatureRenderer fr, OverviewDimensions od, AlignmentI alignment,
+          ResidueShaderI resshader)
   {
     sr = seqRenderer;
     finder = new FeatureColourFinder(fr);
 
+    al = alignment;
+    shader = resshader;
+
     pixelsPerCol = od.getPixelsPerCol();
     pixelsPerSeq = od.getPixelsPerSeq();
     miniMe = new BufferedImage(od.getWidth(), od.getHeight(),
@@ -89,6 +101,8 @@ public class OverviewRenderer
       // get details of this alignment row
       boolean hidden = rows.isHidden(alignmentRow);
       SequenceI seq = rows.getSequence(alignmentRow);
+      // rate limiting step when rendering overview for lots of groups
+      SequenceGroup[] allGroups = al.findAllGroups(seq);
 
       // calculate where this row extends to in pixels
       int endRow = Math.min(Math.round((seqIndex + 1) * pixelsPerSeq) - 1,
@@ -114,7 +128,7 @@ public class OverviewRenderer
         if (pixelCol <= endCol)
         {
           // determine the colour based on the sequence and column position
-          rgbcolor = getColumnColourFromSequence(seq,
+          rgbcolor = getColumnColourFromSequence(allGroups, seq,
                   hidden || cols.isHidden(alignmentCol), alignmentCol,
                   finder);
 
@@ -140,14 +154,15 @@ public class OverviewRenderer
   /*
    * Find the colour of a sequence at a specified column position
    */
-  private int getColumnColourFromSequence(jalview.datamodel.SequenceI seq,
+  private int getColumnColourFromSequence(SequenceGroup[] allGroups,
+          jalview.datamodel.SequenceI seq,
           boolean isHidden, int lastcol, FeatureColourFinder fcfinder)
   {
     Color color = Color.white;
 
     if ((seq != null) && (seq.getLength() > lastcol))
     {
-      color = sr.getResidueColour(seq, lastcol, fcfinder);
+      color = getResidueColour(allGroups, seq, lastcol, fcfinder);
     }
 
     if (isHidden)
@@ -158,6 +173,83 @@ public class OverviewRenderer
     return color.getRGB();
   }
 
+  private Color getResidueColour(SequenceGroup[] allGroups,
+          final SequenceI seq, int position,
+          FeatureColourFinder finder)
+  {
+    Color col = getResidueBoxColour(allGroups, seq, position);
+
+    if (finder != null)
+    {
+      col = finder.findFeatureColour(col, seq, position);
+    }
+    return col;
+  }
+
+  protected Color getResidueBoxColour(SequenceGroup[] allGroups,
+          SequenceI seq, int i)
+  {
+
+    ResidueShaderI currentShader;
+
+    SequenceGroup currentSequenceGroup = inCurrentSequenceGroup(allGroups,
+            i);
+    if (currentSequenceGroup != null)
+    {
+      currentShader = currentSequenceGroup.getGroupColourScheme();
+    }
+    else
+    {
+      currentShader = shader;
+    }
+
+    return getBoxColour(currentShader, seq, i);
+  }
+
+  SequenceGroup inCurrentSequenceGroup(SequenceGroup[] allGroups, int res)
+  {
+    if (allGroups == null)
+    {
+      return null;
+    }
+
+    for (int i = 0; i < allGroups.length; i++)
+    {
+      if ((allGroups[i].getStartRes() <= res)
+              && (allGroups[i].getEndRes() >= res))
+      {
+        return (allGroups[i]);
+      }
+    }
+
+    return null;
+  }
+
+  Color getBoxColour(ResidueShaderI shader, SequenceI seq, int i)
+  {
+    Color resBoxColour = Color.white;
+    char currentChar = seq.getCharAt(i);
+
+    if (shader.getColourScheme() != null)
+    {
+      if (Comparison.isGap(currentChar)
+              && !shader.getColourScheme().hasGapColour())
+      {
+        resBoxColour = Color.lightGray;
+      }
+      else
+      {
+        resBoxColour = shader.findColour(currentChar, i, seq);
+      }
+    }
+    else if (Comparison.isGap(currentChar))
+    {
+      resBoxColour = Color.lightGray;
+    }
+
+    return resBoxColour;
+  }
+
   /**
    * Draw the alignment annotation in the overview panel
    *