blob: fee629da9e23f0ce86919c4e8b4b7689773c1b09 [file] [log] [blame]
/*******************************************************************************
* 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.ui.internal;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.jface.util.Geometry;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
/**
* @since 3.3
*
*/
public class ImageAnimationFeedback extends DefaultAnimationFeedback {
private class ImageCanvas extends Canvas {
private Image image;
/**
* @param parent
* @param style
*/
public ImageCanvas(Composite parent, int style, Image image) {
super(parent, style);
this.image = image;
addPaintListener(new PaintListener() {
public void paintControl(PaintEvent e) {
paintImage(e.gc);
}
});
}
/**
* @param gc
*/
protected void paintImage(GC gc) {
gc.drawImage(image, 0, 0, image.getBounds().width, image.getBounds().height, 0, 0, getBounds().width, getBounds().height);
}
/* (non-Javadoc)
* @see org.eclipse.swt.widgets.Widget#dispose()
*/
public void dispose() {
super.dispose();
image.dispose();
}
}
private Display display;
private Shell theShell;
private List startRects = new ArrayList();
private List endRects = new ArrayList();
private List controls = new ArrayList();
private Image backingStore;
/**
* Creates an animation effect where the interpolated rectangles are displayed using Canvas
* controls that show an image of the bits that were originally occupied by the various
* 'start' rectangles.
*/
public ImageAnimationFeedback() {}
/**
* @param parentShell
*/
public void initialize(Shell parentShell, Rectangle startRect, Rectangle endRect) {
display = parentShell.getDisplay();
Rectangle psRect = parentShell.getBounds();
theShell = new Shell(parentShell, SWT.NO_TRIM | SWT.ON_TOP);
theShell.setBounds(parentShell.getBounds());
addStartRect(startRect);
addEndRect(endRect);
// Capture the background image
backingStore = new Image(theShell.getDisplay(), psRect);
GC gc = new GC(display);
gc.copyArea(backingStore, psRect.x, psRect.y);
gc.dispose();
theShell.setBackgroundImage(backingStore);
theShell.setVisible(true);
display.update();
}
public void addStartRect(Rectangle rect) {
if (rect != null) {
Rectangle start = Geometry.toControl(theShell, rect);
startRects.add(start);
Image image = new Image(display, rect.width, rect.height);
GC gc = new GC(display);
gc.copyArea(image, rect.x, rect.y);
gc.dispose();
ImageCanvas canvas = new ImageCanvas(theShell, SWT.BORDER | SWT.NO_BACKGROUND, image);
controls.add(canvas);
}
}
public void addEndRect(Rectangle rect) {
if (rect != null) {
Rectangle end = Geometry.toControl(theShell, rect);
endRects.add(end);
}
}
public void renderStep(double amount) {
// Move the controls to the new interpolation position
Iterator startIter = startRects.iterator();
Iterator endIter = endRects.iterator();
Iterator ctrlIter = controls.iterator();
while (startIter.hasNext()) {
Rectangle start = (Rectangle) startIter.next();
Rectangle end = (Rectangle) endIter.next();
ImageCanvas canvas = (ImageCanvas) ctrlIter.next();
// Get the bounds of the interpolated rect
Rectangle curRect = RectangleAnimation.interpolate(start, end, amount);
canvas.setBounds(curRect);
}
display.update();
}
public void jobInit() {
}
/**
*
*/
public void dispose() {
backingStore.dispose();
for (Iterator ctrlIter = controls.iterator(); ctrlIter.hasNext();) {
ImageCanvas canvas = (ImageCanvas) ctrlIter.next();
canvas.dispose();
}
theShell.setVisible(false);
theShell.dispose();
}
}