JAL-2277 refactored AlignmentPanel.printUnwrapped to simplify
authorgmungoc <g.m.carstairs@dundee.ac.uk>
Tue, 22 Nov 2016 12:22:46 +0000 (12:22 +0000)
committergmungoc <g.m.carstairs@dundee.ac.uk>
Tue, 22 Nov 2016 12:22:46 +0000 (12:22 +0000)
src/jalview/gui/AlignmentPanel.java
src/jalview/io/HtmlSvgOutput.java

index b551ad0..6554655 100644 (file)
@@ -960,7 +960,7 @@ public class AlignmentPanel extends GAlignmentPanel implements
     }
     else
     {
-      return printUnwrapped(pwidth, pheight, pi, pg);
+      return printUnwrapped(pwidth, pheight, pi, pg, pg);
     }
   }
 
@@ -981,110 +981,103 @@ public class AlignmentPanel extends GAlignmentPanel implements
    * @throws PrinterException
    *           DOCUMENT ME!
    */
-  public int printUnwrapped(int pwidth, int pheight, int pi,
-          Graphics... pg)
+  /**
+   * Draws the alignment image, including sequence ids, sequences, and
+   * annotation labels and annotations if shown, on either one or two Graphics
+   * context.
+   * 
+   * @param pageWidth
+   * @param pageHeight
+   * @param pi
+   * @param idGraphics
+   *          the graphics context for sequence ids and annotation labels
+   * @param alignmentGraphics
+   *          the graphics context for sequences and annotations (may or may not
+   *          be the same context as idGraphics)
+   * @return
+   * @throws PrinterException
+   */
+  public int printUnwrapped(int pageWidth, int pageHeight, int pi,
+          Graphics idGraphics, Graphics alignmentGraphics)
           throws PrinterException
   {
-    boolean isMultiGraphics = pg.length > 1;
-    int G0 = 0; // Graphic index of idPanel graphics in multi-graphics mode or
-                // entire graphics for non mulit-graphics mode
-    int G1 = 0; // Graphic index of alignmentPanel graphics for multi-graphics
-                // mode
-    if (isMultiGraphics)
-    {
-      G0 = 0;
-      G1 = 1;
-    }
+    final int idWidth = getVisibleIdWidth(false);
 
-    int idWidth = getVisibleIdWidth(false);
-    FontMetrics fm = getFontMetrics(av.getFont());
-    int scaleHeight = av.getCharHeight() + fm.getDescent();
-
-    pg[G0].setColor(Color.white);
-    pg[G0].fillRect(0, 0, pwidth, pheight);
-    pg[G0].setFont(av.getFont());
-
-    // //////////////////////////////////
-    // / How many sequences and residues can we fit on a printable page?
-    int totalRes = (pwidth - idWidth) / av.getCharWidth();
+    /*
+     * Get the horizontal offset to where we draw the sequences.
+     * This is idWidth if using a single Graphics context, else zero.
+     */
+    final int alignmentGraphicsOffset = idGraphics != alignmentGraphics ? 0 : idWidth;
 
-    int totalSeq = (pheight - scaleHeight) / av.getCharHeight() - 1;
+    FontMetrics fm = getFontMetrics(av.getFont());
+    int charHeight = av.getCharHeight();
+    int scaleHeight = charHeight + fm.getDescent();
 
-    int pagesWide = (av.getAlignment().getWidth() / totalRes) + 1;
+    idGraphics.setColor(Color.white);
+    idGraphics.fillRect(0, 0, pageWidth, pageHeight);
+    idGraphics.setFont(av.getFont());
 
-    // ///////////////////////////
-    // / Only print these sequences and residues on this page
-    int startRes;
+    /*
+     * How many sequences and residues can we fit on a printable page?
+     */
+    int totalRes = (pageWidth - idWidth) / av.getCharWidth();
 
-    // ///////////////////////////
-    // / Only print these sequences and residues on this page
-    int endRes;
+    int totalSeq = (pageHeight - scaleHeight) / charHeight - 1;
 
-    // ///////////////////////////
-    // / Only print these sequences and residues on this page
-    int startSeq;
+    int alignmentWidth = av.getAlignment().getWidth();
+    int pagesWide = (alignmentWidth / totalRes) + 1;
 
-    // ///////////////////////////
-    // / Only print these sequences and residues on this page
-    int endSeq;
-    startRes = (pi % pagesWide) * totalRes;
-    endRes = (startRes + totalRes) - 1;
+    final int startRes = (pi % pagesWide) * totalRes;
+    int endRes = (startRes + totalRes) - 1;
 
-    if (endRes > (av.getAlignment().getWidth() - 1))
+    if (endRes > (alignmentWidth - 1))
     {
-      endRes = av.getAlignment().getWidth() - 1;
+      endRes = alignmentWidth - 1;
     }
 
-    startSeq = (pi / pagesWide) * totalSeq;
-    endSeq = startSeq + totalSeq;
+    final int startSeq = (pi / pagesWide) * totalSeq;
+    int endSeq = startSeq + totalSeq;
 
-    if (endSeq > av.getAlignment().getHeight())
+    int alignmentHeight = av.getAlignment().getHeight();
+    if (endSeq > alignmentHeight)
     {
-      endSeq = av.getAlignment().getHeight();
+      endSeq = alignmentHeight;
     }
 
-    int pagesHigh = ((av.getAlignment().getHeight() / totalSeq) + 1)
-            * pheight;
+    int pagesHigh = ((alignmentHeight / totalSeq) + 1)
+            * pageHeight;
 
     if (av.isShowAnnotation())
     {
       pagesHigh += getAnnotationPanel().adjustPanelHeight() + 3;
     }
 
-    pagesHigh /= pheight;
+    pagesHigh /= pageHeight;
 
     if (pi >= (pagesWide * pagesHigh))
     {
       return Printable.NO_SUCH_PAGE;
     }
+    final int alignmentDrawnHeight = (endSeq - startSeq) * charHeight
+            + 3;
 
-    // draw Scale
-    if (isMultiGraphics)
-    {
-      pg[G1].translate(0, 0);
-      getScalePanel().drawScale(pg[G1], startRes, endRes,
-              pwidth - idWidth, scaleHeight);
-      pg[G1].translate(-idWidth, scaleHeight);
-    }
-    else
-    {
-      pg[G0].translate(idWidth, 0);
-      getScalePanel().drawScale(pg[G0], startRes, endRes, pwidth - idWidth,
-              scaleHeight);
-      pg[G0].translate(-idWidth, scaleHeight);
-    }
+    /*
+     * draw the Scale at horizontal offset, then reset to origin
+     */
+    alignmentGraphics.translate(alignmentGraphicsOffset, 0);
+    getScalePanel().drawScale(alignmentGraphics, startRes, endRes,
+            pageWidth - idWidth, scaleHeight);
+    alignmentGraphics.translate(-alignmentGraphicsOffset, 0);
 
-    // //////////////
-    // Draw the ids
+    /*
+     * Draw the sequence ids, offset for scale height,
+     * then reset to origin
+     */
+    idGraphics.translate(0, scaleHeight);
+    idGraphics.setFont(getIdPanel().getIdCanvas().getIdfont());
     Color currentColor = null;
     Color currentTextColor = null;
 
-    if (isMultiGraphics)
-    {
-      pg[G0].translate(0, scaleHeight);
-    }
-    pg[G0].setFont(getIdPanel().getIdCanvas().getIdfont());
-
     SequenceI seq;
     for (int i = startSeq; i < endSeq; i++)
     {
@@ -1092,6 +1085,9 @@ public class AlignmentPanel extends GAlignmentPanel implements
       if ((av.getSelectionGroup() != null)
               && av.getSelectionGroup().getSequences(null).contains(seq))
       {
+        /*
+         * gray out ids of sequences in selection group (if any)
+         */
         currentColor = Color.gray;
         currentTextColor = Color.black;
       }
@@ -1101,70 +1097,55 @@ public class AlignmentPanel extends GAlignmentPanel implements
         currentTextColor = Color.black;
       }
 
-      pg[G0].setColor(currentColor);
-      pg[G0].fillRect(0, (i - startSeq) * av.getCharHeight(), idWidth,
-              av.getCharHeight());
+      idGraphics.setColor(currentColor);
+      idGraphics.fillRect(0, (i - startSeq) * charHeight, idWidth,
+              charHeight);
 
-      pg[G0].setColor(currentTextColor);
+      idGraphics.setColor(currentTextColor);
 
       int xPos = 0;
+      String displayId = seq.getDisplayId(av.getShowJVSuffix());
       if (av.isRightAlignIds())
       {
-        fm = pg[G0].getFontMetrics();
+        fm = idGraphics.getFontMetrics();
         xPos = idWidth
-                - fm.stringWidth(seq.getDisplayId(av.getShowJVSuffix()))
+                - fm.stringWidth(displayId)
                 - 4;
       }
 
-      pg[G0].drawString(seq.getDisplayId(av.getShowJVSuffix()), xPos,
-              (((i - startSeq) * av.getCharHeight()) + av.getCharHeight())
-                      - (av.getCharHeight() / 5));
+      idGraphics.drawString(displayId, xPos,
+              (((i - startSeq) * charHeight) + charHeight)
+                      - (charHeight / 5));
     }
