JAL-3364 submenu for Export Split Frame Image
authorgmungoc <g.m.carstairs@dundee.ac.uk>
Mon, 15 Jul 2019 08:24:08 +0000 (09:24 +0100)
committergmungoc <g.m.carstairs@dundee.ac.uk>
Mon, 15 Jul 2019 08:24:08 +0000 (09:24 +0100)
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/jbgui/GAlignFrame.java
src/jalview/util/ImageMaker.java

index d2d8e88..44125a6 100644 (file)
@@ -689,6 +689,7 @@ 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.vamsas_store = VAMSAS store
 label.translate_cDNA = Translate as cDNA
 label.reverse = Reverse
index e9e18ce..80c15ab 100644 (file)
@@ -639,6 +639,7 @@ 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.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 3fad3de..73d8148 100644 (file)
@@ -36,6 +36,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;
@@ -1149,7 +1150,17 @@ 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 borderBottomOffset = 5;
     long pSessionId = System.currentTimeMillis();
@@ -1166,13 +1177,17 @@ public class AlignmentPanel extends GAlignmentPanel implements
     }
     try
     {
-      // todo splitFrame a parameter (optional menu item choice)
-      boolean splitFrame = av.getCodingComplement() != null;
+      /*
+       * 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 (splitFrame)
+      if (forSplitFrame)
       {
-        AlignmentPanel comp = ((AlignViewport) av.getCodingComplement())
+        comp = ((AlignViewport) av.getCodingComplement())
                 .getAlignPanel();
         dim2 = comp.getAlignmentDimension();
       }
@@ -1180,14 +1195,13 @@ public class AlignmentPanel extends GAlignmentPanel implements
               + borderBottomOffset;
       final int graphicsWidth = Math.max(dim1.width, dim2.width);
 
-      jalview.util.ImageMaker im;
       final String imageAction, imageTitle;
-      if (type == jalview.util.ImageMaker.TYPE.PNG)
+      if (type == ImageMaker.TYPE.PNG)
       {
         imageAction = "Create PNG image from alignment";
         imageTitle = null;
       }
-      else if (type == jalview.util.ImageMaker.TYPE.EPS)
+      else if (type == ImageMaker.TYPE.EPS)
       {
         imageAction = "Create EPS file from alignment";
         imageTitle = alignFrame.getTitle();
@@ -1198,7 +1212,7 @@ public class AlignmentPanel extends GAlignmentPanel implements
         imageTitle = alignFrame.getTitle();
       }
 
-      im = new jalview.util.ImageMaker(this, type, imageAction,
+      ImageMaker im = new ImageMaker(this, type, imageAction,
               graphicsWidth, graphicsHeight, file,
               imageTitle, alignFrame, pSessionId, headless);
       Graphics graphics = im.getGraphics();
@@ -1218,15 +1232,13 @@ public class AlignmentPanel extends GAlignmentPanel implements
         printUnwrapped(dim1.width, dim1.height, 0, graphics, graphics);
       }
 
-      if (splitFrame)
+      if (forSplitFrame)
       {
         /*
          * append coding complement image
          * todo: always write top frame first!
          */
         graphics.translate(0, dim1.height);
-        AlignmentPanel comp = ((AlignViewport) av.getCodingComplement())
-                .getAlignPanel();
         if (av.getCodingComplement().getWrapAlignment())
         {
           comp.printWrappedAlignment(dim2.width,
@@ -1260,8 +1272,9 @@ public class AlignmentPanel extends GAlignmentPanel implements
    * <li>sequence ids</li>
    * <li>scale above, left or right if shown</li>
    * <li>sequences</li>
-   * <li>annotations, if shown</li> The alignment may be in wrapped or unwrapped
-   * mode.
+   * <li>annotations, if shown</li>
+   * </ul>
+   * The alignment may be in wrapped or unwrapped mode.
    * <ul>
    * 
    * @return
@@ -1302,24 +1315,39 @@ public class AlignmentPanel extends GAlignmentPanel implements
   }
 
   /**
-   * 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(ImageMaker.TYPE.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(ImageMaker.TYPE.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(ImageMaker.TYPE.SVG, svgFile, forSplitFrame);
   }
 
   public void makePNGImageMap(File imgMapFile, String imageName)
index 075b490..8e21cbe 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,8 +2690,9 @@ 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. Also makes the 'export split frame
+   * image' menu visible.
    * 
    * @param sf
    */
@@ -2674,6 +2703,7 @@ public class GAlignFrame extends JInternalFrame
     {
       this.showComplementMenuItem.setVisible(true);
       this.showComplementMenuItem.setState(true);
+      this.exportSplitFrameMenu.setVisible(true);
     }
   }
 
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)