diff options
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.java | 323 |
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(); + } + } + } +} |