X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAlignmentPanel.java;h=b77f9dba437773b3b2821f6044dc317ed4838fa0;hb=a7d5ffd03eeb334a09f94f3ea741d366e0f12fbe;hp=8d0fefbc4a6dc6a439a48e23a4da73e48eb8c584;hpb=2131bbe62dd921c47cf5f117fa4e441c9be0f554;p=jalview.git diff --git a/src/jalview/gui/AlignmentPanel.java b/src/jalview/gui/AlignmentPanel.java index 8d0fefb..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,8 +40,8 @@ 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.util.Platform; import jalview.viewmodel.ViewportListenerI; import jalview.viewmodel.ViewportRanges; @@ -48,7 +52,7 @@ import java.awt.Dimension; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; -import java.awt.Insets; +import java.awt.Graphics2D; import java.awt.event.AdjustmentEvent; import java.awt.event.AdjustmentListener; import java.awt.event.ComponentAdapter; @@ -329,12 +333,12 @@ public class AlignmentPanel extends GAlignmentPanel implements } /** - * Highlight the given results on the alignment. + * Highlight the given results on the alignment * */ public void highlightSearchResults(SearchResultsI results) { - boolean scrolled = scrollToPosition(results, 0, true, false); + boolean scrolled = scrollToPosition(results, 0, false); boolean noFastPaint = scrolled && av.getWrapAlignment(); @@ -346,13 +350,11 @@ public class AlignmentPanel extends GAlignmentPanel implements * (if any) * * @param searchResults - * @param redrawOverview * @return */ - public boolean scrollToPosition(SearchResultsI searchResults, - boolean redrawOverview) + public boolean scrollToPosition(SearchResultsI searchResults) { - return scrollToPosition(searchResults, 0, redrawOverview, false); + return scrollToPosition(searchResults, 0, false); } /** @@ -365,14 +367,12 @@ public class AlignmentPanel extends GAlignmentPanel implements * @param verticalOffset * if greater than zero, allows scrolling to a position below the * first displayed sequence - * @param redrawOverview - * - when set, the overview will be recalculated (takes longer) * @param centre * if true, try to centre the search results horizontally in the view * @return */ protected boolean scrollToPosition(SearchResultsI results, - int verticalOffset, boolean redrawOverview, boolean centre) + int verticalOffset, boolean centre) { int startv, endv, starts, ends; ViewportRanges ranges = av.getRanges(); @@ -419,8 +419,8 @@ public class AlignmentPanel extends GAlignmentPanel implements if (av.hasHiddenColumns()) { HiddenColumns hidden = av.getAlignment().getHiddenColumns(); - start = hidden.findColumnPosition(start); - end = hidden.findColumnPosition(end); + start = hidden.absoluteToVisibleColumn(start); + end = hidden.absoluteToVisibleColumn(end); if (start == end) { if (!hidden.isVisible(r[0])) @@ -478,7 +478,7 @@ public class AlignmentPanel extends GAlignmentPanel implements scrollNeeded = ranges.scrollToWrappedVisible(start); } - paintAlignment(redrawOverview, false); + paintAlignment(false, false); return scrollNeeded; } @@ -537,7 +537,7 @@ public class AlignmentPanel extends GAlignmentPanel implements addNotify(); // TODO: many places call this method and also paintAlignment with various // different settings. this means multiple redraws are triggered... - paintAlignment(true, false); + paintAlignment(true, av.needToUpdateStructureViews()); } /** @@ -547,40 +547,10 @@ public class AlignmentPanel extends GAlignmentPanel implements protected void validateAnnotationDimensions(boolean adjustPanelHeight) { int annotationHeight = getAnnotationPanel().adjustPanelHeight(); + annotationHeight = getAnnotationPanel() + .adjustForAlignFrame(adjustPanelHeight, annotationHeight); - if (adjustPanelHeight) - { - int rowHeight = av.getCharHeight(); - int alignmentHeight = rowHeight * av.getAlignment().getHeight(); - - /* - * Estimate available height in the AlignFrame for alignment + - * annotations. Deduct an estimate for title bar, menu bar, scale panel, - * hscroll, status bar (as these are not laid out we can't inspect their - * actual heights). Insets gives frame borders. - */ - int stuff = Platform.isAMac() ? 80 : 100; - Insets insets = alignFrame.getInsets(); - int availableHeight = alignFrame.getHeight() - stuff - insets.top - - insets.bottom; - - /* - * If not enough vertical space, maximize annotation height while keeping - * at least two rows of alignment visible - */ - if (annotationHeight + alignmentHeight > availableHeight) - { - annotationHeight = Math.min(annotationHeight, - availableHeight - 2 * rowHeight); - } - } - else - { - // maintain same window layout whilst updating sliders - annotationHeight = annotationScroller.getSize().height; - } hscroll.addNotify(); - annotationScroller.setPreferredSize( new Dimension(annotationScroller.getWidth(), annotationHeight)); @@ -619,6 +589,7 @@ public class AlignmentPanel extends GAlignmentPanel implements { annotationScroller.setVisible(true); annotationSpaceFillerHolder.setVisible(true); + validateAnnotationDimensions(false); } int canvasWidth = getSeqPanel().seqCanvas.getWidth(); @@ -671,16 +642,9 @@ public class AlignmentPanel extends GAlignmentPanel implements } else { - int width = av.getAlignment().getWidth(); + int width = av.getAlignment().getVisibleWidth(); int height = av.getAlignment().getHeight(); - if (av.hasHiddenColumns()) - { - // reset the width to exclude hidden columns - width = av.getAlignment().getHiddenColumns() - .findColumnPosition(width); - } - hextent = getSeqPanel().seqCanvas.getWidth() / av.getCharWidth(); vextent = getSeqPanel().seqCanvas.getHeight() / av.getCharHeight(); @@ -874,9 +838,20 @@ public class AlignmentPanel extends GAlignmentPanel implements @Override public void paintComponent(Graphics g) { + invalidate(); // needed so that the id width adjuster works correctly + Dimension d = getIdPanel().getIdCanvas().getPreferredSize(); idPanelHolder.setPreferredSize(d); hscrollFillerPanel.setPreferredSize(new Dimension(d.width, 12)); + + validate(); // needed so that the id width adjuster works correctly + + /* + * set scroll bar positions - tried to remove but necessary for split panel to resize correctly + * though I still think this call should be elsewhere. + */ + ViewportRanges ranges = av.getRanges(); + setScrollValues(ranges.getStartRes(), ranges.getStartSeq()); } /** @@ -901,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) @@ -926,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 { @@ -935,30 +909,16 @@ public class AlignmentPanel extends GAlignmentPanel implements } /** - * DOCUMENT ME! - * - * @param pg - * DOCUMENT ME! - * @param pwidth - * DOCUMENT ME! - * @param pheight - * DOCUMENT ME! - * @param pi - * DOCUMENT ME! - * - * @return DOCUMENT ME! - * - * @throws PrinterException - * DOCUMENT ME! - */ - /** * Draws the alignment image, including sequence ids, sequences, and * annotation labels and annotations if shown, on either one or two Graphics - * context. + * contexts. * * @param pageWidth + * in pixels * @param pageHeight - * @param pi + * in pixels + * @param pageIndex + * (0, 1, ...) * @param idGraphics * the graphics context for sequence ids and annotation labels * @param alignmentGraphics @@ -967,7 +927,7 @@ public class AlignmentPanel extends GAlignmentPanel implements * @return * @throws PrinterException */ - public int printUnwrapped(int pageWidth, int pageHeight, int pi, + public int printUnwrapped(int pageWidth, int pageHeight, int pageIndex, Graphics idGraphics, Graphics alignmentGraphics) throws PrinterException { @@ -981,8 +941,8 @@ public class AlignmentPanel extends GAlignmentPanel implements : idWidth; FontMetrics fm = getFontMetrics(av.getFont()); - int charHeight = av.getCharHeight(); - int scaleHeight = charHeight + fm.getDescent(); + final int charHeight = av.getCharHeight(); + final int scaleHeight = charHeight + fm.getDescent(); idGraphics.setColor(Color.white); idGraphics.fillRect(0, 0, pageWidth, pageHeight); @@ -991,44 +951,36 @@ public class AlignmentPanel extends GAlignmentPanel implements /* * How many sequences and residues can we fit on a printable page? */ - int totalRes = (pageWidth - idWidth) / av.getCharWidth(); + final int totalRes = (pageWidth - idWidth) / av.getCharWidth(); - int totalSeq = (pageHeight - scaleHeight) / charHeight - 1; + final int totalSeq = (pageHeight - scaleHeight) / charHeight - 1; - int alignmentWidth = av.getAlignment().getWidth(); + final int alignmentWidth = av.getAlignment().getVisibleWidth(); int pagesWide = (alignmentWidth / totalRes) + 1; - final int startRes = (pi % pagesWide) * totalRes; - int endRes = (startRes + totalRes) - 1; - - if (endRes > (alignmentWidth - 1)) - { - endRes = alignmentWidth - 1; - } + final int startRes = (pageIndex % pagesWide) * totalRes; + final int endRes = Math.min(startRes + totalRes - 1, + alignmentWidth - 1); - final int startSeq = (pi / pagesWide) * totalSeq; - int endSeq = startSeq + totalSeq; - - int alignmentHeight = av.getAlignment().getHeight(); - if (endSeq > alignmentHeight) - { - endSeq = alignmentHeight; - } + final int startSeq = (pageIndex / pagesWide) * totalSeq; + final int alignmentHeight = av.getAlignment().getHeight(); + final int endSeq = Math.min(startSeq + totalSeq, alignmentHeight); int pagesHigh = ((alignmentHeight / totalSeq) + 1) * pageHeight; if (av.isShowAnnotation()) { - pagesHigh += getAnnotationPanel().adjustPanelHeight() + 3; + pagesHigh += getAnnotationPanel().adjustPanelHeight() + + SeqCanvas.SEQS_ANNOTATION_GAP; } pagesHigh /= pageHeight; - if (pi >= (pagesWide * pagesHigh)) + if (pageIndex >= (pagesWide * pagesHigh)) { 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) @@ -1043,47 +995,12 @@ public class AlignmentPanel extends GAlignmentPanel implements * then reset to top left (0, 0) */ idGraphics.translate(0, scaleHeight); - idGraphics.setFont(getIdPanel().getIdCanvas().getIdfont()); - Color currentColor = null; - Color currentTextColor = null; - - SequenceI seq; - for (int i = startSeq; i < endSeq; i++) - { - seq = av.getAlignment().getSequenceAt(i); - if ((av.getSelectionGroup() != null) - && av.getSelectionGroup().getSequences(null).contains(seq)) - { - /* - * gray out ids of sequences in selection group (if any) - */ - currentColor = Color.gray; - currentTextColor = Color.black; - } - else - { - currentColor = av.getSequenceColour(seq); - currentTextColor = Color.black; - } - - idGraphics.setColor(currentColor); - idGraphics.fillRect(0, (i - startSeq) * charHeight, idWidth, - charHeight); - - idGraphics.setColor(currentTextColor); + IdCanvas idCanvas = getIdPanel().getIdCanvas(); + List selection = av.getSelectionGroup() == null ? null + : av.getSelectionGroup().getSequences(null); + idCanvas.drawIds((Graphics2D) idGraphics, av, startSeq, endSeq - 1, + selection); - int xPos = 0; - String displayId = seq.getDisplayId(av.getShowJVSuffix()); - if (av.isRightAlignIds()) - { - fm = idGraphics.getFontMetrics(); - xPos = idWidth - fm.stringWidth(displayId) - 4; - } - - idGraphics.drawString(displayId, xPos, - (((i - startSeq) * charHeight) + charHeight) - - (charHeight / 5)); - } idGraphics.setFont(av.getFont()); idGraphics.translate(0, -scaleHeight); @@ -1093,7 +1010,7 @@ public class AlignmentPanel extends GAlignmentPanel implements */ alignmentGraphics.translate(alignmentGraphicsOffset, scaleHeight); getSeqPanel().seqCanvas.drawPanelForPrinting(alignmentGraphics, startRes, - endRes, startSeq, endSeq); + endRes, startSeq, endSeq - 1); alignmentGraphics.translate(-alignmentGraphicsOffset, 0); if (av.isShowAnnotation() && (endSeq == alignmentHeight)) @@ -1104,50 +1021,68 @@ 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; } /** - * DOCUMENT ME! - * - * @param pg - * DOCUMENT ME! - * @param pwidth - * DOCUMENT ME! - * @param pheight - * DOCUMENT ME! - * @param pi - * DOCUMENT ME! + * 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. * - * @return DOCUMENT ME! + * @param pageWidth + * @param pageHeight + * @param pageNumber + * (0, 1, ...) + * @param g + * @param clipToPage * - * @throws PrinterException - * DOCUMENT ME! + * @return */ - public int printWrappedAlignment(int pwidth, int pheight, int pi, - Graphics pg) throws PrinterException + public int printWrappedAlignment(int pageWidth, int pageHeight, int pageNumber, + Graphics g, boolean clipToPage) { + getSeqPanel().seqCanvas.calculateWrappedGeometry(getWidth(), + getHeight()); int annotationHeight = 0; - AnnotationLabels labels = null; if (av.isShowAnnotation()) { annotationHeight = getAnnotationPanel().adjustPanelHeight(); - labels = new AnnotationLabels(av); } int hgap = av.getCharHeight(); @@ -1161,72 +1096,46 @@ public class AlignmentPanel extends GAlignmentPanel implements int idWidth = getVisibleIdWidth(false); - int maxwidth = av.getAlignment().getWidth(); - if (av.hasHiddenColumns()) - { - maxwidth = av.getAlignment().getHiddenColumns() - .findColumnPosition(maxwidth) - 1; - } + int maxwidth = av.getAlignment().getVisibleWidth(); int resWidth = getSeqPanel().seqCanvas - .getWrappedCanvasWidth(pwidth - idWidth); + .getWrappedCanvasWidth(pageWidth - idWidth); + av.getRanges().setViewportStartAndWidth(0, resWidth); int totalHeight = cHeight * (maxwidth / resWidth + 1); - pg.setColor(Color.white); - pg.fillRect(0, 0, pwidth, pheight); - pg.setFont(av.getFont()); - - // ////////////// - // Draw the ids - pg.setColor(Color.black); - - pg.translate(0, -pi * pheight); + g.setColor(Color.white); + g.fillRect(0, 0, pageWidth, pageHeight); + g.setFont(av.getFont()); + g.setColor(Color.black); - pg.setClip(0, pi * pheight, pwidth, pheight); - - int ypos = hgap; + /* + * 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 repeated processing in the + * 'normal' case, when all pages are printed) + */ + g.translate(0, -pageNumber * pageHeight); - do + if (clipToPage) { - for (int i = 0; i < av.getAlignment().getHeight(); i++) - { - pg.setFont(getIdPanel().getIdCanvas().getIdfont()); - SequenceI s = av.getAlignment().getSequenceAt(i); - String string = s.getDisplayId(av.getShowJVSuffix()); - int xPos = 0; - if (av.isRightAlignIds()) - { - FontMetrics fm = pg.getFontMetrics(); - xPos = idWidth - fm.stringWidth(string) - 4; - } - pg.drawString(string, xPos, - ((i * av.getCharHeight()) + ypos + av.getCharHeight()) - - (av.getCharHeight() / 5)); - } - if (labels != null) - { - pg.translate(-3, ypos - + (av.getAlignment().getHeight() * av.getCharHeight())); - - pg.setFont(av.getFont()); - labels.drawComponent(pg, idWidth); - pg.translate(+3, -ypos - - (av.getAlignment().getHeight() * av.getCharHeight())); - } - - ypos += cHeight; - } while (ypos < totalHeight); + g.setClip(0, pageNumber * pageHeight, pageWidth, pageHeight); + } - pg.translate(idWidth, 0); + /* + * draw sequence ids and annotation labels (if shown) + */ + IdCanvas idCanvas = getIdPanel().getIdCanvas(); + idCanvas.drawIdsWrapped((Graphics2D) g, av, 0, totalHeight); - getSeqPanel().seqCanvas.drawWrappedPanelForPrinting(pg, pwidth - idWidth, + g.translate(idWidth, 0); + getSeqPanel().seqCanvas.drawWrappedPanelForPrinting(g, pageWidth - idWidth, totalHeight, 0); + g.translate(-idWidth, 0); - if ((pi * pheight) < totalHeight) + if ((pageNumber * pageHeight) < totalHeight) { return Printable.PAGE_EXISTS; - } else { @@ -1271,9 +1180,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")); @@ -1286,79 +1205,131 @@ 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 { - 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 + * 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 (forSplitFrame) { - jalview.util.ImageMaker im; - final String imageAction, imageTitle; - if (type == jalview.util.ImageMaker.TYPE.PNG) + complement = ((AlignViewport) av.getCodingComplement()) + .getAlignPanel(); + dim2 = complement.getAlignmentDimension(); + if (autoIdWidth && av.isScaleProteinAsCdna()) { - 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(); + 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); + + 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.drawString("Hello world", 0, 0); + if (av.getCodingComplement().getWrapAlignment()) { - if (graphics != null) - { - printWrappedAlignment(aDimension.getWidth(), - aDimension.getHeight() + boarderBottomOffset, 0, - graphics); - im.writeImage(); - } + complement.printWrappedAlignment(dim2.width, + dim2.height + borderBottomOffset, 0, graphics, false); } else { - if (graphics != null) - { - printUnwrapped(aDimension.getWidth(), aDimension.getHeight(), 0, - graphics, graphics); - im.writeImage(); - } + complement.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(); } + + 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(); } finally { - + /* + * restore preference settings in case they were fudged + */ + Cache.setProperty("FIGURE_AUTOIDWIDTH", + String.valueOf(autoIdWidth)); + Cache.setProperty("FIGURE_FIXEDIDWIDTH", + String.valueOf(fixedIdWidth)); } } + /** + * Computes and answers the width and height of the alignment in pixels, + * including + *

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