Formatting
[jalview.git] / src / jalview / gui / IdCanvas.java
index 71cc483..97b8669 100755 (executable)
@@ -1,6 +1,6 @@
 /*\r
  * Jalview - A Sequence Alignment Editor and Viewer\r
- * Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
+ * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
  *\r
  * This program is free software; you can redistribute it and/or\r
  * modify it under the terms of the GNU General Public License\r
  */\r
 package jalview.gui;\r
 \r
-import jalview.datamodel.*;\r
-\r
 import java.awt.*;\r
 import java.awt.image.*;\r
-\r
 import javax.swing.*;\r
 \r
+import jalview.datamodel.*;\r
 \r
 /**\r
  * DOCUMENT ME!\r
@@ -32,418 +30,448 @@ import javax.swing.*;
  * @author $author$\r
  * @version $Revision$\r
  */\r
-public class IdCanvas extends JPanel\r
+public class IdCanvas\r
+    extends JPanel\r
 {\r
-    protected AlignViewport av;\r
-    protected boolean showScores = true;\r
-    protected int maxIdLength = -1;\r
-    protected String maxIdStr = null;\r
-    BufferedImage image;\r
-    Graphics2D gg;\r
-    int imgHeight = 0;\r
-    boolean fastPaint = false;\r
-    java.util.Vector searchResults;\r
-    FontMetrics fm;\r
-    AnnotationLabels labels = null;\r
-    AnnotationPanel ap;\r
-    Font idfont;\r
-\r
-    /**\r
-     * Creates a new IdCanvas object.\r
-     *\r
-     * @param av DOCUMENT ME!\r
-     */\r
-    public IdCanvas(AlignViewport av)\r
+  protected AlignViewport av;\r
+  protected boolean showScores = true;\r
+  protected int maxIdLength = -1;\r
+  protected String maxIdStr = null;\r
+  BufferedImage image;\r
+  Graphics2D gg;\r
+  int imgHeight = 0;\r
+  boolean fastPaint = false;\r
+  java.util.Vector searchResults;\r
+  FontMetrics fm;\r
+  AnnotationLabels labels = null;\r
+  AnnotationPanel ap;\r
+  Font idfont;\r
+\r
+  /**\r
+   * Creates a new IdCanvas object.\r
+   *\r
+   * @param av DOCUMENT ME!\r
+   */\r
+  public IdCanvas(AlignViewport av)\r
+  {\r
+    setLayout(new BorderLayout());\r
+    this.av = av;\r
+    PaintRefresher.Register(this, av.getSequenceSetId());\r
+  }\r
+\r
+  /**\r
+   * DOCUMENT ME!\r
+   *\r
+   * @param gg DOCUMENT ME!\r
+   * @param s DOCUMENT ME!\r
+   * @param i DOCUMENT ME!\r
+   * @param starty DOCUMENT ME!\r
+   * @param ypos DOCUMENT ME!\r
+   */\r
+  public void drawIdString(Graphics2D gg, SequenceI s, int i, int starty,\r
+                           int ypos)\r
+  {\r
+    int xPos = 0;\r
+    int panelWidth = getWidth();\r
+    int charHeight = av.charHeight;\r
+\r
+    if ( (searchResults != null) && searchResults.contains(s))\r
+    {\r
+      gg.setColor(Color.black);\r
+      gg.fillRect(0, ( (i - starty) * charHeight) + ypos, getWidth(),\r
+                  charHeight);\r
+      gg.setColor(Color.white);\r
+    }\r
+    else if ( (av.getSelectionGroup() != null) &&\r
+             av.getSelectionGroup().getSequences(null).contains(s))\r
+    {\r
+      gg.setColor(Color.lightGray);\r
+      gg.fillRect(0, ( (i - starty) * charHeight) + ypos, getWidth(),\r
+                  charHeight);\r
+      gg.setColor(Color.white);\r
+    }\r
+    else\r
     {\r
-        setLayout(new BorderLayout());\r
-        this.av = av;\r
-        PaintRefresher.Register(this, av.getSequenceSetId());\r
+      gg.setColor(av.getSequenceColour(s));\r
+      gg.fillRect(0, ( (i - starty) * charHeight) + ypos, getWidth(),\r
+                  charHeight);\r
+      gg.setColor(Color.black);\r
     }\r
 \r
-    /**\r
-     * DOCUMENT ME!\r
-     *\r
-     * @param gg DOCUMENT ME!\r
-     * @param s DOCUMENT ME!\r
-     * @param i DOCUMENT ME!\r
-     * @param starty DOCUMENT ME!\r
-     * @param ypos DOCUMENT ME!\r
-     */\r
-    public void drawIdString(Graphics2D gg, SequenceI s, int i, int starty, int ypos)\r
+    if (av.rightAlignIds)\r
     {\r
-        int xPos = 0;\r
-        int panelWidth = getWidth();\r
-        int charHeight = av.charHeight;\r
+      xPos = panelWidth - fm.stringWidth(\r
+          s.getDisplayId(av.getShowJVSuffix())\r
+          ) - 4;\r
+    }\r
 \r
-        if ((searchResults != null) && searchResults.contains(s))\r
-        {\r
-            gg.setColor(Color.black);\r
-            gg.fillRect(0, ((i - starty) * charHeight) + ypos, getWidth(),\r
-                charHeight);\r
-            gg.setColor(Color.white);\r
-        }\r
-        else if ((av.getSelectionGroup() != null) &&\r
-                av.getSelectionGroup().getSequences(null).contains(s))\r
-        {\r
-            gg.setColor(Color.lightGray);\r
-            gg.fillRect(0, ((i - starty) * charHeight) + ypos, getWidth(),\r
-                charHeight);\r
-            gg.setColor(Color.white);\r
-        }\r
-        else\r
-        {\r
-            gg.setColor(av.getSequenceColour(s));\r
-            gg.fillRect(0, ((i - starty) * charHeight) + ypos, getWidth(),\r
-                charHeight);\r
-            gg.setColor(Color.black);\r
-        }\r
+    gg.drawString(s.getDisplayId(av.getShowJVSuffix()),\r
+                  xPos,\r
+                  ( ( (i - starty + 1) * charHeight) + ypos) - (charHeight / 5));\r
 \r
-        if (av.rightAlignIds)\r
-        {\r
-          xPos = panelWidth - fm.stringWidth(\r
-              s.getDisplayId(av.getShowJVSuffix())\r
-              ) - 4;\r
-        }\r
+    if (av.hasHiddenRows && av.showHiddenMarkers)\r
+    {\r
+      drawMarker(i, starty, ypos);\r
+    }\r
 \r
-        gg.drawString( s.getDisplayId(av.getShowJVSuffix()),\r
-                    xPos, (((i - starty + 1) * charHeight) + ypos) - (charHeight / 5));\r
+  }\r
 \r
-        if (av.hasHiddenRows && av.showHiddenMarkers)\r
-          drawMarker(i, starty, ypos);\r
+  /**\r
+   * DOCUMENT ME!\r
+   *\r
+   * @param vertical DOCUMENT ME!\r
+   */\r
+  public void fastPaint(int vertical)\r
+  {\r
+    if (gg == null)\r
+    {\r
+      repaint();\r
+\r
+      return;\r
+    }\r
+\r
+    gg.copyArea(0, 0, getWidth(), imgHeight, 0, -vertical * av.charHeight);\r
+\r
+    int ss = av.startSeq;\r
+    int es = av.endSeq;\r
+    int transY = 0;\r
+\r
+    if (vertical > 0) // scroll down\r
+    {\r
+      ss = es - vertical;\r
 \r
+      if (ss < av.startSeq)\r
+      { // ie scrolling too fast, more than a page at a time\r
+        ss = av.startSeq;\r
+      }\r
+      else\r
+      {\r
+        transY = imgHeight - (vertical * av.charHeight);\r
+      }\r
+    }\r
+    else if (vertical < 0)\r
+    {\r
+      es = ss - vertical;\r
 \r
+      if (es > av.endSeq)\r
+      {\r
+        es = av.endSeq;\r
+      }\r
     }\r
 \r
-    /**\r
-     * DOCUMENT ME!\r
-     *\r
-     * @param vertical DOCUMENT ME!\r
-     */\r
-    public void fastPaint(int vertical)\r
+    gg.translate(0, transY);\r
+\r
+    drawIds(ss, es);\r
+\r
+    gg.translate(0, -transY);\r
+\r
+    fastPaint = true;\r
+    repaint();\r
+  }\r
+\r
+  /**\r
+   * DOCUMENT ME!\r
+   *\r
+   * @param g DOCUMENT ME!\r
+   */\r
+  public void paintComponent(Graphics g)\r
+  {\r
+    g.setColor(Color.white);\r
+    g.fillRect(0, 0, getWidth(), getHeight());\r
+\r
+    if (fastPaint)\r
     {\r
-        if (gg == null)\r
-        {\r
-            repaint();\r
+      fastPaint = false;\r
+      g.drawImage(image, 0, 0, this);\r
 \r
-            return;\r
-        }\r
+      return;\r
+    }\r
 \r
-        gg.copyArea(0, 0, getWidth(), imgHeight, 0, -vertical * av.charHeight);\r
+    int oldHeight = imgHeight;\r
 \r
-        int ss = av.startSeq;\r
-        int es = av.endSeq;\r
-        int transY = 0;\r
+    imgHeight = getHeight();\r
+    imgHeight -= (imgHeight % av.charHeight);\r
 \r
-        if (vertical > 0) // scroll down\r
-        {\r
-            ss = es - vertical;\r
-\r
-            if (ss < av.startSeq)\r
-            { // ie scrolling too fast, more than a page at a time\r
-                ss = av.startSeq;\r
-            }\r
-            else\r
-            {\r
-                transY = imgHeight - (vertical * av.charHeight);\r
-            }\r
-        }\r
-        else if (vertical < 0)\r
-        {\r
-            es = ss - vertical;\r
+    if (imgHeight < 1)\r
+    {\r
+      return;\r
+    }\r
 \r
-            if (es > av.endSeq)\r
-            {\r
-                es = av.endSeq;\r
-            }\r
-        }\r
+    if (oldHeight != imgHeight || image.getWidth(this) != getWidth())\r
+    {\r
+      image = new BufferedImage(getWidth(), imgHeight,\r
+                                BufferedImage.TYPE_INT_RGB);\r
+    }\r
 \r
-        gg.translate(0, transY);\r
+    gg = (Graphics2D) image.getGraphics();\r
 \r
-        drawIds(ss, es);\r
+    //Fill in the background\r
+    gg.setColor(Color.white);\r
+    gg.fillRect(0, 0, getWidth(), imgHeight);\r
 \r
-        gg.translate(0, -transY);\r
+    drawIds(av.getStartSeq(), av.endSeq);\r
 \r
-        fastPaint = true;\r
-        repaint();\r
+    g.drawImage(image, 0, 0, this);\r
+  }\r
+\r
+  /**\r
+   * DOCUMENT ME!\r
+   *\r
+   * @param starty DOCUMENT ME!\r
+   * @param endy DOCUMENT ME!\r
+   */\r
+  void drawIds(int starty, int endy)\r
+  {\r
+    if (av.seqNameItalics)\r
+    {\r
+      idfont = new Font(av.getFont().getName(), Font.ITALIC,\r
+                        av.getFont().getSize());\r
+    }\r
+    else\r
+    {\r
+      idfont = av.getFont();\r
     }\r
 \r
-    /**\r
-     * DOCUMENT ME!\r
-     *\r
-     * @param g DOCUMENT ME!\r
-     */\r
-    public void paintComponent(Graphics g)\r
+    gg.setFont(idfont);\r
+    fm = gg.getFontMetrics();\r
+\r
+    if (av.antiAlias)\r
     {\r
-        g.setColor(Color.white);\r
-        g.fillRect(0, 0, getWidth(), getHeight());\r
+      gg.setRenderingHint(RenderingHints.KEY_ANTIALIASING,\r
+                          RenderingHints.VALUE_ANTIALIAS_ON);\r
+    }\r
 \r
-        if (fastPaint)\r
-        {\r
-            fastPaint = false;\r
-            g.drawImage(image, 0, 0, this);\r
+    Color currentColor = Color.white;\r
+    Color currentTextColor = Color.black;\r
 \r
-            return;\r
-        }\r
+    if (av.getWrapAlignment())\r
+    {\r
+      int maxwidth = av.alignment.getWidth();\r
+      int alheight = av.alignment.getHeight();\r
 \r
-        int oldHeight = imgHeight;\r
+      if (av.hasHiddenColumns)\r
+      {\r
+        maxwidth = av.getColumnSelection().findColumnPosition(maxwidth) - 1;\r
+      }\r
 \r
-        imgHeight = getHeight();\r
-        imgHeight -= (imgHeight % av.charHeight);\r
+      int annotationHeight = 0;\r
 \r
-        if (imgHeight < 1)\r
+      if (av.showAnnotation)\r
+      {\r
+        if (ap == null)\r
         {\r
-            return;\r
+          ap = new AnnotationPanel(av);\r
         }\r
 \r
-        if(oldHeight!=imgHeight || image.getWidth(this)!=getWidth())\r
+        annotationHeight = ap.adjustPanelHeight();\r
+        if (labels == null)\r
         {\r
-          image = new BufferedImage(getWidth(), imgHeight,\r
-                                    BufferedImage.TYPE_INT_RGB);\r
+          labels = new AnnotationLabels(av);\r
         }\r
+      }\r
 \r
-        gg = (Graphics2D) image.getGraphics();\r
+      int hgap = av.charHeight;\r
+      if (av.scaleAboveWrapped)\r
+      {\r
+        hgap += av.charHeight;\r
+      }\r
 \r
-        //Fill in the background\r
-        gg.setColor(Color.white);\r
-        gg.fillRect(0, 0, getWidth(), imgHeight);\r
+      int cHeight = alheight * av.charHeight\r
+          + hgap\r
+          + annotationHeight;\r
 \r
-        drawIds(av.getStartSeq(), av.endSeq);\r
+      int rowSize = av.getEndRes() - av.getStartRes();\r
 \r
-        g.drawImage(image, 0, 0, this);\r
-    }\r
+      // Draw the rest of the panels\r
+      for (int ypos = hgap, row = av.startRes;\r
+           (ypos <= getHeight()) && (row < maxwidth);\r
+           ypos += cHeight, row += rowSize)\r
+      {\r
+        for (int i = starty; i < alheight; i++)\r
+        {\r
+          SequenceI s = av.alignment.getSequenceAt(i);\r
+          if (av.hasHiddenRows)\r
+          {\r
+            setHiddenFont(s);\r
+          }\r
+          else\r
+          {\r
+            gg.setFont(idfont);\r
+          }\r
 \r
-    /**\r
-     * DOCUMENT ME!\r
-     *\r
-     * @param starty DOCUMENT ME!\r
-     * @param endy DOCUMENT ME!\r
-     */\r
-    void drawIds(int starty, int endy)\r
-    {\r
-     if(av.seqNameItalics)\r
-      idfont = new Font(av.getFont().getName(), Font.ITALIC,\r
-                             av.getFont().getSize());\r
+          drawIdString(gg, s, i, 0, ypos);\r
+        }\r
+\r
+        if (labels != null && av.showAnnotation)\r
+        {\r
+          gg.translate(0, ypos + (alheight * av.charHeight));\r
+          labels.drawComponent(gg, getWidth());\r
+          gg.translate(0, -ypos - (alheight * av.charHeight));\r
+        }\r
+      }\r
+    }\r
     else\r
-      idfont = av.getFont();\r
+    {\r
+      //No need to hang on to labels if we're not wrapped\r
+      labels = null;\r
 \r
-      gg.setFont(idfont);\r
-      fm = gg.getFontMetrics();\r
+      //Now draw the id strings\r
+      int panelWidth = getWidth();\r
+      int xPos = 0;\r
 \r
-      if (av.antiAlias)\r
-        gg.setRenderingHint(RenderingHints.KEY_ANTIALIASING,\r
-                            RenderingHints.VALUE_ANTIALIAS_ON);\r
+      SequenceI sequence;\r
+      //Now draw the id strings\r
+      for (int i = starty; i < endy; i++)\r
+      {\r
+        sequence = av.alignment.getSequenceAt(i);\r
 \r
-        Color currentColor = Color.white;\r
-        Color currentTextColor = Color.black;\r
+        if (sequence == null)\r
+        {\r
+          continue;\r
+        }\r
 \r
-        if (av.getWrapAlignment())\r
+        if (av.hasHiddenRows)\r
         {\r
-          int maxwidth = av.alignment.getWidth();\r
-          int alheight = av.alignment.getHeight();\r
+          setHiddenFont(sequence);\r
+        }\r
 \r
-          if (av.hasHiddenColumns)\r
-            maxwidth = av.getColumnSelection().findColumnPosition(maxwidth) - 1;\r
+        // Selected sequence colours\r
+        if ( (searchResults != null) &&\r
+            searchResults.contains(sequence))\r
+        {\r
+          currentColor = Color.black;\r
+          currentTextColor = Color.white;\r
+        }\r
+        else if ( (av.getSelectionGroup() != null) &&\r
+                 av.getSelectionGroup().getSequences(null).contains(\r
+                     sequence))\r
+        {\r
+          currentColor = Color.lightGray;\r
+          currentTextColor = Color.black;\r
+        }\r
+        else\r
+        {\r
+          currentColor = av.getSequenceColour(sequence);\r
+          currentTextColor = Color.black;\r
+        }\r
 \r
-          int annotationHeight = 0;\r
+        gg.setColor(currentColor);\r
 \r
+        gg.fillRect(0, (i - starty) * av.charHeight, getWidth(),\r
+                    av.charHeight);\r
 \r
-          if(av.showAnnotation)\r
-          {\r
-            if (ap == null)\r
-              ap = new AnnotationPanel(av);\r
+        gg.setColor(currentTextColor);\r
 \r
-            annotationHeight = ap.adjustPanelHeight();\r
-            if (labels == null)\r
-              labels = new AnnotationLabels(av);\r
-          }\r
+        String string = sequence.getDisplayId(av.getShowJVSuffix());\r
 \r
-          int hgap = av.charHeight;\r
-          if (av.scaleAboveWrapped)\r
-            hgap += av.charHeight;\r
-\r
-          int cHeight = alheight * av.charHeight\r
-              + hgap\r
-              + annotationHeight;\r
-\r
-          int rowSize = av.getEndRes() - av.getStartRes();\r
-\r
-\r
-            // Draw the rest of the panels\r
-            for (int ypos = hgap, row = av.startRes;\r
-                    (ypos <= getHeight()) && (row < maxwidth);\r
-                    ypos += cHeight, row += rowSize)\r
-            {\r
-              for (int i = starty; i < alheight; i++)\r
-              {\r
-                SequenceI s = av.alignment.getSequenceAt(i);\r
-                if (av.hasHiddenRows)\r
-                {\r
-                  setHiddenFont(s);\r
-                }\r
-                else\r
-                  gg.setFont(idfont);\r
-\r
-                drawIdString(gg, s, i, 0, ypos);\r
-              }\r
-\r
-                if(labels!=null && av.showAnnotation)\r
-                {\r
-                  gg.translate(0, ypos+(alheight * av.charHeight));\r
-                  labels.drawComponent(gg, getWidth());\r
-                  gg.translate(0, -ypos-(alheight * av.charHeight));\r
-                }\r
-            }\r
-        }\r
-        else\r
+        if (av.rightAlignIds)\r
         {\r
-          //No need to hang on to labels if we're not wrapped\r
-          labels = null;\r
-\r
-          //Now draw the id strings\r
-          int panelWidth = getWidth();\r
-          int xPos = 0;\r
-\r
-            SequenceI sequence;\r
-            //Now draw the id strings\r
-            for (int i = starty; i < endy; i++)\r
-            {\r
-              sequence = av.alignment.getSequenceAt(i);\r
-\r
-              if(sequence==null)\r
-                continue;\r
-\r
-              if (av.hasHiddenRows)\r
-              {\r
-                setHiddenFont(sequence);\r
-              }\r
-\r
-                // Selected sequence colours\r
-                if ( (searchResults != null) &&\r
-                    searchResults.contains(sequence))\r
-                {\r
-                  currentColor = Color.black;\r
-                  currentTextColor = Color.white;\r
-                }\r
-                else if ( (av.getSelectionGroup() != null) &&\r
-                         av.getSelectionGroup().getSequences(null).contains(\r
-                             sequence))\r
-                {\r
-                  currentColor = Color.lightGray;\r
-                  currentTextColor = Color.black;\r
-                }\r
-                else\r
-                {\r
-                  currentColor = av.getSequenceColour(sequence);\r
-                  currentTextColor = Color.black;\r
-                }\r
-\r
-                gg.setColor(currentColor);\r
-\r
-                gg.fillRect(0, (i - starty) * av.charHeight, getWidth(),\r
-                            av.charHeight);\r
-\r
-                gg.setColor(currentTextColor);\r
-\r
-                String string = sequence.getDisplayId( av.getShowJVSuffix());\r
-\r
-\r
-                if(av.rightAlignIds)\r
-                {\r
-                  xPos = panelWidth - fm.stringWidth(string) - 4;\r
-                }\r
-\r
-                gg.drawString(string, xPos,\r
-                    (((i - starty) * av.charHeight) + av.charHeight) -\r
-                    (av.charHeight / 5));\r
-\r
-               if(av.hasHiddenRows && av.showHiddenMarkers)\r
-                 drawMarker(i, starty, 0);\r
-\r
-            }\r
+          xPos = panelWidth - fm.stringWidth(string) - 4;\r
+        }\r
 \r
+        gg.drawString(string, xPos,\r
+                      ( ( (i - starty) * av.charHeight) + av.charHeight) -\r
+                      (av.charHeight / 5));\r
+\r
+        if (av.hasHiddenRows && av.showHiddenMarkers)\r
+        {\r
+          drawMarker(i, starty, 0);\r
         }\r
+\r
+      }\r
+\r
     }\r
+  }\r
 \r
