org.eclipse.swt.snippets.Snippet361.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.swt.snippets.Snippet361.java

Source

/*******************************************************************************
 * 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;
    }

}