JAL-2665 Changes for review comments; printing with selgroup working
[jalview.git] / src / jalview / gui / SeqCanvas.java
index c6a8825..955a9e6 100755 (executable)
@@ -79,6 +79,8 @@ public class SeqCanvas extends JComponent implements ViewportListenerI
 
   boolean fastpainting = false;
 
+  AnnotationPanel annotations;
+
   /**
    * Creates a new SeqCanvas object.
    * 
@@ -369,8 +371,9 @@ public class SeqCanvas extends JComponent implements ViewportListenerI
             ranges.getStartRes(), ranges.getEndRes(),
             ranges.getStartSeq(), ranges.getEndSeq());
 
-    if (fastPaint || (getVisibleRect().width != g.getClipBounds().width)
-            || (getVisibleRect().height != g.getClipBounds().height))
+    if ((img != null) && (fastPaint
+            || (getVisibleRect().width != g.getClipBounds().width)
+            || (getVisibleRect().height != g.getClipBounds().height)))
     {
       BufferedImage lcimg = buildLocalImage(selectImage);
       g.drawImage(lcimg, 0, 0, this);
@@ -417,6 +420,31 @@ public class SeqCanvas extends JComponent implements ViewportListenerI
     }
   }
 
+  /**
+   * Draw an alignment panel for printing
+   * 
+   * @param g1
+   *          Graphics object to draw with
+   * @param startRes
+   *          start residue of print area
+   * @param endRes
+   *          end residue of print area
+   * @param startSeq
+   *          start sequence of print area
+   * @param endSeq
+   *          end sequence of print area
+   */
+  public void drawPanelForPrint(Graphics g1, int startRes, int endRes,
+          int startSeq, int endSeq)
+  {
+    BufferedImage selectImage = drawSelectionGroup(startRes, endRes,
+            startSeq, endSeq);
+    drawPanel(g1, startRes, endRes, startSeq, endSeq, 0);
+    ((Graphics2D) g1).setComposite(
+            AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
+    g1.drawImage(selectImage, 0, 0, this);
+  }
+
   /*
    * Make a local image by combining the cached image img
    * with any selection
@@ -441,12 +469,9 @@ public class SeqCanvas extends JComponent implements ViewportListenerI
     return lcimg;
   }
 
-  private void paintSeqGroup()
-  {
-    fastPaint = true;
-    repaint();
-  }
-
+  /*
+   * Set up a buffered image of the correct height and size for the sequence canvas
+   */
   private BufferedImage setupImage()
   {
     BufferedImage lcimg = null;
@@ -470,7 +495,7 @@ public class SeqCanvas extends JComponent implements ViewportListenerI
     {
       System.gc();
       System.err.println(
-              "Selection Group image OutOfMemory Redraw Error.\n" + er);
+              "Group image OutOfMemory Redraw Error.\n" + er);
       new OOMWarning("Creating alignment image for display", er);
 
       return null;
@@ -738,8 +763,6 @@ public class SeqCanvas extends JComponent implements ViewportListenerI
     }
   }
 
-  AnnotationPanel annotations;
-
   int getAnnotationHeight()
   {
     if (!av.isShowAnnotation())
@@ -755,23 +778,23 @@ public class SeqCanvas extends JComponent implements ViewportListenerI
     return annotations.adjustPanelHeight();
   }
 
-  /**
-   * DOCUMENT ME!
+  /*
+   * Draw an alignment panel for printing
    * 
    * @param g1
-   *          DOCUMENT ME!
+   *          Graphics object to draw with
    * @param startRes
-   *          DOCUMENT ME!
+   *          start residue of print area
    * @param endRes
-   *          DOCUMENT ME!
+   *          end residue of print area
    * @param startSeq
-   *          DOCUMENT ME!
+   *          start sequence of print area
    * @param endSeq
-   *          DOCUMENT ME!
+   *          end sequence of print area
    * @param offset
-   *          DOCUMENT ME!
+   *          vertical offset
    */
