Merge branch 'develop' into feature/JAL-3364splitFrameImage
authorgmungoc <g.m.carstairs@dundee.ac.uk>
Mon, 29 Jul 2019 14:52:25 +0000 (15:52 +0100)
committergmungoc <g.m.carstairs@dundee.ac.uk>
Mon, 29 Jul 2019 14:52:25 +0000 (15:52 +0100)
14 files changed:
resources/lang/Messages.properties
resources/lang/Messages_es.properties
src/jalview/bin/Jalview.java
src/jalview/gui/AlignFrame.java
src/jalview/gui/AlignmentPanel.java
src/jalview/gui/AppJmol.java
src/jalview/gui/PCAPanel.java
src/jalview/gui/SeqCanvas.java
src/jalview/gui/SplitFrame.java
src/jalview/io/HtmlSvgOutput.java
src/jalview/jbgui/GAlignFrame.java
src/jalview/math/AlignmentDimension.java
src/jalview/renderer/AnnotationRenderer.java
src/jalview/util/ImageMaker.java

index d2d8e88..ca3cd0e 100644 (file)
@@ -689,6 +689,8 @@ label.show_non_positional_features = Show Non-Positional Features
 label.save_png_image = Save As PNG Image
 label.load_tree_for_sequence_set = Load a tree for this sequence set
 label.export_image = Export Image
+label.export_split_frame = Export Split Frame Image
+label.export_tooltip = Alignments image with {0} above
 label.vamsas_store = VAMSAS store
 label.translate_cDNA = Translate as cDNA
 label.reverse = Reverse
@@ -1232,6 +1234,9 @@ label.sifts_mapping = SIFTs Mapping
 label.mapping_method = Sequence \u27f7 Structure mapping method
 status.waiting_for_user_to_select_output_file = Waiting for user to select {0} file
 status.cancelled_image_export_operation = Cancelled {0} export operation
+label.make_alignment_image = Create {0} image from alignment
+label.make_pca_image = Make {0} image from PCA
+label.make_pdb_image = Make {0} image from view
 info.error_creating_file = Error creating {0} file
 exception.outofmemory_loading_mmcif_file = Out of memory loading mmCIF File
 label.run_groovy = Run Groovy console script
index e9e18ce..2d2872a 100644 (file)
@@ -639,6 +639,8 @@ label.show_non_positional_features = Mostrar las caracter
 label.save_png_image = Guardar como imagen PNG
 label.load_tree_for_sequence_set = Cargar un árbol para este conjunto de secuencias
 label.export_image = Exportar imagen
+label.export_split_frame = Exportar imagen de la ventana dividida
+label.export_tooltipe = Imagen de alineamientos con {0} arriba
 label.vamsas_store = Almacén VAMSAS
 label.translate_cDNA = Traducir cDNA
 label.extract_scores = Extraer puntuaciones
index ca2a584..4bf811a 100755 (executable)
@@ -593,7 +593,7 @@ public class Jalview
 
           if (outputFormat.equalsIgnoreCase("png"))
           {
-            af.createPNG(new File(file));
+            af.createPNG(new File(file), false);
             imageName = (new File(file)).getName();
             System.out.println("Creating PNG image: " + file);
             continue;
@@ -648,7 +648,7 @@ public class Jalview
             File outputFile = new File(file);
             System.out.println(
                     "Creating EPS file: " + outputFile.getAbsolutePath());
-            af.createEPS(outputFile);
+            af.createEPS(outputFile, false);
             continue;
           }
 
index fcb6572..235a5c8 100644 (file)
@@ -1358,33 +1358,35 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   }
 
   /**
-   * DOCUMENT ME!
+   * Creates and writes a PNG image of the alignment, to the given file if
+   * specified, else after prompting for the output file
    * 
-   * @param e
-   *          DOCUMENT ME!
+   * @param f
+   * @param forSplitFrame
    */
   @Override
-  public void createPNG(File f)
+  public void createPNG(File f, boolean forSplitFrame)
   {
-    alignPanel.makePNG(f);
+    alignPanel.makePNG(f, forSplitFrame);
   }
 
   /**
-   * DOCUMENT ME!
+   * Creates and writes an EPS image of the alignment, to the given file if
+   * specified, else after prompting for the output file
    * 
-   * @param e
-   *          DOCUMENT ME!
+   * @param f
+   * @param forSplitFrame
    */
   @Override
