From: gmungoc Date: Mon, 29 Jul 2019 14:52:25 +0000 (+0100) Subject: Merge branch 'develop' into feature/JAL-3364splitFrameImage X-Git-Url: http://source.jalview.org/gitweb/?a=commitdiff_plain;h=0b71927e1ea5f85cd190cf7814eaeaec3db9ba43;hp=bb2a4bd95f124f66f7c9722d16cede26b2f45dc0;p=jalview.git Merge branch 'develop' into feature/JAL-3364splitFrameImage --- diff --git a/resources/lang/Messages.properties b/resources/lang/Messages.properties index d2d8e88..ca3cd0e 100644 --- a/resources/lang/Messages.properties +++ b/resources/lang/Messages.properties @@ -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 diff --git a/resources/lang/Messages_es.properties b/resources/lang/Messages_es.properties index e9e18ce..2d2872a 100644 --- a/resources/lang/Messages_es.properties +++ b/resources/lang/Messages_es.properties @@ -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 diff --git a/src/jalview/bin/Jalview.java b/src/jalview/bin/Jalview.java index ca2a584..4bf811a 100755 --- a/src/jalview/bin/Jalview.java +++ b/src/jalview/bin/Jalview.java @@ -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; } diff --git a/src/jalview/gui/AlignFrame.java b/src/jalview/gui/AlignFrame.java index fcb6572..235a5c8 100644 --- a/src/jalview/gui/AlignFrame.java +++ b/src/jalview/gui/AlignFrame.java @@ -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 diff --git a/src/jalview/gui/AlignmentPanel.java b/src/jalview/gui/AlignmentPanel.java index ea8fcdc..5c0d3a1 100644 --- a/src/jalview/gui/AlignmentPanel.java +++ b/src/jalview/gui/AlignmentPanel.java @@ -20,6 +20,10 @@ */ 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). + *

+ * 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 + *

+ * The alignment may be in wrapped or unwrapped mode. + *