blob: 27beed9c3467e016957a3c104b97585e43be67d1 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007 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;
import org.eclipse.ui.internal.AnimationEngine;
/**
* 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.
*
* @since 3.3
*
*/
public class RectangleAnimationImageFeedback extends
RectangleAnimationFeedbackBase {
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 Image backingStore;
private Shell theShell;
private Display display;
private List controls = new ArrayList();
public RectangleAnimationImageFeedback(Shell parentShell, Rectangle start,
Rectangle end) {
super(parentShell, start, end);
}
public void dispose() {
backingStore.dispose();
for (Iterator ctrlIter = controls.iterator(); ctrlIter.hasNext();) {
ImageCanvas canvas = (ImageCanvas) ctrlIter.next();
canvas.dispose();
}
theShell.setVisible(false);
theShell.dispose();
}
public void initialize(AnimationEngine engine) {
display = getAnimationShell().getDisplay();
Rectangle psRect = getAnimationShell().getBounds();
theShell = new Shell(getAnimationShell(), SWT.NO_TRIM | SWT.ON_TOP);
theShell.setBounds(getAnimationShell().getBounds());
// Capture the background image
backingStore = new Image(theShell.getDisplay(), psRect);
GC gc = new GC(display);
gc.copyArea(backingStore, psRect.x, psRect.y);
gc.dispose();
// changeCoordinates();
// captureImages();
theShell.setBackgroundImage(backingStore);
theShell.setVisible(true);
display.update();
}
/* (non-Javadoc)
* @see org.eclipse.ui.internal.RectangleAnimationFeedbackBase#jobInit(org.eclipse.ui.internal.AnimationEngine)
*/
public boolean jobInit(AnimationEngine engine) {
changeCoordinates();
captureImages();
return super.jobInit(engine);
}
public void addStartRect(Rectangle rect) {
if (rect == null)
return;
// Rectangle start = Geometry.toControl(getAnimationShell(), rect);
super.addStartRect(rect);
}
public void addEndRect(Rectangle rect) {
if (rect != null) {
// Rectangle end = Geometry.toControl(getAnimationShell(), rect);
super.addEndRect(rect);
}
}
public void renderStep(AnimationEngine engine) {
Iterator ctrlIter = controls.iterator();
Iterator currentRects = getCurrentRects(engine.amount()).iterator();
while (currentRects.hasNext()) {
ImageCanvas canvas = (ImageCanvas) ctrlIter.next();
canvas.setBounds((Rectangle) currentRects.next());
}
display.update();
}
public void changeCoordinates() {
Iterator startRectIter = getStartRects().iterator();
Iterator endRectIter = getEndRects().iterator();
while (startRectIter.hasNext()) {
Rectangle startRect = (Rectangle) startRectIter.next();
Rectangle mapStartRect = Geometry.toControl(theShell, startRect);
startRect.x = mapStartRect.x;
startRect.y = mapStartRect.y;
Rectangle endRect = (Rectangle) endRectIter.next();
Rectangle mapEndRect = Geometry.toControl(theShell, endRect);
endRect.x = mapEndRect.x;
endRect.y = mapEndRect.y;
}
}
private void captureImages() {
for (Iterator iterator = getStartRects().iterator(); iterator.hasNext();) {
Rectangle rect = (Rectangle) iterator.next();
Image image = new Image(display, rect.width, rect.height);
GC gc = new GC(backingStore);
gc.copyArea(image, rect.x, rect.y);
gc.dispose();
ImageCanvas canvas = new ImageCanvas(theShell, SWT.BORDER
| SWT.NO_BACKGROUND, image);
controls.add(canvas);
}
}
}