-  public void createEPS(File f)
+  public void createEPS(File f, boolean forSplitFrame)
   {
-    alignPanel.makeEPS(f);
+    alignPanel.makeEPS(f, forSplitFrame);
   }
 
   @Override
   public void createSVG(File f)
   {
-    alignPanel.makeSVG(f);
+    alignPanel.makeSVG(f, false);
   }
 
   @Override
index ea8fcdc..5c0d3a1 100644 (file)
  */
 package jalview.gui;
 
+import static jalview.util.ImageMaker.TYPE.EPS;
+import static jalview.util.ImageMaker.TYPE.PNG;
+import static jalview.util.ImageMaker.TYPE.SVG;
+
 import jalview.analysis.AnnotationSorter;
 import jalview.api.AlignViewportI;
 import jalview.api.AlignmentViewPanel;
@@ -36,6 +40,7 @@ import jalview.math.AlignmentDimension;
 import jalview.schemes.ResidueProperties;
 import jalview.structure.StructureSelectionManager;
 import jalview.util.Comparison;
+import jalview.util.ImageMaker;
 import jalview.util.MessageManager;
 import jalview.viewmodel.ViewportListenerI;
 import jalview.viewmodel.ViewportRanges;
@@ -871,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)
@@ -896,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
     {
@@ -1029,6 +1033,11 @@ public class AlignmentPanel extends GAlignmentPanel implements
               alignmentDrawnHeight);
       getAnnotationPanel().renderer.drawComponent(getAnnotationPanel(), av,
               alignmentGraphics, -1, startRes, endRes + 1);
+
+      /*
+       * reset to left margin
+       */
+      alignmentGraphics.translate(-alignmentGraphicsOffset, 0);
     }
 
     return Printable.PAGE_EXISTS;
@@ -1038,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)
   {
     getSeqPanel().seqCanvas.calculateWrappedGeometry(getWidth(),
             getHeight());
@@ -1092,7 +1107,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)
@@ -1101,9 +1119,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)
     {
@@ -1152,9 +1170,19 @@ public class AlignmentPanel extends GAlignmentPanel implements
     return idwidth.intValue() + 4;
   }
 