+    idGraphics.setFont(av.getFont());
+    idGraphics.translate(0, -scaleHeight);
 
-    pg[G0].setFont(av.getFont());
-
-
-    // draw main sequence panel
-    pg[G0].translate(idWidth, 0);
-    if (isMultiGraphics)
-    {
-      pg[G1].translate(idWidth, 0);
-      getSeqPanel().seqCanvas.drawPanel(pg[G1], startRes, endRes,
-              startSeq, endSeq, 0);
-    }
-    else
-    {
-      getSeqPanel().seqCanvas.drawPanel(pg[G0], startRes, endRes, startSeq,
-              endSeq, 0);
-    }
+    /*
+     * draw the sequences, offset for scale height, and id width (if using a
+     * single graphics context), then reset to origin + scale height
+     */
+    alignmentGraphics.translate(alignmentGraphicsOffset, scaleHeight);
+    getSeqPanel().seqCanvas.drawPanel(alignmentGraphics, startRes, endRes,
+            startSeq, endSeq, 0);
+    alignmentGraphics.translate(-alignmentGraphicsOffset, 0);
 
-    if (av.isShowAnnotation() && (endSeq == av.getAlignment().getHeight()))
+    if (av.isShowAnnotation() && (endSeq == alignmentHeight))
     {
-      // draw annotation label - need to offset for current scroll position
+      /*
+       * draw annotation labels, offset for current scroll position
+       * then reset to origin + scale height
+       */
       int offset = -getAlabels().getScrollOffset();
-      pg[G0].translate(0, offset);
-      pg[G0].translate(-idWidth - 3,
-              (endSeq - startSeq) * av.getCharHeight() + 3);
-      getAlabels().drawComponent(pg[G0], idWidth);
-      pg[G0].translate(idWidth + 3, 0);
-      pg[G0].translate(0, -offset);
-      if (isMultiGraphics)
-      {
-        // draw annotation - need to offset for current scroll position
-        // pg[G1].translate(0, offset);
-        pg[G1].translate(-idWidth - 3,
-                (endSeq - startSeq) * av.getCharHeight() + 3);
-        pg[G1].translate(idWidth + 3, 0);
-        getAnnotationPanel().renderer.drawComponent(getAnnotationPanel(),
-                av, pg[G1], -1, startRes, endRes + 1);
-        pg[G1].translate(0, -offset);
-      }
-      else
-      {
-        getAnnotationPanel().renderer.drawComponent(getAnnotationPanel(),
-                av, pg[G0], -1, startRes, endRes + 1);
-        pg[G0].translate(0, -offset);
-      }
+      idGraphics.translate(0, offset + alignmentDrawnHeight);
+      getAlabels().drawComponent(idGraphics, idWidth);
+      idGraphics.translate(0, -offset - alignmentDrawnHeight);
+
+      /*
+       * draw the annotations
+       */
+      alignmentGraphics.translate(alignmentGraphicsOffset, alignmentDrawnHeight);
+      getAnnotationPanel().renderer.drawComponent(getAnnotationPanel(), av,
+              alignmentGraphics, -1, startRes, endRes + 1);
     }
 
     return Printable.PAGE_EXISTS;
