/*******************************************************************************
* Copyright (c) 2006 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.examples.graphics;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Device;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.graphics.Transform;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Spinner;
/**
* This tab demonstrates transformations, such as scaling, rotation, and invert. It allows the user to specify values
* for scaling and rotation.
*/
public class ImageTransformTab extends GraphicsTab {
private Button invertButton;
private Spinner rotateSpinner, scaleSpinnerX, scaleSpinnerY;
/**
* Constructor
*
* @param example
* A GraphicsExample
*/
public ImageTransformTab(GraphicsExample example) {
super(example);
}
/**
* This method creates the controls specific to the tab. The call to the createControlPanel method in the super
* class create the controls that are defined in the super class.
*
* @param parent
* The parent composite
*/
public void createControlPanel(Composite parent) {
Composite comp;
GridLayout gridLayout = new GridLayout(2, false);
// create spinner for the rotation angle
comp = new Composite(parent, SWT.NONE);
comp.setLayout(gridLayout);
new Label(comp, SWT.CENTER).setText(GraphicsExample.getResourceString("Rotate")); //$NON-NLS-1$
rotateSpinner = new Spinner(comp, SWT.BORDER | SWT.WRAP);
rotateSpinner.setSelection(0);
rotateSpinner.setMinimum(0);
rotateSpinner.setMaximum(360);
rotateSpinner.setIncrement(10);
rotateSpinner.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
example.redraw();
}
});
// create a slider for scaling along the x axis
comp = new Composite(parent, SWT.NONE);
comp.setLayout(gridLayout);
new Label(comp, SWT.CENTER).setText(GraphicsExample.getResourceString("xscale")); //$NON-NLS-1$
scaleSpinnerX = new Spinner(comp, SWT.BORDER | SWT.WRAP);
scaleSpinnerX.setDigits(2);
scaleSpinnerX.setMinimum(1);
scaleSpinnerX.setMaximum(500);
scaleSpinnerX.setSelection(75);
scaleSpinnerX.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
example.redraw();
}
});
// create a slider for scaling along the y axis
comp = new Composite(parent, SWT.NONE);
comp.setLayout(gridLayout);
new Label(comp, SWT.CENTER).setText(GraphicsExample.getResourceString("yscale")); //$NON-NLS-1$
scaleSpinnerY = new Spinner(comp, SWT.BORDER | SWT.WRAP);
scaleSpinnerY.setDigits(2);
scaleSpinnerY.setMinimum(1);
scaleSpinnerY.setMaximum(500);
scaleSpinnerY.setSelection(75);
scaleSpinnerY.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
example.redraw();
}
});
// create a button for "invert"
comp = new Composite(parent, SWT.NONE);
comp.setLayout(new GridLayout());
invertButton = new Button(comp, SWT.TOGGLE);
invertButton.setText(GraphicsExample.getResourceString("Invert")); //$NON-NLS-1$
invertButton.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
example.redraw();
}
});
}
public String getCategory() {
return GraphicsExample.getResourceString("Transform"); //$NON-NLS-1$
}
public String getDescription() {
return GraphicsExample.getResourceString("TransformImgDescription"); //$NON-NLS-1$
}
public String getText() {
return GraphicsExample.getResourceString("Image"); //$NON-NLS-1$
}
/*
* (non-Javadoc)
*
* @see org.eclipse.swt.examples.graphics.GraphicsTab#paint(org.eclipse.swt.graphics.GC, int, int)
*/
public void paint(GC gc, int width, int height) {
if (!example.checkAdvancedGraphics())
return;
Device device = gc.getDevice();
Image image = GraphicsExample.loadImage(device, GraphicsExample.class, "ace_club.jpg");
Transform transform = new Transform(device);
// scale image
transform.scale(scaleSpinnerX.getSelection() / 100f, scaleSpinnerY.getSelection() / 100f);
// rotate on center of image
Rectangle rect = image.getBounds();
transform.translate(rect.width / 2, rect.height / 2);
transform.rotate(rotateSpinner.getSelection());
transform.translate(-rect.width / 2, -rect.height / 2);
if (invertButton.getSelection())
transform.invert();
gc.setTransform(transform);
gc.drawImage(image, 0, 0);
gc.drawRoundRectangle(0, 0, image.getBounds().width, image.getBounds().height, 22, 22);
transform.dispose();
image.dispose();
}
}