-  void makeAlignmentImage(jalview.util.ImageMaker.TYPE type, File file)
+  /**
+   * Generates an image of the alignment panel of the specified type. If
+   * {@code type} is not null, the image is written to the file, otherwise the
+   * user is prompted to specify the output file before writing to it.
+   * 
+   * @param type
+   * @param file
+   * @param forSplitFrame
+   */
+  void makeAlignmentImage(ImageMaker.TYPE type, File file,
+          boolean forSplitFrame)
   {
-    int boarderBottomOffset = 5;
+    int borderBottomOffset = 5;
     long pSessionId = System.currentTimeMillis();
     headless = (System.getProperty("java.awt.headless") != null
             && System.getProperty("java.awt.headless").equals("true"));
@@ -1169,69 +1197,98 @@ public class AlignmentPanel extends GAlignmentPanel implements
     }
     try
     {
-      AlignmentDimension aDimension = getAlignmentDimension();
-      try
+      /*
+       * if exporting a split frame image, the graphics object has 
+       * width: maximum of the top and bottom image widths
+       * height: sum of the top and bottom image heights
+       */
+      AlignmentPanel comp = null;
+      AlignmentDimension dim1 = getAlignmentDimension();
+      AlignmentDimension dim2 = new AlignmentDimension(0, 0);
+      if (forSplitFrame)
       {
-        jalview.util.ImageMaker im;
-        final String imageAction, imageTitle;
-        if (type == jalview.util.ImageMaker.TYPE.PNG)
-        {
-          imageAction = "Create PNG image from alignment";
-          imageTitle = null;
-        }
-        else if (type == jalview.util.ImageMaker.TYPE.EPS)
-        {
-          imageAction = "Create EPS file from alignment";
-          imageTitle = alignFrame.getTitle();
-        }
-        else
-        {
-          imageAction = "Create SVG file from alignment";
-          imageTitle = alignFrame.getTitle();
-        }
+        comp = ((AlignViewport) av.getCodingComplement())
+                .getAlignPanel();
+        dim2 = comp.getAlignmentDimension();
+      }
+      final int graphicsHeight = dim1.height + dim2.height
+              + borderBottomOffset;
+      final int graphicsWidth = Math.max(dim1.width, dim2.width);
+
+      final String dialogTitle = MessageManager
+              .formatMessage("label.make_alignment_image", type.getName());
+      String imageTitle = type == PNG ? null : alignFrame.getTitle();
+
+      ImageMaker im = new ImageMaker(this, type, dialogTitle,
+              graphicsWidth, graphicsHeight, file,
+              imageTitle, alignFrame, pSessionId, headless);
+      Graphics graphics = im.getGraphics();
+      if (graphics == null)
+      {
+        return;
+      }
+      graphics.setColor(Color.white);
+      graphics.fillRect(0, 0, graphicsWidth, graphicsHeight);
+      if (av.getWrapAlignment())
+      {
+        printWrappedAlignment(dim1.width, dim1.height + borderBottomOffset,
+                0, graphics, false);
+      }
+      else
+      {
+        printUnwrapped(dim1.width, dim1.height, 0, graphics, graphics);
+      }
 
-        im = new jalview.util.ImageMaker(this, type, imageAction,
-                aDimension.getWidth(),
-                aDimension.getHeight() + boarderBottomOffset, file,
-                imageTitle, alignFrame, pSessionId, headless);
-        Graphics graphics = im.getGraphics();
-        if (av.getWrapAlignment())
+      if (forSplitFrame)
+      {
+        /*
+         * append coding complement image
+         */
+        /*
+         * to debug location of next write to Graphics
+         */
+        // graphics.setColor(Color.red);
+        // graphics.drawString("Hello world", 0, 0);
+        if (av.getCodingComplement().getWrapAlignment())
         {
-          if (graphics != null)
-          {
-            printWrappedAlignment(aDimension.getWidth(),
-                    aDimension.getHeight() + boarderBottomOffset, 0,
-                    graphics);
-            im.writeImage();
-          }
+          comp.printWrappedAlignment(dim2.width,
+                  dim2.height + borderBottomOffset, 0, graphics, false);
         }
         else
         {
-          if (graphics != null)
-          {
-            printUnwrapped(aDimension.getWidth(), aDimension.getHeight(), 0,
-                    graphics, graphics);
-            im.writeImage();
-          }
+          comp.printUnwrapped(dim2.width, dim2.height, 0, graphics,
+                  graphics);
         }
-
-      } catch (OutOfMemoryError err)
-      {
-        // Be noisy here.
-        System.out.println("########################\n" + "OUT OF MEMORY "
-                + file + "\n" + "########################");
-        new OOMWarning("Creating Image for " + file, err);
-        // System.out.println("Create IMAGE: " + err);
-      } catch (Exception ex)
-      {
-        ex.printStackTrace();
       }
-    } finally
-    {
 
+      im.writeImage();
+    } catch (OutOfMemoryError err)
+    {
+      // Be noisy here.
+      System.out.println("########################\n" + "OUT OF MEMORY "
+              + file + "\n" + "########################");
+      new OOMWarning("Creating Image for " + file, err);
+      // System.out.println("Create IMAGE: " + err);
+    } catch (Exception ex)
+    {
+      ex.printStackTrace();
     }
   }
 
+  /**
+   * Computes and answers the width and height of the alignment in pixels,
+   * including
+   * <ul>
+   * <li>sequence ids</li>
+   * <li>scale above, left or right if shown</li>
+   * <li>sequences</li>
+   * <li>annotations, if shown</li>
+   * </ul>
+   * The alignment may be in wrapped or unwrapped mode.
+   * <ul>
+   * 
+   * @return
+   */
   public AlignmentDimension getAlignmentDimension()
   {
     int maxwidth = av.getAlignment().getVisibleWidth();
@@ -1263,29 +1320,44 @@ public class AlignmentPanel extends GAlignmentPanel implements
     {
       height += getAnnotationPanel().adjustPanelHeight() + 3;
     }
-    return new AlignmentDimension(width, height);
 
+    return new AlignmentDimension(width, height);
   }
 
   /**
-   * DOCUMENT ME!
+   * Creates and writes an EPS image of the alignment, to the given file if
+   * specified, else after prompting for the output file
+   * 
+   * @param epsFile
+   * @param forSplitFrame
    */
