summaryrefslogtreecommitdiffstats
path: root/examples/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet133.java
diff options
context:
space:
mode:
Diffstat (limited to 'examples/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet133.java')
-rw-r--r--examples/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet133.java323
1 files changed, 323 insertions, 0 deletions
diff --git a/examples/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet133.java b/examples/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet133.java
new file mode 100644
index 0000000000..c1b5bf834e
--- /dev/null
+++ b/examples/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet133.java
@@ -0,0 +1,323 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swt.snippets;
+
+/*
+ * 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.*;
+import org.eclipse.swt.*;
+import org.eclipse.swt.graphics.*;
+import org.eclipse.swt.widgets.*;
+import org.eclipse.swt.events.*;
+import org.eclipse.swt.layout.*;
+import org.eclipse.swt.printing.*;
+
+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.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();
+ }
+ }
+ }
+}