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.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
 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.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
 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"))
           {
 
           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;
             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());
             File outputFile = new File(file);
             System.out.println(
                     "Creating EPS file: " + outputFile.getAbsolutePath());
-            af.createEPS(outputFile);
+            af.createEPS(outputFile, false);
             continue;
           }
 
             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
    */
   @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
    */
   @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)
   {
   }
 
   @Override
   public void createSVG(File f)
   {
-    alignPanel.makeSVG(f);
+    alignPanel.makeSVG(f, false);
   }
 
   @Override
   }
 
   @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.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;
 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;
   }
 
     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();
   {
     int borderBottomOffset = 5;
     long pSessionId = System.currentTimeMillis();
@@ -1166,13 +1177,17 @@ public class AlignmentPanel extends GAlignmentPanel implements
     }
     try
     {
     }
     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);
       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();
       }
                 .getAlignPanel();
         dim2 = comp.getAlignmentDimension();
       }
@@ -1180,14 +1195,13 @@ public class AlignmentPanel extends GAlignmentPanel implements
               + borderBottomOffset;
       final int graphicsWidth = Math.max(dim1.width, dim2.width);
 
               + borderBottomOffset;
       final int graphicsWidth = Math.max(dim1.width, dim2.width);
 
-      jalview.util.ImageMaker im;
       final String imageAction, imageTitle;
       final String imageAction, imageTitle;
-      if (type == jalview.util.ImageMaker.TYPE.PNG)
+      if (type == ImageMaker.TYPE.PNG)
       {
         imageAction = "Create PNG image from alignment";
         imageTitle = null;
       }
       {
         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();
       {
         imageAction = "Create EPS file from alignment";
         imageTitle = alignFrame.getTitle();
@@ -1198,7 +1212,7 @@ public class AlignmentPanel extends GAlignmentPanel implements
         imageTitle = alignFrame.getTitle();
       }
 
         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();
               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);
       }
 
         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);
       {
         /*
          * 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,
         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>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
    * <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)
   }
 
   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.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;
 
 import java.util.HashMap;
 import java.util.Map;
 
@@ -207,6 +208,8 @@ public class GAlignFrame extends JInternalFrame
 
   private SplitContainerI splitFrame;
 
 
   private SplitContainerI splitFrame;
 
+  protected JMenu exportSplitFrameMenu;
+
   public GAlignFrame()
   {
     try
   public GAlignFrame()
   {
     try
@@ -1035,12 +1038,22 @@ public class GAlignFrame extends JInternalFrame
       @Override
       public void actionPerformed(ActionEvent e)
       {
       @Override
       public void actionPerformed(ActionEvent e)
       {
-        createPNG(null);
+        createPNG(null, false);
       }
     });
     createPNG.setActionCommand(
             MessageManager.getString("label.save_png_image"));
 
       }
     });
     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()
     {
     JMenuItem font = new JMenuItem(MessageManager.getString("action.font"));
     font.addActionListener(new ActionListener()
     {
@@ -1061,13 +1074,22 @@ public class GAlignFrame extends JInternalFrame
         seqLimit_actionPerformed(e);
       }
     });
         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)
       {
     {
       @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"));
 
     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);
     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(printMenuItem);
     fileMenu.addSeparator();
     fileMenu.add(exportImageMenu);
+    fileMenu.add(exportSplitFrameMenu);
     fileMenu.add(exportFeatures);
     fileMenu.add(exportAnnotations);
     fileMenu.add(loadTreeMenuItem);
     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);
             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);
     exportImageMenu.add(createPNG);
     exportImageMenu.add(createBioJS);
     exportImageMenu.add(createSVG);
+    exportSplitFrameMenu.add(createSplitFrameEPS);
+    exportSplitFrameMenu.add(createSplitFramePNG);
     addSequenceMenu.add(addFromFile);
     addSequenceMenu.add(addFromText);
     addSequenceMenu.add(addFromURL);
     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
    */
    * 
    * @param sf
    */
@@ -2674,6 +2703,7 @@ public class GAlignFrame extends JInternalFrame
     {
       this.showComplementMenuItem.setVisible(true);
       this.showComplementMenuItem.setState(true);
     {
       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;
 
 
   private boolean headless;
 
+  /**
+   * Image format, currently either EPS, PNG or SVG
+   */
   public enum TYPE
   {
     EPS("EPS", MessageManager.getString("label.eps_file"), EPS_EXTENSION,
   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)
   public ImageMaker(Component parent, TYPE type, String title, int width,
           int height, File file, String fileTitle,
           IProgressIndicator pIndicator, long pSessionId, boolean headless)