Java Swing Font Size printDocumentMonospacedWordWrap(Graphics g, Document doc, int fontSize, int pageIndex, PageFormat pageFormat, int tabSize)

Here you can find the source of printDocumentMonospacedWordWrap(Graphics g, Document doc, int fontSize, int pageIndex, PageFormat pageFormat, int tabSize)

Description

Prints a Document using a monospaced font, word wrapping on the characters ' ', '\t', '\n', ',', '.', and ';'.

License

Open Source License

Parameter

Parameter Description
g The graphics context to write to.
doc The <code>javax.swing.text.Document</code> to print.
fontSize the point size to use for the monospaced font.
pageIndex The page number to print.
pageFormat The format to print the page with.
tabSize The number of spaces to expand tabs to.

Declaration

public static int printDocumentMonospacedWordWrap(Graphics g,
        Document doc, int fontSize, int pageIndex,
        PageFormat pageFormat, int tabSize) 

Method Source Code

//package com.java2s;
/*//w w w. ja v  a2 s . c  o m
 * 11/14/2003
 *
 * RPrintUtilities.java - A collection of static methods useful for printing
 * text from Swing text components.
 * Copyright (C) 2003 Robert Futrell
 * robert_futrell at users.sourceforge.net
 * http://fifesoft.com/rsyntaxtextarea
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA.
 */

import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.Element;

import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.print.*;

public class Main {
    private static int currentDocLineNumber;
    private static int numDocLines;
    private static Element rootElement;
    private static final char[] breakChars = { ' ', '\t', ',', '.', ';',
            '?', '!' };
    private static int xOffset;
    private static int tabSizeInSpaces;
    private static FontMetrics fm;

    /**
     * Prints a <code>Document</code> using a monospaced font, word wrapping on
     * the characters ' ', '\t', '\n', ',', '.', and ';'.  This method is
     * expected to be called from Printable 'print(Graphics g)' functions.
     *
     * @param g The graphics context to write to.
     * @param doc The <code>javax.swing.text.Document</code> to print.
     * @param fontSize the point size to use for the monospaced font.
     * @param pageIndex The page number to print.
     * @param pageFormat The format to print the page with.
     * @param tabSize The number of spaces to expand tabs to.
     *
     * @see #printDocumentMonospaced
     */
    public static int printDocumentMonospacedWordWrap(Graphics g,
            Document doc, int fontSize, int pageIndex,
            PageFormat pageFormat, int tabSize) {

        g.setColor(Color.BLACK);
        g.setFont(new Font("Monospaced", Font.PLAIN, fontSize));

        // Initialize our static variables (these are used by our tab expander below).
        tabSizeInSpaces = tabSize;
        fm = g.getFontMetrics();

        // Create our tab expander.
        //RPrintTabExpander tabExpander = new RPrintTabExpander();

        // Get width and height of characters in this monospaced font.
        int fontWidth = fm.charWidth('w'); // Any character will do here, since font is monospaced.
        int fontHeight = fm.getHeight();

        int MAX_CHARS_PER_LINE = (int) pageFormat.getImageableWidth()
                / fontWidth;
        int MAX_LINES_PER_PAGE = (int) pageFormat.getImageableHeight()
                / fontHeight;

        final int STARTING_LINE_NUMBER = MAX_LINES_PER_PAGE * pageIndex;

        // The (x,y) coordinate to print at (in pixels, not characters).
        // Since y is the baseline of where we'll start printing (not the top-left
        // corner), we offset it by the font's ascent ( + 1 just for good measure).
        xOffset = (int) pageFormat.getImageableX();
        int y = (int) pageFormat.getImageableY() + fm.getAscent() + 1;

        // A counter to keep track of the number of lines that WOULD HAVE been
        // printed if we were printing all lines.
        int numPrintedLines = 0;

        // Keep going while there are more lines in the document.
        currentDocLineNumber = 0; // The line number of the document we're currently on.
        rootElement = doc.getDefaultRootElement(); // To shorten accesses in our loop.
        numDocLines = rootElement.getElementCount(); // The number of lines in our document.
        while (currentDocLineNumber < numDocLines) {

            // Get the line we are going to print.
            String curLineString;
            Element currentLine = rootElement
                    .getElement(currentDocLineNumber);
            int startOffs = currentLine.getStartOffset();
            try {
                curLineString = doc.getText(startOffs,
                        currentLine.getEndOffset() - startOffs);
            } catch (BadLocationException ble) { // Never happens
                ble.printStackTrace();
                return Printable.NO_SUCH_PAGE;
            }

            // Remove newlines, because they end up as boxes if you don't; this is a monospaced font.
            curLineString = curLineString.replaceAll("\n", "");

            // Replace tabs with how many spaces they should be.
            if (tabSizeInSpaces == 0) {
                curLineString = curLineString.replaceAll("\t", "");
            } else {
                int tabIndex = curLineString.indexOf('\t');
                while (tabIndex > -1) {
                    int spacesNeeded = tabSizeInSpaces
                            - (tabIndex % tabSizeInSpaces);
                    String replacementString = "";
                    for (int i = 0; i < spacesNeeded; i++)
                        replacementString += ' ';
                    // Note that "\t" is actually a regex for this method.
                    curLineString = curLineString.replaceFirst("\t",
                            replacementString);
                    tabIndex = curLineString.indexOf('\t');
                }
            }

            // If this document line is too long to fit on one printed line on the page,
            // break it up into multpile lines.
            while (curLineString.length() > MAX_CHARS_PER_LINE) {

                int breakPoint = getLineBreakPoint(curLineString,
                        MAX_CHARS_PER_LINE) + 1;

                numPrintedLines++;
                if (numPrintedLines > STARTING_LINE_NUMBER) {
                    g.drawString(curLineString.substring(0, breakPoint),
                            xOffset, y);
                    y += fontHeight;
                    if (numPrintedLines == STARTING_LINE_NUMBER
                            + MAX_LINES_PER_PAGE)
                        return Printable.PAGE_EXISTS;
                }

                curLineString = curLineString.substring(breakPoint,
                        curLineString.length());

            }

            currentDocLineNumber += 1; // We have printed one more line from the document.

            numPrintedLines++;
            if (numPrintedLines > STARTING_LINE_NUMBER) {
                g.drawString(curLineString, xOffset, y);
                y += fontHeight;
                if (numPrintedLines == STARTING_LINE_NUMBER
                        + MAX_LINES_PER_PAGE)
                    return Printable.PAGE_EXISTS;
            }

        }

        // Now, the whole document has been "printed."  Decide if this page had any text on it or not.
        if (numPrintedLines > STARTING_LINE_NUMBER)
            return Printable.PAGE_EXISTS;
        return Printable.NO_SUCH_PAGE;

    }

