JAL-3364 export split frame image including annotations and/or wrapped
authorgmungoc <g.m.carstairs@dundee.ac.uk>
Mon, 29 Jul 2019 10:18:54 +0000 (11:18 +0100)
committergmungoc <g.m.carstairs@dundee.ac.uk>
Mon, 29 Jul 2019 10:18:54 +0000 (11:18 +0100)
src/jalview/gui/AlignmentPanel.java
src/jalview/gui/SeqCanvas.java
src/jalview/io/HtmlSvgOutput.java
src/jalview/renderer/AnnotationRenderer.java

index d387540..15bcfc1 100644 (file)
@@ -876,19 +876,18 @@ public class AlignmentPanel extends GAlignmentPanel implements
   }
 
   /**
-   * DOCUMENT ME!
+   * Provides the implementation of Printable.print
    * 
    * @param pg
-   *          DOCUMENT ME!
+   *             DOCUMENT ME!
    * @param pf
-   *          DOCUMENT ME!
+   *             DOCUMENT ME!
    * @param pi
-   *          DOCUMENT ME!
+   *             DOCUMENT ME!
    * 
    * @return DOCUMENT ME!
    * 
    * @throws PrinterException
-   *           DOCUMENT ME!
    */
   @Override
   public int print(Graphics pg, PageFormat pf, int pi)
