Mega Code Archive

 
Categories / Java / SWT Jface Eclipse
 

Print text to printer, with word wrap and pagination

/*  * Printing example snippet: print text to printer, with word wrap and pagination  *  * For a list of all SWT example snippets see  * http://dev.eclipse.org/viewcvs/index.cgi/%7Echeckout%7E/platform-swt-home/dev.html#snippets  */ import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.printing.PrintDialog; import org.eclipse.swt.printing.Printer; import org.eclipse.swt.printing.PrinterData; import org.eclipse.swt.widgets.ColorDialog; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.FontDialog; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.MessageBox; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; public class Snippet133 {   Display display;   Shell shell;   Text text;   Font font;   Color foregroundColor, backgroundColor;   Printer printer;   GC gc;   Font printerFont;   Color printerForegroundColor, printerBackgroundColor;   int lineHeight = 0;   int tabWidth = 0;   int leftMargin, rightMargin, topMargin, bottomMargin;   int x, y;   int index, end;   String textToPrint;   String tabs;   StringBuffer wordBuffer;   public static void main(String[] args) {     new Snippet133().open();   }   void open() {     display = new Display();     font = new Font(display, "Courier", 10, SWT.NORMAL);     foregroundColor = display.getSystemColor(SWT.COLOR_BLACK);     backgroundColor = display.getSystemColor(SWT.COLOR_WHITE);     shell = new Shell(display);     shell.setLayout(new FillLayout());     shell.setText("Print Text");     shell.setMaximized(true);     text = new Text(shell, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL         | SWT.H_SCROLL);     text.setFont(font);     text.setForeground(foregroundColor);     text.setBackground(backgroundColor);     Menu menuBar = new Menu(shell, SWT.BAR);     shell.setMenuBar(menuBar);     MenuItem item = new MenuItem(menuBar, SWT.CASCADE);     item.setText("&File");     Menu fileMenu = new Menu(shell, SWT.DROP_DOWN);     item.setMenu(fileMenu);     item = new MenuItem(fileMenu, SWT.PUSH);     item.setText("&Open...");     item.setAccelerator(SWT.CTRL + 'O');     item.addSelectionListener(new SelectionAdapter() {       public void widgetSelected(SelectionEvent event) {         menuOpen();       }     });     item = new MenuItem(fileMenu, SWT.PUSH);     item.setText("Font...");     item.addSelectionListener(new SelectionAdapter() {       public void widgetSelected(SelectionEvent event) {         menuFont();       }     });     item = new MenuItem(fileMenu, SWT.PUSH);     item.setText("Foreground Color...");     item.addSelectionListener(new SelectionAdapter() {       public void widgetSelected(SelectionEvent event) {         menuForegroundColor();       }     });     item = new MenuItem(fileMenu, SWT.PUSH);     item.setText("Background Color...");     item.addSelectionListener(new SelectionAdapter() {       public void widgetSelected(SelectionEvent event) {         menuBackgroundColor();       }     });     item = new MenuItem(fileMenu, SWT.PUSH);     item.setText("&Print...");     item.setAccelerator(SWT.CTRL + 'P');     item.addSelectionListener(new SelectionAdapter() {       public void widgetSelected(SelectionEvent event) {         menuPrint();       }     });     new MenuItem(fileMenu, SWT.SEPARATOR);     item = new MenuItem(fileMenu, SWT.PUSH);     item.setText("E&xit");     item.addSelectionListener(new SelectionAdapter() {       public void widgetSelected(SelectionEvent event) {         System.exit(0);       }     });     shell.pack();     shell.open();     while (!shell.isDisposed()) {       if (!display.readAndDispatch())         display.sleep();     }     if (font != null)       font.dispose();     if (foregroundColor != null)       foregroundColor.dispose();     if (backgroundColor != null)       backgroundColor.dispose();   }   void menuOpen() {     final String textString;     FileDialog dialog = new FileDialog(shell, SWT.OPEN);     dialog.setFilterExtensions(new String[] { "*.java", "*.*" });     String name = dialog.open();     if ((name == null) || (name.length() == 0))       return;     try {       File file = new File(name);       FileInputStream stream = new FileInputStream(file.getPath());       try {         Reader in = new BufferedReader(new InputStreamReader(stream));         char[] readBuffer = new char[2048];         StringBuffer buffer = new StringBuffer((int) file.length());         int n;         while ((n = in.read(readBuffer)) > 0) {           buffer.append(readBuffer, 0, n);         }         textString = buffer.toString();         stream.close();       } catch (IOException e) {         MessageBox box = new MessageBox(shell, SWT.ICON_ERROR);         box.setMessage("Error reading file:\n" + name);         box.open();         return;       }     } catch (FileNotFoundException e) {       MessageBox box = new MessageBox(shell, SWT.ICON_ERROR);       box.setMessage("File not found:\n" + name);       box.open();       return;     }     text.setText(textString);   }   void menuFont() {     FontDialog fontDialog = new FontDialog(shell);     fontDialog.setFontList(font.getFontData());     FontData fontData = fontDialog.open();     if (fontData != null) {       if (font != null)         font.dispose();       font = new Font(display, fontData);       text.setFont(font);     }   }   void menuForegroundColor() {     ColorDialog colorDialog = new ColorDialog(shell);     colorDialog.setRGB(foregroundColor.getRGB());     RGB rgb = colorDialog.open();     if (rgb != null) {       if (foregroundColor != null)         foregroundColor.dispose();       foregroundColor = new Color(display, rgb);       text.setForeground(foregroundColor);     }   }   void menuBackgroundColor() {     ColorDialog colorDialog = new ColorDialog(shell);     colorDialog.setRGB(backgroundColor.getRGB());     RGB rgb = colorDialog.open();     if (rgb != null) {       if (backgroundColor != null)         backgroundColor.dispose();       backgroundColor = new Color(display, rgb);       text.setBackground(backgroundColor);     }   }   void menuPrint() {     PrintDialog dialog = new PrintDialog(shell, SWT.NONE);     PrinterData data = dialog.open();     if (data == null)       return;     if (data.printToFile) {       data.fileName = "print.out"; // you probably want to ask the user                       // for a filename     }     /*      * Get the text to print from the Text widget (you could get it from      * anywhere, i.e. your java model)      */     textToPrint = text.getText();     /*      * Do the printing in a background thread so that spooling does not      * freeze the UI.      */     printer = new Printer(data);     Thread printingThread = new Thread("Printing") {       public void run() {         print(printer);         printer.dispose();       }     };     printingThread.start();   }   void print(Printer printer) {     if (printer.startJob("Text")) { // the string is the job name - shows up                     // in the printer's job list       Rectangle clientArea = printer.getClientArea();       Rectangle trim = printer.computeTrim(0, 0, 0, 0);       Point dpi = printer.getDPI();       leftMargin = dpi.x + trim.x; // one inch from left side of paper       rightMargin = clientArea.width - dpi.x + trim.x + trim.width; // one                                       // inch                                       // from                                       // right                                       // side                                       // of                                       // paper       topMargin = dpi.y + trim.y; // one inch from top edge of paper       bottomMargin = clientArea.height - dpi.y + trim.y + trim.height; // one                                         // inch                                         // from                                         // bottom                                         // edge                                         // of                                         // paper       /* Create a buffer for computing tab width. */       int tabSize = 4; // is tab width a user setting in your UI?       StringBuffer tabBuffer = new StringBuffer(tabSize);       for (int i = 0; i < tabSize; i++)         tabBuffer.append(' ');       tabs = tabBuffer.toString();       /*        * Create printer GC, and create and set the printer font &        * foreground color.        */       gc = new GC(printer);       FontData fontData = font.getFontData()[0];       printerFont = new Font(printer, fontData.getName(), fontData           .getHeight(), fontData.getStyle());       gc.setFont(printerFont);       tabWidth = gc.stringExtent(tabs).x;       lineHeight = gc.getFontMetrics().getHeight();       RGB rgb = foregroundColor.getRGB();       printerForegroundColor = new Color(printer, rgb);       gc.setForeground(printerForegroundColor);       rgb = backgroundColor.getRGB();       printerBackgroundColor = new Color(printer, rgb);       gc.setBackground(printerBackgroundColor);       /* Print text to current gc using word wrap */       printText();       printer.endJob();       /* Cleanup graphics resources used in printing */       printerFont.dispose();       printerForegroundColor.dispose();       printerBackgroundColor.dispose();       gc.dispose();     }   }   void printText() {     printer.startPage();     wordBuffer = new StringBuffer();     x = leftMargin;     y = topMargin;     index = 0;     end = textToPrint.length();     while (index < end) {       char c = textToPrint.charAt(index);       index++;       if (c != 0) {         if (c == 0x0a || c == 0x0d) {           if (c == 0x0d && index < end               && textToPrint.charAt(index) == 0x0a) {             index++; // if this is cr-lf, skip the lf           }           printWordBuffer();           newline();         } else {           if (c != '\t') {             wordBuffer.append(c);           }           if (Character.isWhitespace(c)) {             printWordBuffer();             if (c == '\t') {               x += tabWidth;             }           }         }       }     }     if (y + lineHeight <= bottomMargin) {       printer.endPage();     }   }   void printWordBuffer() {     if (wordBuffer.length() > 0) {       String word = wordBuffer.toString();       int wordWidth = gc.stringExtent(word).x;       if (x + wordWidth > rightMargin) {         /* word doesn't fit on current line, so wrap */         newline();       }       gc.drawString(word, x, y, false);       x += wordWidth;       wordBuffer = new StringBuffer();     }   }   void newline() {     x = leftMargin;     y += lineHeight;     if (y + lineHeight > bottomMargin) {       printer.endPage();       if (index + 1 < end) {         y = topMargin;         printer.startPage();       }     }   } }