    /**
     * Returns the position closest to, but before, position <code>maxCharsPerLine</code> in
     * <code>line</code> of one of the chars in <code>breakChars</code>, or simply returns
     * <code>maxCharsPerLine-1</code> if none of the <code>breakChars</code> comes before
     * that position.  This position represents the logical line break for this <code>java.lang.String</code>
     * if it is being printed in a monospaced font when lines can only be <code>maxCharsPerLine</code>
     * characters long.
     *
     * @param line The text being printed.
     * @param maxCharsPerLine Only up-to this many characters from
     *        <code>line</code> can be printed on one line.
     * @return The logical position at which to stop printing <code>line</code>
     *         to simulate word wrap.
     */
    private static int getLineBreakPoint(String line,
            final int maxCharsPerLine) {

        int breakPoint = -1;
        for (int i = 0; i < breakChars.length; i++) {
            int breakCharPos = line.lastIndexOf(breakChars[i],
                    maxCharsPerLine - 1);
            if (breakCharPos > breakPoint)
                breakPoint = breakCharPos;
        }

        return (breakPoint == -1 ? maxCharsPerLine - 1 : breakPoint);

    }
}

Related

  1. getFontRelativeSize(int size)
  2. getFontSizeFactor()
  3. getSizeOfTextInComponent(String text, Font font, JComponent component)
  4. increaseFontSize(JComponent component, int offset)
  5. printDocumentMonospaced(Graphics g, Document doc, int fontSize, int pageIndex, PageFormat pageFormat, int tabSize)
  6. resetUIFont(String name, int style, int size)
  7. resetUIFontSize(int size)
  8. ScaleLabelFontsizeAndDimension(JLabel label, int fontSize)
  9. setFontSize(JLabel label, int i)