@@ -901,7 +900,7 @@ public class AlignmentPanel extends GAlignmentPanel implements
 
     if (av.getWrapAlignment())
     {
-      return printWrappedAlignment(pwidth, pheight, pi, pg);
+      return printWrappedAlignment(pwidth, pheight, pi, pg, true);
     }
     else
     {
@@ -1048,19 +1047,25 @@ public class AlignmentPanel extends GAlignmentPanel implements
    * Prints one page of an alignment in wrapped mode. Returns
    * Printable.PAGE_EXISTS (0) if a page was drawn, or Printable.NO_SUCH_PAGE if
    * no page could be drawn (page number out of range).
+   * <p>
+   * The method is to write the whole alignment, but set a clip region such that
+   * only the specified page is written. This allows specified page(s) to be
+   * printed from the print dialog. The whole image may be written simply by
+   * making the page size match the image size. In this case, parameter
+   * {@code clipToPage} should be set to {@code false}, so that more output (for
+   * example the second panel of a split frame) can be written if wanted.
    * 
    * @param pageWidth
    * @param pageHeight
    * @param pageNumber
-   *          (0, 1, ...)
+   *                     (0, 1, ...)
    * @param g
+   * @param clipToPage
    * 
    * @return
-   * 
-   * @throws PrinterException
    */
   public int printWrappedAlignment(int pageWidth, int pageHeight, int pageNumber,
-          Graphics g) throws PrinterException
+          Graphics g, boolean clipToPage)
   {
     int annotationHeight = 0;
     if (av.isShowAnnotation())
@@ -1099,7 +1104,10 @@ public class AlignmentPanel extends GAlignmentPanel implements
      */
     g.translate(0, -pageNumber * pageHeight);
 
-    g.setClip(0, pageNumber * pageHeight, pageWidth, pageHeight);
+    if (clipToPage)
+    {
+      g.setClip(0, pageNumber * pageHeight, pageWidth, pageHeight);
+    }
 
     /*
      * draw sequence ids and annotation labels (if shown)
@@ -1108,9 +1116,9 @@ public class AlignmentPanel extends GAlignmentPanel implements
     idCanvas.drawIdsWrapped((Graphics2D) g, av, 0, totalHeight);
 
     g.translate(idWidth, 0);
-
     getSeqPanel().seqCanvas.drawWrappedPanelForPrinting(g, pageWidth - idWidth,
             totalHeight, 0);
+    g.translate(-idWidth, 0);
 
     if ((pageNumber * pageHeight) < totalHeight)
     {
@@ -1221,7 +1229,7 @@ public class AlignmentPanel extends GAlignmentPanel implements
       if (av.getWrapAlignment())
       {
         printWrappedAlignment(dim1.width, dim1.height + borderBottomOffset,
-                0, graphics);
+                0, graphics, false);
       }
       else
       {
@@ -1233,10 +1241,12 @@ public class AlignmentPanel extends GAlignmentPanel implements
         /*
          * append coding complement image
          */
-        graphics.translate(0, dim1.height);
         boolean test = true;
         if (test)
         {
+          /*
+           * debug location of next write to Graphics
+           */
           graphics.setColor(Color.red);
           graphics.drawString("Hello world", 0, 0);
           graphics.setColor(Color.black);
@@ -1244,7 +1254,7 @@ public class AlignmentPanel extends GAlignmentPanel implements
         if (av.getCodingComplement().getWrapAlignment())
         {
           comp.printWrappedAlignment(dim2.width,
-                  dim2.height + borderBottomOffset, 0, graphics);
+                  dim2.height + borderBottomOffset, 0, graphics, false);
         }
         else
         {
index b3fcc54..49ae375 100755 (executable)
@@ -464,7 +464,8 @@ public class SeqCanvas extends JComponent implements ViewportListenerI
   public void drawWrappedPanelForPrinting(Graphics g, int canvasWidth,
           int canvasHeight, int startRes)
   {
-    drawWrappedPanel(g, canvasWidth, canvasHeight, startRes);
+    int heightDrawn = drawWrappedPanel(g, canvasWidth, canvasHeight,
+            startRes);
 
     SequenceGroup group = av.getSelectionGroup();
     if (group != null)
@@ -472,6 +473,11 @@ public class SeqCanvas extends JComponent implements ViewportListenerI
       drawWrappedSelection((Graphics2D) g, group, canvasWidth, canvasHeight,
                 startRes);
     }
+
+    /*
+     * shift graphics (0, 0) to below the region drawn
+     */
+    g.translate(0, heightDrawn);
   }
 
   /**
@@ -536,18 +542,20 @@ public class SeqCanvas extends JComponent implements ViewportListenerI
   }
 
   /**
-   * Draws as many widths of a wrapped alignment as can fit in the visible
-   * window
+   * Draws as many widths of a wrapped alignment as can fit in the visible window,
+   * and returns the height drawn in pixels
    * 
    * @param g
    * @param canvasWidth
-   *          available width in pixels
+   *                       available width in pixels
    * @param canvasHeight
-   *          available height in pixels
+   *                       available height in pixels
    * @param startColumn
-   *          the first column (0...) of the alignment to draw
+   *                       the first column (0...) of the alignment to draw
+   * 
+   * @return
    */
-  public void drawWrappedPanel(Graphics g, int canvasWidth,
+  public int drawWrappedPanel(Graphics g, int canvasWidth,
           int canvasHeight, final int startColumn)
   {
     int wrappedWidthInResidues = calculateWrappedGeometry(canvasWidth,
@@ -583,6 +591,8 @@ public class SeqCanvas extends JComponent implements ViewportListenerI
     }
 
     drawWrappedDecorators(g, startColumn);
+
+    return ypos;
   }
 
   /**
@@ -696,7 +706,7 @@ public class SeqCanvas extends JComponent implements ViewportListenerI
 
     if (clip == null)
     {
-      g.setClip(0, 0, viewportWidth * charWidth, canvasHeight);
+      // g.setClip(0, 0, viewportWidth * charWidth, canvasHeight);
     }
     else
     {
@@ -730,7 +740,12 @@ public class SeqCanvas extends JComponent implements ViewportListenerI
               startColumn, endx + 1);
       g.translate(0, -yShift);
     }
-    g.setClip(clip);
+
+    if (clip != null)
+    {
+      g.setClip(clip);
+    }
+
     g.translate(-xOffset, 0);
   }
 
index 1325c10..ac2526c 100644 (file)
@@ -79,9 +79,8 @@ public class HtmlSvgOutput extends HTMLOutput
   }
 
   public int printWrapped(int pwidth, int pheight, int pi, Graphics... pg)
-          throws PrinterException
   {
-    return ap.printWrappedAlignment(pwidth, pheight, pi, pg[0]);
+    return ap.printWrappedAlignment(pwidth, pheight, pi, pg[0], false);
   }
 
   private String getHtml(String titleSvg, String alignmentSvg,
index adca17e..0a4c2d5 100644 (file)
@@ -1093,7 +1093,10 @@ public class AnnotationRenderer
       System.err.println("Annotation Rendering time:"
               + (System.currentTimeMillis() - stime));
     }
-    ;
+    if (!av.getWrapAlignment())
+    {
+      g.translate(0, y);
+    }
 
     return !usedFaded;
   }