dmolony-DiskBrowser/src/com/bytezone/diskbrowser/gui/PrintDocument.java

139 lines
4.0 KiB
Java
Executable File

package com.bytezone.diskbrowser.gui;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.font.LineMetrics;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.util.Enumeration;
import java.util.Vector;
// -----------------------------------------------------------------------------------//
class PrintDocument extends Component implements Printable
// -----------------------------------------------------------------------------------//
{
String lines[];
int lineHeight;
int pages;
Font font = new Font ("Lucida Sans Typewriter", Font.PLAIN, 7);
int linesPerPage;
int x = 50;
int y = 20;
// ---------------------------------------------------------------------------------//
PrintDocument (String text)
// ---------------------------------------------------------------------------------//
{
lines = wrapText (text, 112);
}
// ---------------------------------------------------------------------------------//
@Override
public int print (Graphics g, PageFormat pageFormat, int page)
// ---------------------------------------------------------------------------------//
{
Graphics2D g2 = (Graphics2D) g;
if (lineHeight == 0)
{
LineMetrics lm = font.getLineMetrics ("0", g2.getFontRenderContext ());
lineHeight = (int) lm.getHeight ();
linesPerPage = (int) pageFormat.getImageableHeight () / lineHeight - 5;
pages = (lines.length - 1) / linesPerPage;
}
if (pages < page)
return Printable.NO_SUCH_PAGE;
g2.translate (pageFormat.getImageableX (), pageFormat.getImageableY ());
g2.setPaint (Color.black);
g2.setStroke (new BasicStroke (2));
g2.setFont (font);
int first = page * linesPerPage;
int last = first + linesPerPage;
if (last > lines.length)
last = lines.length;
for (int line = first; line < last; line++)
g2.drawString (lines[line], x, y + (line % linesPerPage + 2) * lineHeight);
return (PAGE_EXISTS);
}
// Routine copied from http://progcookbook.blogspot.com/
// 2006/02/text-wrapping-function-for-java.html
// ---------------------------------------------------------------------------------//
static String[] wrapText (String text, int len)
// ---------------------------------------------------------------------------------//
{
// return empty array for null text
if (text == null)
return new String[] {};
// return text if len is zero or less
if (len <= 0)
return new String[] { text };
// return text if less than length
if (text.length () <= len)
return new String[] { text };
char[] chars = text.toCharArray ();
Vector<String> lines = new Vector<String> ();
StringBuilder line = new StringBuilder ();
StringBuilder word = new StringBuilder ();
for (int i = 0; i < chars.length; i++)
{
if (chars[i] == 10)
{
line.append (word);
word.delete (0, word.length ());
lines.add (line.toString ());
line.delete (0, line.length ());
continue;
}
word.append (chars[i]);
if (chars[i] == ' ')
{
if ((line.length () + word.length ()) > len)
{
lines.add (line.toString ());
line.delete (0, line.length ());
}
line.append (word);
word.delete (0, word.length ());
}
}
// handle any extra chars in current word
if (word.length () > 0)
{
if ((line.length () + word.length ()) > len)
{
lines.add (line.toString ());
line.delete (0, line.length ());
}
line.append (word);
}
// handle extra line
if (line.length () > 0)
lines.add (line.toString ());
String[] ret = new String[lines.size ()];
int c = 0; // counter
for (Enumeration<String> e = lines.elements (); e.hasMoreElements (); c++)
ret[c] = e.nextElement ();
return ret;
}
}