-    void drawMarker(int i, int starty, int yoffset)\r
-    {\r
+  void drawMarker(int i, int starty, int yoffset)\r
+  {\r
 \r
-      SequenceI [] hseqs = av.alignment.getHiddenSequences().hiddenSequences;\r
-      //Use this method here instead of calling hiddenSeq adjust\r
-      //3 times.\r
-      int hSize = hseqs.length;\r
+    SequenceI[] hseqs = av.alignment.getHiddenSequences().hiddenSequences;\r
+    //Use this method here instead of calling hiddenSeq adjust\r
+    //3 times.\r
+    int hSize = hseqs.length;\r
 \r
-      int hiddenIndex = i;\r
-      int lastIndex = i - 1;\r
-      int nextIndex = i + 1;\r
+    int hiddenIndex = i;\r
+    int lastIndex = i - 1;\r
+    int nextIndex = i + 1;\r
 \r
-      for(int j=0; j<hSize; j++)\r
+    for (int j = 0; j < hSize; j++)\r
+    {\r
+      if (hseqs[j] != null)\r
       {\r
-        if (hseqs[j] != null)\r
+        if (j - 1 < hiddenIndex)\r
         {\r
-          if(j-1<hiddenIndex)\r
-            hiddenIndex++;\r
-          if(j-1<lastIndex)\r
-            lastIndex++;\r
-          if(j-1<nextIndex)\r
-            nextIndex++;\r
+          hiddenIndex++;\r
         }\r
-      }\r
-\r
-      boolean below = (hiddenIndex > lastIndex + 1);\r
-      boolean above = (nextIndex > hiddenIndex+1);\r
-\r
-\r
-        gg.setColor(Color.blue);\r
-        if(below)\r
+        if (j - 1 < lastIndex)\r
         {\r
-          gg.fillPolygon(new int[]\r
-                         {getWidth()- av.charHeight,\r
-                         getWidth()- av.charHeight,\r
-                         getWidth()},\r
-                         new int[]\r
-                         {\r
-                         (i - starty) * av.charHeight +yoffset,\r
-                         (i - starty) * av.charHeight +yoffset+ av.charHeight / 4,\r
-                         (i - starty) * av.charHeight+yoffset\r
-          }, 3);\r
+          lastIndex++;\r
         }\r
-        if(above)\r
+        if (j - 1 < nextIndex)\r
         {\r
-          gg.fillPolygon(new int[]\r
-                        {getWidth()- av.charHeight,\r
-                        getWidth()- av.charHeight,\r
-                        getWidth() },\r
-                        new int[]\r
-                        {\r
-                        (i - starty+1) * av.charHeight +yoffset,\r
-                        (i - starty+1) * av.charHeight +yoffset- av.charHeight / 4,\r
-                        (i - starty+1) * av.charHeight +yoffset\r
-         }, 3);\r
-\r
+          nextIndex++;\r
         }\r
+      }\r
     }\r
 \r
-    void setHiddenFont(SequenceI seq)\r
-    {\r
-      Font bold = new Font(av.getFont().getName(), Font.BOLD,\r
-                           av.getFont().getSize());\r
+    boolean below = (hiddenIndex > lastIndex + 1);\r
+    boolean above = (nextIndex > hiddenIndex + 1);\r
 \r
+    gg.setColor(Color.blue);\r
+    if (below)\r
+    {\r
+      gg.fillPolygon(new int[]\r
+                     {getWidth() - av.charHeight,\r
+                     getWidth() - av.charHeight,\r
+                     getWidth()},\r
+                     new int[]\r
+                     {\r
+                     (i - starty) * av.charHeight + yoffset,\r
+                     (i - starty) * av.charHeight + yoffset + av.charHeight / 4,\r
+                     (i - starty) * av.charHeight + yoffset\r
+      }, 3);\r
+    }\r
+    if (above)\r
+    {\r
+      gg.fillPolygon(new int[]\r
+                     {getWidth() - av.charHeight,\r
+                     getWidth() - av.charHeight,\r
+                     getWidth()},\r
+                     new int[]\r
+                     {\r
+                     (i - starty + 1) * av.charHeight + yoffset,\r
+                     (i - starty + 1) * av.charHeight + yoffset -\r
+                     av.charHeight / 4,\r
+                     (i - starty + 1) * av.charHeight + yoffset\r
+      }, 3);\r
 \r
-      if (av.hiddenRepSequences!=null &&\r
-          av.hiddenRepSequences.containsKey(seq))\r
-        gg.setFont(bold);\r
-      else\r
-        gg.setFont(idfont);\r
     }\r
+  }\r
+\r
+  void setHiddenFont(SequenceI seq)\r
+  {\r
+    Font bold = new Font(av.getFont().getName(), Font.BOLD,\r
+                         av.getFont().getSize());\r
 \r
-    /**\r
-     * DOCUMENT ME!\r
-     *\r
-     * @param found DOCUMENT ME!\r
-     */\r
-    public void setHighlighted(java.util.Vector found)\r
+    if (av.hiddenRepSequences != null &&\r
+        av.hiddenRepSequences.containsKey(seq))\r
     {\r
-        searchResults = found;\r
-        repaint();\r
+      gg.setFont(bold);\r
+    }\r
+    else\r
+    {\r
+      gg.setFont(idfont);\r
     }\r
+  }\r
+\r
+  /**\r
+   * DOCUMENT ME!\r
+   *\r
+   * @param found DOCUMENT ME!\r
+   */\r
+  public void setHighlighted(java.util.Vector found)\r
+  {\r
+    searchResults = found;\r
+    repaint();\r
+  }\r
 }\r