JAL-1645 Version-Rel Version 2.9 Year-Rel 2015 Licensing glob
[jalview.git] / src / jalview / appletgui / SequenceRenderer.java
index e8508b6..b843526 100755 (executable)
@@ -1,28 +1,36 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.5)
- * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.9)
+ * Copyright (C) 2015 The Jalview Authors
  * 
  * This file is part of Jalview.
  * 
  * Jalview is free software: you can redistribute it and/or
  * modify it under the terms of the GNU General Public License 
- * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
- * 
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *  
  * Jalview is distributed in the hope that it will be useful, but 
  * WITHOUT ANY WARRANTY; without even the implied warranty 
  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
  * PURPOSE.  See the GNU General Public License for more details.
  * 
- * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
  */
 package jalview.appletgui;
 
-import java.awt.*;
+import jalview.api.FeatureRenderer;
+import jalview.datamodel.SequenceGroup;
+import jalview.datamodel.SequenceI;
+import jalview.schemes.ColourSchemeI;
 
-import jalview.datamodel.*;
-import jalview.schemes.*;
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.FontMetrics;
+import java.awt.Graphics;
 
-public class SequenceRenderer
+public class SequenceRenderer implements jalview.api.SequenceRenderer
 {
   AlignViewport av;
 
@@ -61,7 +69,7 @@ public class SequenceRenderer
 
   public Color getResidueBoxColour(SequenceI seq, int i)
   {
-    allGroups = av.alignment.findAllGroups(seq);
+    allGroups = av.getAlignment().findAllGroups(seq);
 
     if (inCurrentSequenceGroup(i))
     {
@@ -72,17 +80,42 @@ public class SequenceRenderer
     }
     else if (av.getShowBoxes())
     {
-      getBoxColour(av.globalColourScheme, seq, i);
+      getBoxColour(av.getGlobalColourScheme(), seq, i);
     }
 
     return resBoxColour;
   }
 
+  /**
+   * Get the residue colour at the given sequence position - as determined by
+   * the sequence group colour (if any), else the colour scheme, possibly
+   * overridden by a feature colour.
+   * 
+   * @param seq
+   * @param position
+   * @param fr
+   * @return
+   */
+  @Override
+  public Color getResidueColour(final SequenceI seq, int position,
+          FeatureRenderer fr)
+  {
+    // TODO replace 8 or so code duplications with calls to this method
+    // (refactored as needed)
+    Color col = getResidueBoxColour(seq, position);
+
+    if (fr != null)
+    {
+      col = fr.findFeatureColour(col, seq, position);
+    }
+    return col;
+  }
+
   void getBoxColour(ColourSchemeI cs, SequenceI seq, int i)
   {
     if (cs != null)
     {
-      resBoxColour = cs.findColour(seq.getCharAt(i), i);
+      resBoxColour = cs.findColour(seq.getCharAt(i), i, seq);
     }
     else if (forOverview
             && !jalview.util.Comparison.isGap(seq.getCharAt(i)))
@@ -98,7 +131,7 @@ public class SequenceRenderer
 
   public Color findSequenceColour(SequenceI seq, int i)
   {
-    allGroups = av.alignment.findAllGroups(seq);
+    allGroups = av.getAlignment().findAllGroups(seq);
     drawBoxes(seq, i, i, 0);
     return resBoxColour;
   }
@@ -127,7 +160,8 @@ public class SequenceRenderer
     int length = seq.getLength();
 
     int curStart = -1;
-    int curWidth = av.charWidth;
+    int curWidth = av.getCharWidth(), avCharWidth = av.getCharWidth(), avCharHeight = av
+            .getCharHeight();
 
     Color tempColour = null;
     while (i <= end)
@@ -152,40 +186,41 @@ public class SequenceRenderer
       {
         if (tempColour != null)
         {
-          graphics.fillRect(av.charWidth * (curStart - start), y1,
-                  curWidth, av.charHeight);
+          graphics.fillRect(avCharWidth * (curStart - start), y1, curWidth,
+                  avCharHeight);
         }
         graphics.setColor(resBoxColour);
 
         curStart = i;
-        curWidth = av.charWidth;
+        curWidth = avCharWidth;
         tempColour = resBoxColour;
 
       }
       else
       {
-        curWidth += av.charWidth;
+        curWidth += avCharWidth;
       }
 
       i++;
     }
 
-    graphics.fillRect(av.charWidth * (curStart - start), y1, curWidth,
-            av.charHeight);
+    graphics.fillRect(avCharWidth * (curStart - start), y1, curWidth,
+            avCharHeight);
   }
 
   public void drawText(SequenceI seq, int start, int end, int y1)
   {
+    int avCharWidth = av.getCharWidth(), avCharHeight = av.getCharHeight();
     Font boldFont = null;
     boolean bold = false;
-    if (av.upperCasebold)
+    if (av.isUpperCasebold())
     {
-      boldFont = new Font(av.getFont().getName(), Font.BOLD, av.charHeight);
+      boldFont = new Font(av.getFont().getName(), Font.BOLD, avCharHeight);
 
       graphics.setFont(av.getFont());
     }
 
-    y1 += av.charHeight - av.charHeight / 5; // height/5 replaces pady
+    y1 += avCharHeight - avCharHeight / 5; // height/5 replaces pady
 
     int charOffset = 0;
 
@@ -196,7 +231,7 @@ public class SequenceRenderer
     }
 
     char s = ' ';