-  public void makeEPS(File epsFile)
+  public void makeEPS(File epsFile, boolean forSplitFrame)
   {
-    makeAlignmentImage(jalview.util.ImageMaker.TYPE.EPS, epsFile);
+    makeAlignmentImage(EPS, epsFile, forSplitFrame);
   }
 
   /**
-   * DOCUMENT ME!
+   * Creates and writes a PNG image of the alignment, to the given file if
+   * specified, else after prompting for the output file
+   * 
+   * @param pngFile
+   * @param forSplitFrame
    */
-  public void makePNG(File pngFile)
+  public void makePNG(File pngFile, boolean forSplitFrame)
   {
-    makeAlignmentImage(jalview.util.ImageMaker.TYPE.PNG, pngFile);
+    makeAlignmentImage(PNG, pngFile, forSplitFrame);
   }
 
-  public void makeSVG(File svgFile)
+  /**
+   * Creates and writes an SVG image of the alignment, to the given file if
+   * specified, else after prompting for the output file
+   * 
+   * @param svgFile
+   * @param forSplitFrame
+   */
+  public void makeSVG(File svgFile, boolean forSplitFrame)
   {
-    makeAlignmentImage(jalview.util.ImageMaker.TYPE.SVG, svgFile);
+    makeAlignmentImage(SVG, svgFile, forSplitFrame);
   }
 
   public void makePNGImageMap(File imgMapFile, String imageName)
index ea7fb6b..d8564c5 100644 (file)
@@ -20,6 +20,8 @@
  */
 package jalview.gui;
 
+import static jalview.util.ImageMaker.TYPE.PNG;
+
 import jalview.bin.Cache;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.PDBEntry;
@@ -27,6 +29,7 @@ import jalview.datamodel.SequenceI;
 import jalview.gui.StructureViewer.ViewerType;
 import jalview.structures.models.AAStructureBindingModel;
 import jalview.util.BrowserLauncher;
+import jalview.util.ImageMaker;
 import jalview.util.MessageManager;
 import jalview.util.Platform;
 import jalview.ws.dbsources.Pdb;
@@ -566,27 +569,11 @@ public class AppJmol extends StructureViewerBase
     int width = getWidth();
     int height = getHeight();
 
-    jalview.util.ImageMaker im;
-
-    if (type == jalview.util.ImageMaker.TYPE.PNG)
-    {
-      im = new jalview.util.ImageMaker(this,
-              jalview.util.ImageMaker.TYPE.PNG, "Make PNG image from view",
-              width, height, null, null, null, 0, false);
-    }
-    else if (type == jalview.util.ImageMaker.TYPE.EPS)
-    {
-      im = new jalview.util.ImageMaker(this,
-              jalview.util.ImageMaker.TYPE.EPS, "Make EPS file from view",
-              width, height, null, this.getTitle(), null, 0, false);
-    }
-    else
-    {
-
-      im = new jalview.util.ImageMaker(this,
-              jalview.util.ImageMaker.TYPE.SVG, "Make SVG file from PCA",
-              width, height, null, this.getTitle(), null, 0, false);
-    }
+    String dialogTitle = MessageManager
+            .formatMessage("label.make_pdb_image", type.getName());
+    String imageTitle = type == PNG ? null : this.getTitle();
+    ImageMaker im = new ImageMaker(this, type, dialogTitle, width, height,
+            null, imageTitle, null, 0, false);
 
     if (im.getGraphics() != null)
     {
index 4f660a2..a833f98 100644 (file)
@@ -20,6 +20,8 @@
  */
 package jalview.gui;
 
+import static jalview.util.ImageMaker.TYPE.PNG;
+
 import jalview.analysis.scoremodels.ScoreModels;
 import jalview.api.AlignViewportI;
 import jalview.api.analysis.ScoreModelI;
@@ -431,25 +433,11 @@ public class PCAPanel extends GPCAPanel
     int width = getRotatableCanvas().getWidth();
     int height = getRotatableCanvas().getHeight();
 
-    ImageMaker im;
-
-    switch (type)
-    {
-    case PNG:
-      im = new ImageMaker(this, ImageMaker.TYPE.PNG,
-              "Make PNG image from PCA", width, height, null, null, null, 0,
-              false);
-      break;
-    case EPS:
-      im = new ImageMaker(this, ImageMaker.TYPE.EPS,
-              "Make EPS file from PCA", width, height, null,
-              this.getTitle(), null, 0, false);
-      break;
-    default:
-      im = new ImageMaker(this, ImageMaker.TYPE.SVG,
-              "Make SVG file from PCA", width, height, null,
-              this.getTitle(), null, 0, false);
-    }
+    String dialogTitle = MessageManager
+            .formatMessage("label.make_pca_image", type.getName());
+    String imageTitle = type == PNG ? null : this.getTitle();
+    ImageMaker im = new ImageMaker(this, type, dialogTitle, width, height,
+            null, imageTitle, null, 0, false);
 
     if (im.getGraphics() != null)
     {
index 2832796..8a587ea 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 25dedc5..b1eb6b8 100644 (file)
@@ -86,8 +86,8 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI
    */
   protected void init()
   {
-    getTopFrame().setSplitFrame(this);
-    getBottomFrame().setSplitFrame(this);
+    getTopFrame().setSplitFrame(this, true);
+    getBottomFrame().setSplitFrame(this, false);
     getTopFrame().setVisible(true);
     getBottomFrame().setVisible(true);
 
index 948578a..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,
@@ -240,9 +239,9 @@ public class HtmlSvgOutput extends HTMLOutput
               "status.exporting_alignment_as_x_file", "HTML"));
       AlignmentDimension aDimension = ap.getAlignmentDimension();
       SVGGraphics2D idPanelGraphics = new SVGGraphics2D(
-              aDimension.getWidth(), aDimension.getHeight());
+              aDimension.width, aDimension.height);
       SVGGraphics2D alignPanelGraphics = new SVGGraphics2D(
-              aDimension.getWidth(), aDimension.getHeight());
+              aDimension.width, aDimension.height);
 
       String renderStyle = jalview.bin.Cache.getDefault("HTML_RENDERING",
               "Prompt each time");