-  public void drawPanel(Graphics g1, int startRes, int endRes,
+  private void drawPanel(Graphics g1, int startRes, int endRes,
           int startSeq, int endSeq, int offset)
   {
     updateViewport();
@@ -908,12 +931,7 @@ public class SeqCanvas extends JComponent implements ViewportListenerI
     // ///////////////////////////////////
 
     SequenceGroup group = null;
-
-    int sx = -1;
-    int sy = -1;
-    int ex = -1;
     int groupIndex = -1;
-    int visWidth = (endRes - startRes + 1) * charWidth;
 
     if (av.getAlignment().getGroups().size() > 0)
     {
@@ -923,150 +941,14 @@ public class SeqCanvas extends JComponent implements ViewportListenerI
 
     if (group != null)
     {
+      g.setStroke(new BasicStroke());
+      g.setColor(group.getOutlineColour());
+      
       do
       {
-        int oldY = -1;
-        int i = 0;
-        boolean inGroup = false;
-        int top = -1;
-        int bottom = -1;
-
-        for (i = startSeq; i <= endSeq; i++)
-        {
-          // position of start residue of group relative to startRes, in pixels
-          sx = (group.getStartRes() - startRes) * charWidth;
-          sy = offset + ((i - startSeq) * charHeight);
-          // width of group in pixels
-          ex = (((group.getEndRes() + 1) - group.getStartRes()) * charWidth)
-                  - 1;
-
-          if (sx + ex < 0 || sx > visWidth)
-          {
-            continue;
-          }
-
-          if ((sx <= (endRes - startRes) * charWidth)
-                  && group.getSequences(null).contains(
-                          av.getAlignment().getSequenceAt(i)))
-          {
-            if ((bottom == -1)
-                    && !group.getSequences(null).contains(
-                            av.getAlignment().getSequenceAt(i + 1)))
-            {
-              bottom = sy + charHeight;
-            }
-
-            if (!inGroup)
-            {
-              if (((top == -1) && (i == 0))
-                      || !group.getSequences(null).contains(
-                              av.getAlignment().getSequenceAt(i - 1)))
-              {
-                top = sy;
-              }
-
-              oldY = sy;
-              inGroup = true;
-
-              g.setStroke(new BasicStroke());
-              g.setColor(group.getOutlineColour());
-            }
-          }
-          else
-          {
-            if (inGroup)
-            {
-              // if start position is visible, draw vertical line to left of
-              // group
-              if (sx >= 0 && sx < visWidth)
-              {
-                g.drawLine(sx, oldY, sx, sy);
-              }
-
-              // if end position is visible, draw vertical line to right of
-              // group
-              if (sx + ex < visWidth)
-              {
-                g.drawLine(sx + ex, oldY, sx + ex, sy);
-              }
-
-              if (sx < 0)
-              {
-                ex += sx;
-                sx = 0;
-              }
-
-              if (sx + ex > visWidth)
-              {
-                ex = visWidth;
-              }
-              else if (sx + ex >= (endRes - startRes + 1) * charWidth)
-              {
-                ex = (endRes - startRes + 1) * charWidth;
-              }
-
-              // draw horizontal line at top of group
-              if (top != -1)
-              {
-                g.drawLine(sx, top, sx + ex, top);
-                top = -1;
-              }
-
-              // draw horizontal line at bottom of group
-              if (bottom != -1)
-              {
-                g.drawLine(sx, bottom, sx + ex, bottom);
-                bottom = -1;
-              }
-
-              inGroup = false;
-            }
-          }
-        }
-
-        if (inGroup)
-        {
-          sy = offset + ((i - startSeq) * charHeight);
-          if (sx >= 0 && sx < visWidth)
-          {
-            g.drawLine(sx, oldY, sx, sy);
-          }
-
-          if (sx + ex < visWidth)
-          {
-            g.drawLine(sx + ex, oldY, sx + ex, sy);
-          }
-
-          if (sx < 0)
-          {
-            ex += sx;
-            sx = 0;
-          }
-
-          if (sx + ex > visWidth)
-          {
-            ex = visWidth;
-          }
-          else if (sx + ex >= (endRes - startRes + 1) * charWidth)
-          {
-            ex = (endRes - startRes + 1) * charWidth;
-          }
-
-          if (top != -1)
-          {
-            g.drawLine(sx, top, sx + ex, top);
-            top = -1;
-          }
-
-          if (bottom != -1)
-          {
-            g.drawLine(sx, bottom - 1, sx + ex, bottom - 1);
-            bottom = -1;
-          }
-
-          inGroup = false;
-        }
-
+        drawPartialGroupOutline(g, group, startRes, endRes, startSeq,
+                endSeq, offset);
+        
         groupIndex++;
 
         g.setStroke(new BasicStroke());
@@ -1150,7 +1032,7 @@ public class SeqCanvas extends JComponent implements ViewportListenerI
   {
     if (!av.hasHiddenColumns())
     {
-      drawSelectionGroupPart(g, group, startRes, endRes, startSeq, endSeq,
+      drawPartialGroupOutline(g, group, startRes, endRes, startSeq, endSeq,
               offset);
     }
     else
@@ -1175,7 +1057,7 @@ public class SeqCanvas extends JComponent implements ViewportListenerI
         blockEnd = hideStart - 1;
 
         g.translate(screenY * charWidth, 0);
-        drawSelectionGroupPart(g, group,
+        drawPartialGroupOutline(g, group,
                 blockStart, blockEnd, startSeq, endSeq, offset);
 
         g.translate(-screenY * charWidth, 0);
@@ -1194,7 +1076,7 @@ public class SeqCanvas extends JComponent implements ViewportListenerI
         // remaining visible region to render
         blockEnd = blockStart + (endRes - startRes) - screenY;
         g.translate(screenY * charWidth, 0);
-        drawSelectionGroupPart(g, group,
+        drawPartialGroupOutline(g, group,
                 blockStart, blockEnd, startSeq, endSeq, offset);
         
         g.translate(-screenY * charWidth, 0);
@@ -1205,7 +1087,7 @@ public class SeqCanvas extends JComponent implements ViewportListenerI
   /*
    * Draw the selection group as a separate image and overlay
    */
-  private void drawSelectionGroupPart(Graphics2D g, SequenceGroup group,
+  private void drawPartialGroupOutline(Graphics2D g, SequenceGroup group,
           int startRes, int endRes, int startSeq, int endSeq,
           int verticalOffset)
   {
@@ -1283,6 +1165,8 @@ public class SeqCanvas extends JComponent implements ViewportListenerI
             sx = 0;
           }
 
+          // don't let width extend beyond current block, or group extent
+          // fixes JAL-2672
           if (sx + xwidth >= (endRes - startRes + 1) * charWidth)
           {
             xwidth = (endRes - startRes + 1) * charWidth - sx;
@@ -1350,7 +1234,7 @@ public class SeqCanvas extends JComponent implements ViewportListenerI
       inGroup = false;
     }
   }
-
+  
   /**
    * DOCUMENT ME!
    * 
@@ -1373,7 +1257,8 @@ public class SeqCanvas extends JComponent implements ViewportListenerI
 
     if (eventName.equals(SequenceGroup.SEQ_GROUP_CHANGED))
     {
-      paintSeqGroup();
+      fastPaint = true;
+      repaint();
     }
     else if (av.getWrapAlignment())
     {