JAL-2089 patch broken merge to master for Release 2.10.0b1
[jalview.git] / src / jalview / appletgui / SequenceRenderer.java
index 9badf43..970d20e 100755 (executable)
@@ -1,6 +1,6 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2)
- * Copyright (C) 2014 The Jalview Authors
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
  * 
  * This file is part of Jalview.
  * 
@@ -21,7 +21,6 @@
 package jalview.appletgui;
 
 import jalview.api.FeatureRenderer;
-import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
 import jalview.schemes.ColourSchemeI;
@@ -33,6 +32,8 @@ import java.awt.Graphics;
 
 public class SequenceRenderer implements jalview.api.SequenceRenderer
 {
+  final static int CHAR_TO_UPPER = 'A' - 'a';
+
   AlignViewport av;
 
   FontMetrics fm;
@@ -68,6 +69,7 @@ public class SequenceRenderer implements jalview.api.SequenceRenderer
     this.renderGaps = renderGaps;
   }
 
+  @Override
   public Color getResidueBoxColour(SequenceI seq, int i)
   {
     allGroups = av.getAlignment().findAllGroups(seq);
@@ -161,7 +163,8 @@ public class SequenceRenderer implements jalview.api.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)
@@ -186,40 +189,41 @@ public class SequenceRenderer implements jalview.api.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;
 
@@ -255,8 +259,7 @@ public class SequenceRenderer implements jalview.api.SequenceRenderer
         }
         if (currentSequenceGroup.getShowNonconserved())
         {
-          s = getDisplayChar(srep, i, s,
-                  '.');
+          s = getDisplayChar(srep, i, s, '.', currentSequenceGroup);
         }
       }
       else
@@ -280,13 +283,12 @@ public class SequenceRenderer implements jalview.api.SequenceRenderer
         }
         if (av.getShowUnconserved())
         {
-          s = getDisplayChar(srep, i, s,
-                  '.');
+          s = getDisplayChar(srep, i, s, '.', null);
 
         }
       }
 
-      if (av.upperCasebold)
+      if (av.isUpperCasebold())
       {
         fm = graphics.getFontMetrics();
         if ('A' <= s && s <= 'Z')
@@ -306,25 +308,50 @@ public class SequenceRenderer implements jalview.api.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);
     }
 
   }
 
+  /**
+   * Returns 'conservedChar' to represent the given position if the sequence
+   * character at that position is equal to the consensus (ignoring case), else
+   * returns the sequence character
+   * 
+   * @param usesrep
+   * @param position
+   * @param sequenceChar
+   * @param conservedChar
+   * @return
+   */
   private char getDisplayChar(final boolean usesrep, int position,
-          char s, char c)
+          char sequenceChar, char conservedChar, SequenceGroup currentGroup)
   {
-    // TODO - use currentSequenceGroup rather than alignemnt 
+    // TODO - use currentSequenceGroup rather than alignment
     // currentSequenceGroup.getConsensus()
-    char conschar = (usesrep) ? av.getAlignment().getSeqrep().getCharAt(position) : av.getAlignmentConsensusAnnotation().annotations[position].displayCharacter
-            .charAt(0);
-    if (conschar != '-' && s == conschar)
+    char conschar = (usesrep) ? (currentGroup == null
+            || position < currentGroup.getStartRes()
+            || position > currentGroup.getEndRes() ? av.getAlignment()
+            .getSeqrep().getCharAt(position)
+            : (currentGroup.getSeqrep() != null ? currentGroup.getSeqrep()
+                    .getCharAt(position) : av.getAlignment().getSeqrep()
+                    .getCharAt(position)))
+            : (currentGroup != null && currentGroup.getConsensus() != null
+                    && position >= currentGroup.getStartRes()
+                    && position <= currentGroup.getEndRes() && currentGroup
+                    .getConsensus().annotations.length > position) ? currentGroup
+                    .getConsensus().annotations[position].displayCharacter
+                    .charAt(0)
+                    : av.getAlignmentConsensusAnnotation().annotations[position].displayCharacter
+                            .charAt(0);
+    if (!jalview.util.Comparison.isGap(conschar)
+            && (sequenceChar == conschar || sequenceChar + CHAR_TO_UPPER == conschar))
     {
-      s = c;
+      sequenceChar = conservedChar;
     }
-    return s;
+    return sequenceChar;
   }
 
   boolean inCurrentSequenceGroup(int res)
@@ -350,11 +377,11 @@ public class SequenceRenderer implements jalview.api.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 = '~';
@@ -368,19 +395,19 @@ public class SequenceRenderer implements jalview.api.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);
@@ -389,9 +416,9 @@ public class SequenceRenderer implements jalview.api.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);
     }
   }