@@ -271,12 +270,12 @@ public class HtmlSvgOutput extends HTMLOutput
       }
       if (ap.av.getWrapAlignment())
       {
-        printWrapped(aDimension.getWidth(), aDimension.getHeight(), 0,
+        printWrapped(aDimension.width, aDimension.height, 0,
                 alignPanelGraphics);
       }
       else
       {
-        printUnwrapped(aDimension.getWidth(), aDimension.getHeight(), 0,
+        printUnwrapped(aDimension.width, aDimension.height, 0,
                 idPanelGraphics, alignPanelGraphics);
       }
 
index 075b490..296eb25 100755 (executable)
@@ -42,6 +42,7 @@ import java.awt.event.FocusEvent;
 import java.awt.event.KeyEvent;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
+import java.io.File;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -207,6 +208,8 @@ public class GAlignFrame extends JInternalFrame
 
   private SplitContainerI splitFrame;
 
+  protected JMenu exportSplitFrameMenu;
+
   public GAlignFrame()
   {
     try
@@ -1035,12 +1038,22 @@ public class GAlignFrame extends JInternalFrame
       @Override
       public void actionPerformed(ActionEvent e)
       {
-        createPNG(null);
+        createPNG(null, false);
       }
     });
     createPNG.setActionCommand(
             MessageManager.getString("label.save_png_image"));
 
+    JMenuItem createSplitFramePNG = new JMenuItem("PNG");
+    createSplitFramePNG.addActionListener(new ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        createPNG(null, true);
+      }
+    });
+
     JMenuItem font = new JMenuItem(MessageManager.getString("action.font"));
     font.addActionListener(new ActionListener()
     {
@@ -1061,13 +1074,22 @@ public class GAlignFrame extends JInternalFrame
         seqLimit_actionPerformed(e);
       }
     });
-    JMenuItem epsFile = new JMenuItem("EPS");
-    epsFile.addActionListener(new ActionListener()
+    JMenuItem createEPS = new JMenuItem("EPS");
+    createEPS.addActionListener(new ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        createEPS(null, false);
+      }
+    });
+    JMenuItem createSplitFrameEPS = new JMenuItem("EPS");
+    createEPS.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
       {
-        createEPS(null);
+        createEPS(null, true);
       }
     });
 
@@ -1714,6 +1736,9 @@ public class GAlignFrame extends JInternalFrame
 
     JMenu exportImageMenu = new JMenu(
             MessageManager.getString("label.export_image"));
+    exportSplitFrameMenu = new JMenu(
+            MessageManager.getString("label.export_split_frame"));
+    exportSplitFrameMenu.setVisible(false);
     JMenu fileMenu = new JMenu(MessageManager.getString("action.file"));
     alignFrameMenuBar.add(fileMenu);
     alignFrameMenuBar.add(editMenu);
