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