SWT Jface Eclipse Java

/******************************************************************************
 * All Right Reserved. 
 * Copyright (c) 1998, 2004 Jackwind Li Guojie
 * 
 * Created on 2004-5-2 11:03:19 by JACK
 * $Id$
 * 
 *****************************************************************************/
/*
 * 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.jface.window.ApplicationWindow;
import org.eclipse.jface.window.WindowManager;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.custom.StyledTextPrintOptions;
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 PrintingExample {
  
  ApplicationWindow applicationWindow;
  WindowManager manager;
  
  StyledTextPrintOptions styledTextPrintOptions;
  StyledText styledText;
  
  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 PrintingExample().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.NULL);
    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();
      }
    }
  }
}