Java tutorial
/******************************************************************************* * Copyright (c) 2012, 2016 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at * https://www.eclipse.org/legal/epl-2.0/ * * SPDX-License-Identifier: EPL-2.0 * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.swt.snippets; /* * example snippet: use Java2D to modify an image being displayed in an SWT GUI. * Take a screen snapshot to print the image to a printer. * * For a list of all SWT example snippets see * http://www.eclipse.org/swt/snippets/ * * @since 3.8 */ import static org.eclipse.swt.events.SelectionListener.*; import java.awt.*; import java.awt.Canvas; import java.awt.Color; import java.awt.Image; import java.awt.geom.*; import org.eclipse.swt.*; import org.eclipse.swt.accessibility.*; import org.eclipse.swt.awt.*; import org.eclipse.swt.graphics.*; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.*; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.printing.*; import org.eclipse.swt.widgets.*; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Label; public class Snippet361 { static Composite composite; // SWT static Canvas canvas; // AWT static Image image = null; // AWT static double translateX = 0, translateY = 0; static double rotate = 0; public static void main(String[] args) { final Display display = new Display(); final Shell shell = new Shell(display); shell.setText("Snippet 361"); shell.setText("Translate and Rotate an AWT Image in an SWT GUI"); shell.setLayout(new GridLayout(8, false)); Button fileButton = new Button(shell, SWT.PUSH); fileButton.setText("&Open Image File"); fileButton.addSelectionListener(widgetSelectedAdapter(e -> { String filename = new FileDialog(shell).open(); if (filename != null) { image = Toolkit.getDefaultToolkit().getImage(filename); canvas.repaint(); } })); new Label(shell, SWT.NONE).setText("Translate &X by:"); final Combo translateXCombo = new Combo(shell, SWT.NONE); translateXCombo.setItems("0", "image width", "image height", "100", "200"); translateXCombo.select(0); translateXCombo.addModifyListener(e -> { translateX = numericValue(translateXCombo); canvas.repaint(); }); new Label(shell, SWT.NONE).setText("Translate &Y by:"); final Combo translateYCombo = new Combo(shell, SWT.NONE); translateYCombo.setItems("0", "image width", "image height", "100", "200"); translateYCombo.select(0); translateYCombo.addModifyListener(e -> { translateY = numericValue(translateYCombo); canvas.repaint(); }); new Label(shell, SWT.NONE).setText("&Rotate by:"); final Combo rotateCombo = new Combo(shell, SWT.NONE); rotateCombo.setItems("0", "Pi", "Pi/2", "Pi/4", "Pi/8"); rotateCombo.select(0); rotateCombo.addModifyListener(e -> { rotate = numericValue(rotateCombo); canvas.repaint(); }); Button printButton = new Button(shell, SWT.PUSH); printButton.setText("&Print Image"); printButton.addSelectionListener(widgetSelectedAdapter(e -> { performPrintAction(display, shell); })); composite = new Composite(shell, SWT.EMBEDDED | SWT.BORDER); GridData data = new GridData(SWT.FILL, SWT.FILL, true, true, 8, 1); data.widthHint = 640; data.heightHint = 480; composite.setLayoutData(data); Frame frame = SWT_AWT.new_Frame(composite); canvas = new Canvas() { @Override public void paint(Graphics g) { if (image != null) { g.setColor(Color.WHITE); g.fillRect(0, 0, canvas.getWidth(), canvas.getHeight()); /* Use Java2D here to modify the image as desired. */ Graphics2D g2d = (Graphics2D) g; AffineTransform t = new AffineTransform(); t.translate(translateX, translateY); t.rotate(rotate); g2d.setTransform(t); /*------------*/ g.drawImage(image, 0, 0, this); } } }; frame.add(canvas); composite.getAccessible().addAccessibleListener(new AccessibleAdapter() { @Override public void getName(AccessibleEvent e) { e.result = "Image drawn in AWT Canvas"; } }); shell.pack(); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); } private static void performPrintAction(final Display display, final Shell shell) { Rectangle r = composite.getBounds(); Point p = shell.toDisplay(r.x, r.y); org.eclipse.swt.graphics.Image snapshotImage = new org.eclipse.swt.graphics.Image(display, r.width - 2, r.height - 2); GC snapshotGC = new GC(display); snapshotGC.copyArea(snapshotImage, p.x + 1, p.y + 1); PrintDialog dialog = new PrintDialog(shell, SWT.NONE); PrinterData data = new PrinterData(); data.orientation = PrinterData.LANDSCAPE; dialog.setPrinterData(data); data = dialog.open(); if (data != null) { Printer printer = new Printer(data); Point screenDPI = display.getDPI(); Point printerDPI = printer.getDPI(); int scaleFactor = printerDPI.x / screenDPI.x; Rectangle trim = printer.computeTrim(0, 0, 0, 0); if (printer.startJob("Print Image")) { ImageData imageData = snapshotImage.getImageData(); org.eclipse.swt.graphics.Image printerImage = new org.eclipse.swt.graphics.Image(printer, imageData); GC printerGC = new GC(printer); if (printer.startPage()) { printerGC.drawImage(printerImage, 0, 0, imageData.width, imageData.height, -trim.x, -trim.y, scaleFactor * imageData.width, scaleFactor * imageData.height); printer.endPage(); } printerGC.dispose(); printer.endJob(); } printer.dispose(); } snapshotImage.dispose(); snapshotGC.dispose(); } static double numericValue(Combo combo) { String string = combo.getText(); if (string.equals("image width")) return image.getWidth(canvas); if (string.equals("image height")) return image.getHeight(canvas); if (string.equals("100")) return 100; if (string.equals("200")) return 200; if (string.equals("Pi")) return Math.PI; if (string.equals("Pi/2")) return Math.PI / 2; if (string.equals("Pi/4")) return Math.PI / 4; if (string.equals("Pi/8")) return Math.PI / 8; /* Allow user-entered numbers. */ Double d = (double) 0; try { d = Double.valueOf(string); } catch (NumberFormatException ex) { } return d; } }