@@ -1737,6 +1762,7 @@ public class GAlignFrame extends JInternalFrame
     fileMenu.add(printMenuItem);
     fileMenu.addSeparator();
     fileMenu.add(exportImageMenu);
+    fileMenu.add(exportSplitFrameMenu);
     fileMenu.add(exportFeatures);
     fileMenu.add(exportAnnotations);
     fileMenu.add(loadTreeMenuItem);
@@ -1843,10 +1869,12 @@ public class GAlignFrame extends JInternalFrame
             MessageManager.getString("label.no_services"));
     webService.add(webServiceNoServices);
     exportImageMenu.add(htmlMenuItem);
-    exportImageMenu.add(epsFile);
+    exportImageMenu.add(createEPS);
     exportImageMenu.add(createPNG);
     exportImageMenu.add(createBioJS);
     exportImageMenu.add(createSVG);
+    exportSplitFrameMenu.add(createSplitFrameEPS);
+    exportSplitFrameMenu.add(createSplitFramePNG);
     addSequenceMenu.add(addFromFile);
     addSequenceMenu.add(addFromText);
     addSequenceMenu.add(addFromURL);
@@ -2374,7 +2402,7 @@ public class GAlignFrame extends JInternalFrame
   {
   }
 
-  public void createPNG(java.io.File f)
+  public void createPNG(File f, boolean forSplitFrame)
   {
   }
 
@@ -2391,11 +2419,11 @@ public class GAlignFrame extends JInternalFrame
 
   }
 
-  public void createEPS(java.io.File f)
+  public void createEPS(File f, boolean forSplitFrame)
   {
   }
 
-  public void createSVG(java.io.File f)
+  public void createSVG(File f)
   {
 
   }
@@ -2662,18 +2690,25 @@ public class GAlignFrame extends JInternalFrame
   }
 
   /**
-   * Sets a reference to the containing split frame. Also makes the 'toggle
-   * split view' menu item visible and checked.
+   * Sets a reference to the containing split frame. Also makes the 'toggle split
+   * view' menu item visible and checked, and makes the 'export split frame image'
+   * menu visible.
    * 
    * @param sf
    */
-  public void setSplitFrame(SplitContainerI sf)
+  public void setSplitFrame(SplitContainerI sf, boolean asTopFrame)
   {
     this.splitFrame = sf;
     if (sf != null)
     {
       this.showComplementMenuItem.setVisible(true);
       this.showComplementMenuItem.setState(true);
+      this.exportSplitFrameMenu.setVisible(true);
+      String biotype = asTopFrame
+              ? MessageManager.getString("label.nucleotide")
+              : MessageManager.getString("label.protein");
+      this.exportSplitFrameMenu.setToolTipText(MessageManager
+              .formatMessage("label.export_tooltip", biotype));
     }
   }
 
index b227f98..04e5ace 100644 (file)
@@ -22,34 +22,13 @@ package jalview.math;
 
 public class AlignmentDimension
 {
-  private int width;
+  public final int width;
 
-  private int height;
+  public final int height;
 
   public AlignmentDimension(int width, int height)
   {
     this.width = width;
     this.height = height;
   }
-
-  public int getWidth()
-  {
-    return width;
-  }
-
-  public void setWidth(int width)
-  {
-    this.width = width;
-  }
-
-  public int getHeight()
-  {
-    return height;
-  }
-
-  public void setHeight(int height)
-  {
-    this.height = height;
-  }
-
 }
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;
   }
index 7232042..099bcee 100755 (executable)
@@ -76,6 +76,9 @@ public class ImageMaker
 
   private boolean headless;
 
+  /**
+   * Image format, currently either EPS, PNG or SVG
+   */
   public enum TYPE
   {
     EPS("EPS", MessageManager.getString("label.eps_file"), EPS_EXTENSION,
@@ -117,6 +120,21 @@ public class ImageMaker
 
   }
 
+  /**
+   * Constructor that prepares the image context for writing to. If {@code file}
+   * is null, the user is prompted to choose a file.
+   * 
+   * @param parent
+   * @param type
+   * @param title
+   * @param width
+   * @param height
+   * @param file
+   * @param fileTitle
+   * @param pIndicator
+   * @param pSessionId
+   * @param headless
+   */
   public ImageMaker(Component parent, TYPE type, String title, int width,
           int height, File file, String fileTitle,
           IProgressIndicator pIndicator, long pSessionId, boolean headless)