X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fjalview%2Fgui%2FAlignmentPanel.java;h=b77f9dba437773b3b2821f6044dc317ed4838fa0;hb=a7d5ffd03eeb334a09f94f3ea741d366e0f12fbe;hp=3fad3de6a0811b82777ec9fda4b5df3581eae552;hpb=b56f333d06624db6e1d763650418e9e5ed3adbcd;p=jalview.git diff --git a/src/jalview/gui/AlignmentPanel.java b/src/jalview/gui/AlignmentPanel.java index 3fad3de..b77f9db 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 { @@ -966,7 +970,8 @@ public class AlignmentPanel extends GAlignmentPanel implements if (av.isShowAnnotation()) { - pagesHigh += getAnnotationPanel().adjustPanelHeight() + 3; + pagesHigh += getAnnotationPanel().adjustPanelHeight() + + SeqCanvas.SEQS_ANNOTATION_GAP; } pagesHigh /= pageHeight; @@ -975,7 +980,7 @@ public class AlignmentPanel extends GAlignmentPanel implements { return Printable.NO_SUCH_PAGE; } - final int alignmentDrawnHeight = (endSeq - startSeq) * charHeight + 3; + final int alignmentDrawnHeight = (endSeq - startSeq + 1) * charHeight; /* * draw the Scale at horizontal offset, then reset to top left (0, 0) @@ -1016,19 +1021,33 @@ public class AlignmentPanel extends GAlignmentPanel implements * then reset to (0, scale height) */ int offset = getAlabels().getScrollOffset(); + int yShift = alignmentDrawnHeight + SeqCanvas.SEQS_ANNOTATION_GAP; idGraphics.translate(0, -offset); - idGraphics.translate(0, alignmentDrawnHeight); + idGraphics.translate(0, yShift); getAlabels().drawComponent(idGraphics, idWidth); - idGraphics.translate(0, -alignmentDrawnHeight); + idGraphics.translate(0, -yShift); /* * draw the annotations starting at * (idOffset, alignmentHeight) from (0, scaleHeight) */ alignmentGraphics.translate(alignmentGraphicsOffset, - alignmentDrawnHeight); + yShift); getAnnotationPanel().renderer.drawComponent(getAnnotationPanel(), av, alignmentGraphics, -1, startRes, endRes + 1); + + /* + * reset to left margin below annotation + */ + int justDrawn = getAnnotationPanel().renderer.getLastDrawnHeight(); + alignmentGraphics.translate(-alignmentGraphicsOffset, justDrawn); + } + else + { + /* + * shift graphics to position after drawn sequences + */ + alignmentGraphics.translate(0, alignmentDrawnHeight); } return Printable.PAGE_EXISTS; @@ -1038,20 +1057,28 @@ 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()); int annotationHeight = 0; if (av.isShowAnnotation()) { @@ -1073,6 +1100,7 @@ public class AlignmentPanel extends GAlignmentPanel implements int resWidth = getSeqPanel().seqCanvas .getWrappedCanvasWidth(pageWidth - idWidth); + av.getRanges().setViewportStartAndWidth(0, resWidth); int totalHeight = cHeight * (maxwidth / resWidth + 1); @@ -1084,12 +1112,15 @@ public class AlignmentPanel extends GAlignmentPanel implements /* * method: print the whole wrapped alignment, but with a clip region that * is restricted to the requested page; this supports selective print of - * single pages or ranges, (at the cost of some repeated processing in - * the 'normal' case, when all pages are printed) + * single pages or ranges, (at the cost of repeated processing in the + * 'normal' case, when all pages are printed) */ 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) @@ -1098,9 +1129,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) { @@ -1149,7 +1180,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(); @@ -1164,41 +1205,53 @@ public class AlignmentPanel extends GAlignmentPanel implements { type.getLabel() }), pSessionId); } } + + /* + * cache preferences in case we need to fudge them for export of + * split frame with 'protein scaled to codons' and 'auto id width' + */ + + final boolean autoIdWidth = Cache.getDefault("FIGURE_AUTOIDWIDTH", + false); + final Integer fixedIdWidth = Cache + .getIntegerProperty("FIGURE_FIXEDIDWIDTH"); + 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 + * if 'protein scaled to codons' and 'auto id width', fudge + * to a fixed width (and restore preferences afterwards) + */ + AlignmentPanel complement = null; AlignmentDimension dim1 = getAlignmentDimension(); AlignmentDimension dim2 = new AlignmentDimension(0, 0); - if (splitFrame) + + if (forSplitFrame) { - AlignmentPanel comp = ((AlignViewport) av.getCodingComplement()) + complement = ((AlignViewport) av.getCodingComplement()) .getAlignPanel(); - dim2 = comp.getAlignmentDimension(); + dim2 = complement.getAlignmentDimension(); + if (autoIdWidth && av.isScaleProteinAsCdna()) + { + int w1 = this.getVisibleIdWidth(false); + int w2 = complement.getVisibleIdWidth(false); + Cache.setProperty("FIGURE_AUTOIDWIDTH", Boolean.FALSE.toString()); + Cache.setProperty("FIGURE_FIXEDIDWIDTH", + String.valueOf(Math.max(w1, w2))); + } } final int graphicsHeight = dim1.height + dim2.height + 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) - { - 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(); - } + final String dialogTitle = MessageManager + .formatMessage("label.make_alignment_image", type.getName()); + String imageTitle = type == PNG ? null : alignFrame.getTitle(); - im = new jalview.util.ImageMaker(this, type, imageAction, + ImageMaker im = new ImageMaker(this, type, dialogTitle, graphicsWidth, graphicsHeight, file, imageTitle, alignFrame, pSessionId, headless); Graphics graphics = im.getGraphics(); @@ -1211,30 +1264,28 @@ public class AlignmentPanel extends GAlignmentPanel implements if (av.getWrapAlignment()) { printWrappedAlignment(dim1.width, dim1.height + borderBottomOffset, - 0, graphics); + 0, graphics, false); } else { 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(); + // to debug location of next write to Graphics: + // graphics.drawString("Hello world", 0, 0); if (av.getCodingComplement().getWrapAlignment()) { - comp.printWrappedAlignment(dim2.width, - dim2.height + borderBottomOffset, 0, graphics); + complement.printWrappedAlignment(dim2.width, + dim2.height + borderBottomOffset, 0, graphics, false); } else { - comp.printUnwrapped(dim2.width, dim2.height, 0, graphics, + complement.printUnwrapped(dim2.width, dim2.height, 0, graphics, graphics); } } @@ -1250,6 +1301,15 @@ public class AlignmentPanel extends GAlignmentPanel implements } catch (Exception ex) { ex.printStackTrace(); + } finally + { + /* + * restore preference settings in case they were fudged + */ + Cache.setProperty("FIGURE_AUTOIDWIDTH", + String.valueOf(autoIdWidth)); + Cache.setProperty("FIGURE_FIXEDIDWIDTH", + String.valueOf(fixedIdWidth)); } } @@ -1259,9 +1319,10 @@ public class AlignmentPanel extends GAlignmentPanel implements *

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