/*******************************************************************************
 * Copyright (c) 2012 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * 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 java.awt.Color;
import java.awt.Frame;
import java.awt.Canvas;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.geom.AffineTransform;

import org.eclipse.swt.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.printing.*;
import org.eclipse.swt.accessibility.*;
import org.eclipse.swt.awt.SWT_AWT;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;

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("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(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent 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(new String[] {"0", "image width", "image height", "100", "200"});
		translateXCombo.select(0);
		translateXCombo.addModifyListener(new ModifyListener() {
			@Override
			public void modifyText(ModifyEvent 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(new String[] {"0", "image width", "image height", "100", "200"});
		translateYCombo.select(0);
		translateYCombo.addModifyListener(new ModifyListener() {
			@Override
			public void modifyText(ModifyEvent e) {
				translateY = numericValue(translateYCombo);
				canvas.repaint();
			}
		});
		
		new Label(shell, SWT.NONE).setText("&Rotate by:");
		final Combo rotateCombo = new Combo(shell, SWT.NONE);
		rotateCombo.setItems(new String[] {"0", "Pi", "Pi/2", "Pi/4", "Pi/8"});
		rotateCombo.select(0);
		rotateCombo.addModifyListener(new ModifyListener() {
			@Override
			public void modifyText(ModifyEvent e) {
				rotate = numericValue(rotateCombo);
				canvas.repaint();
			}
		});

		Button printButton = new Button(shell, SWT.PUSH);
		printButton.setText("&Print Image");
		printButton.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				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 ();
			}
		});
		
		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();
	}
	
	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 (double) 100;
		if (string.equals("200")) return (double) 200;
		if (string.equals("Pi")) return Math.PI;
		if (string.equals("Pi/2")) return Math.PI / (double) 2;
		if (string.equals("Pi/4")) return Math.PI / (double) 4;
		if (string.equals("Pi/8")) return Math.PI / (double) 8;
		/* Allow user-entered numbers. */
		Double d = (double) 0;
		try {
			d = new Double(string);
		} catch(NumberFormatException ex) {
		}
		return d;
	}

}
