//Send questions, comments, bug reports, etc. to the authors:
//Rob Warner (rwarner@interspatial.com)
//Robert Harris (rbrt_harris@yahoo.com)
import org.eclipse.swt.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.printing.*;
import org.eclipse.swt.widgets.*;
import java.io.*;
/**
* This class demonstrates printing text
*/
public class TextPrinterExample {
/**
* Runs the application
*/
public void run() {
Display display = new Display();
Shell shell = new Shell(display);
// Get the file to print
FileDialog fileChooser = new FileDialog(shell, SWT.OPEN);
String fileName = fileChooser.open();
if (fileName != null) {
// Have user select a printer
PrintDialog dialog = new PrintDialog(shell);
PrinterData printerData = dialog.open();
if (printerData != null) {
// Create the printer
Printer printer = new Printer(printerData);
try {
// Print the contents of the file
new WrappingPrinter(printer, fileName, getFileContents(fileName)).print();
} catch (Exception e) {
MessageBox mb = new MessageBox(shell, SWT.ICON_ERROR | SWT.OK);
mb.setMessage(e.getMessage());
mb.open();
}
// Dispose the printer
printer.dispose();
}
}
display.dispose();
}
/**
* Read in the file and return its contents
* @param fileName
* @return
* @throws FileNotFoundException
* @throws IOException
*/
private String getFileContents(String fileName)
throws FileNotFoundException, IOException {
StringBuffer contents = new StringBuffer();
BufferedReader reader = null;
try {
// Read in the file
reader = new BufferedReader(new FileReader(fileName));
while (reader.ready()) {
contents.append(reader.readLine());
contents.append("\n"); // Throw away LF chars, and just replace CR
}
} finally {
if (reader != null) try {
reader.close();
} catch (IOException e) {}
}
return contents.toString();
}
/**
* The application entry point
*
* @param args the command line arguments
*/
public static void main(String[] args) {
new TextPrinterExample().run();
}
}
/**
* This class performs the printing, wrapping text as necessary
*/
class WrappingPrinter {
private Printer printer; // The printer
private String fileName; // The name of the file to print
private String contents; // The contents of the file to print
private GC gc; // The GC to print on
private int xPos, yPos; // The current x and y locations for print
private Rectangle bounds; // The boundaries for the print
private StringBuffer buf; // Holds a word at a time
private int lineHeight; // The height of a line of text
/**
* WrappingPrinter constructor
* @param printer the printer
* @param fileName the fileName
* @param contents the contents
*/
WrappingPrinter(Printer printer, String fileName, String contents) {
this.printer = printer;
this.fileName = fileName;
this.contents = contents;
}
/**
* Prints the file
*/
void print() {
// Start the print job
if (printer.startJob(fileName)) {
// Determine print area, with margins
bounds = computePrintArea(printer);
xPos = bounds.x;
yPos = bounds.y;
// Create the GC
gc = new GC(printer);
// Determine line height
lineHeight = gc.getFontMetrics().getHeight();
// Determine tab width--use three spaces for tabs
int tabWidth = gc.stringExtent(" ").x;
// Print the text
printer.startPage();
buf = new StringBuffer();
char c;
for (int i = 0, n = contents.length(); i < n; i++) {
// Get the next character
c = contents.charAt(i);
// Check for newline
if (c == '\n') {
printBuffer();
printNewline();
}
// Check for tab
else if (c == '\t') {
xPos += tabWidth;
}
else {
buf.append(c);
// Check for space
if (Character.isWhitespace(c)) {
printBuffer();
}
}
}
printer.endPage();
printer.endJob();
gc.dispose();
}
}
/**
* Prints the contents of the buffer
*/
void printBuffer() {
// Get the width of the rendered buffer
int width = gc.stringExtent(buf.toString()).x;
// Determine if it fits
if (xPos + width > bounds.x + bounds.width) {
// Doesn't fit--wrap
printNewline();
}
// Print the buffer
gc.drawString(buf.toString(), xPos, yPos, false);
xPos += width;
buf.setLength(0);
}
/**
* Prints a newline
*/
void printNewline() {
// Reset x and y locations to next line
xPos = bounds.x;
yPos += lineHeight;
// Have we gone to the next page?
if (yPos > bounds.y + bounds.height) {
yPos = bounds.y;
printer.endPage();
printer.startPage();
}
}
/**
* Computes the print area, including margins
* @param printer the printer
* @return Rectangle
*/
Rectangle computePrintArea(Printer printer) {
// Get the printable area
Rectangle rect = printer.getClientArea();
// Compute the trim
Rectangle trim = printer.computeTrim(0, 0, 0, 0);
// Get the printer's DPI
Point dpi = printer.getDPI();
// Calculate the printable area, using 1 inch margins
int left = trim.x + dpi.x;
if (left < rect.x) left = rect.x;
int right = (rect.width + trim.x + trim.width) - dpi.x;
if (right > rect.width) right = rect.width;
int top = trim.y + dpi.y;
if (top < rect.y) top = rect.y;
int bottom = (rect.height + trim.y + trim.height) - dpi.y;
if (bottom > rect.height) bottom = rect.height;
return new Rectangle(left, top, right - left, bottom - top);
}
}
|