-
+    boolean srep = av.isDisplayReferenceSeq();
     for (int i = start; i <= end; i++)
     {
       graphics.setColor(Color.black);
@@ -221,9 +256,7 @@ public class SequenceRenderer
         }
         if (currentSequenceGroup.getShowNonconserved())
         {
-          // cheat - use this if we have a consensus for each group: s =
-          // getDisplayChar(currentSequenceGroup.getConsensus(), i, s, '.');
-          s = getDisplayChar(av.consensus, i, s, '.');
+          s = getDisplayChar(srep, i, s, '.');
         }
       }
       else
@@ -245,14 +278,14 @@ public class SequenceRenderer
             graphics.setColor(resBoxColour);
           }
         }
-        if (av.getShowunconserved())
+        if (av.getShowUnconserved())
         {
-          s = getDisplayChar(av.consensus, i, s, '.');
+          s = getDisplayChar(srep, i, s, '.');
 
         }
       }
 
-      if (av.upperCasebold)
+      if (av.isUpperCasebold())
       {
         fm = graphics.getFontMetrics();
         if ('A' <= s && s <= 'Z')
@@ -272,19 +305,23 @@ public class SequenceRenderer
 
       }
 
-      charOffset = (av.charWidth - fm.charWidth(s)) / 2;
-      graphics.drawString(String.valueOf(s), charOffset + av.charWidth
+      charOffset = (avCharWidth - fm.charWidth(s)) / 2;
+      graphics.drawString(String.valueOf(s), charOffset + avCharWidth
               * (i - start), y1);
     }
 
   }
 
-  private char getDisplayChar(AlignmentAnnotation consensus, int position,
-          char s, char c)
+  private char getDisplayChar(final boolean usesrep, int position, char s,
+          char c)
   {
-    char conschar = consensus.annotations[position].displayCharacter
-            .charAt(0);
-    if (conschar != '-' && s == conschar)
+    // TODO - use currentSequenceGroup rather than alignment
+    // currentSequenceGroup.getConsensus()
+    char conschar = (usesrep) ? av.getAlignment().getSeqrep()
+            .getCharAt(position)
+            : av.getAlignmentConsensusAnnotation().annotations[position].displayCharacter
+                    .charAt(0);
+    if (!jalview.util.Comparison.isGap(conschar) && s == conschar)
     {
       s = c;
     }
@@ -314,11 +351,11 @@ public class SequenceRenderer
   public void drawHighlightedText(SequenceI seq, int start, int end,
           int x1, int y1)
   {
-    int pady = av.charHeight / 5;
+    int avCharWidth = av.getCharWidth(), avCharHeight = av.getCharHeight();
+    int pady = avCharHeight / 5;
     int charOffset = 0;
     graphics.setColor(Color.black);
-    graphics.fillRect(x1, y1, av.charWidth * (end - start + 1),
-            av.charHeight);
+    graphics.fillRect(x1, y1, avCharWidth * (end - start + 1), avCharHeight);
     graphics.setColor(Color.white);
 
     char s = '~';
@@ -332,19 +369,19 @@ public class SequenceRenderer
           s = seq.getCharAt(i);
         }
 
-        charOffset = (av.charWidth - fm.charWidth(s)) / 2;
+        charOffset = (avCharWidth - fm.charWidth(s)) / 2;
         graphics.drawString(String.valueOf(s), charOffset + x1
-                + av.charWidth * (i - start), y1 + av.charHeight - pady);
+                + avCharWidth * (i - start), y1 + avCharHeight - pady);
       }
     }
   }
 
   public void drawCursor(SequenceI seq, int res, int x1, int y1)
   {
-    int pady = av.charHeight / 5;
+    int pady = av.getCharHeight() / 5;
     int charOffset = 0;
     graphics.setColor(Color.black);
-    graphics.fillRect(x1, y1, av.charWidth, av.charHeight);
+    graphics.fillRect(x1, y1, av.getCharWidth(), av.getCharHeight());
     graphics.setColor(Color.white);
 
     graphics.setColor(Color.white);
@@ -353,9 +390,9 @@ public class SequenceRenderer
     if (av.validCharWidth)
     {
 
-      charOffset = (av.charWidth - fm.charWidth(s)) / 2;
+      charOffset = (av.getCharWidth() - fm.charWidth(s)) / 2;
       graphics.drawString(String.valueOf(s), charOffset + x1,
-              (y1 + av.charHeight) - pady);
+              (y1 + av.getCharHeight()) - pady);
     }
   }