@@ -1363,22 +1344,23 @@ public class AlignmentPanel extends GAlignmentPanel implements
                 aDimension.getWidth(), aDimension.getHeight()
                         + boarderBottomOffset, file, imageTitle,
                 alignFrame, pSessionId, headless);
+        Graphics graphics = im.getGraphics();
         if (av.getWrapAlignment())
         {
-          if (im.getGraphics() != null)
+          if (graphics != null)
           {
             printWrappedAlignment(aDimension.getWidth(),
                     aDimension.getHeight() + boarderBottomOffset, 0,
-                    im.getGraphics());
+                    graphics);
             im.writeImage();
           }
         }
         else
         {
-          if (im.getGraphics() != null)
+          if (graphics != null)
           {
             printUnwrapped(aDimension.getWidth(), aDimension.getHeight(),
-                    0, im.getGraphics());
+                    0, graphics, graphics);
             im.writeImage();
           }
         }
index e60824a..b01f11f 100644 (file)
@@ -158,10 +158,12 @@ public class HtmlSvgOutput extends HTMLOutput
             "Hypertext Markup Language");
   }
 
-  public int printUnwrapped(int pwidth, int pheight, int pi, Graphics... pg)
+  public int printUnwrapped(int pwidth, int pheight, int pi,
+          Graphics idGraphics, Graphics alignmentGraphics)
           throws PrinterException
   {
-    return ap.printUnwrapped(pwidth, pheight, pi, pg);
+    return ap.printUnwrapped(pwidth, pheight, pi, idGraphics,
+            alignmentGraphics);
   }
 
   public int printWrapped(int pwidth, int pheight, int pi, Graphics... pg)