Mega Code Archive

 
Categories / Java / SWT Jface Eclipse
 

Demonstrates printing text

//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);   } }