blob: 4a337ddd78c92e9d1841fd09dd78ffbe30192206 [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 org.eclipse.core.runtime.IStatus;
import org.eclipse.swt.SWTException;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.internal.misc.StatusUtil;
import org.eclipse.ui.statushandlers.StatusManager;
/**
* Base class for Cyclic animations.
*
* @since 3.3
*
*/
public abstract class ImageCycleFeedbackBase extends AnimationFeedbackBase {
protected Image[] images;
protected Image stoppedImage;
private Image offScreenImage;
private GC offScreenImageGC;
private int imageDataIndex;
private Image image;
private ImageData imageData;
protected Display display;
protected Color background;
/**
* @param parentShell
*/
public ImageCycleFeedbackBase(Shell parentShell) {
super(parentShell);
// TODO Auto-generated constructor stub
}
/**
*
* @param parentShell
* @param images :
* an array of images
*/
public ImageCycleFeedbackBase(Shell parentShell, Image[] images) {
super(parentShell);
this.images = images;
}
/**
* Set the image during progress without caching.
*
* @param image
*/
public abstract void showImage(Image image);
/**
* Save initial Image which would be stoppedImage
*
*/
public abstract void saveStoppedImage();
/**
* Set the stopped Image upon animation completion
*
* @param image
*/
public abstract void setStoppedImage(Image image);
public void dispose() {
// TODO Auto-generated method stub
if (stoppedImage == null || stoppedImage.isDisposed())
return;
setStoppedImage(stoppedImage);
if (offScreenImageGC != null && !offScreenImageGC.isDisposed())
offScreenImageGC.dispose();
if (offScreenImage != null && !offScreenImage.isDisposed())
offScreenImage.dispose();
}
public boolean jobInit(AnimationEngine engine) {
return super.jobInit(engine);
}
public void renderStep(AnimationEngine engine) {
// TODO Auto-generated method stub
if (offScreenImage == null) {
offScreenImage = getOffscreenImage();
}
try {
imageDataIndex = (imageDataIndex + 1) % images.length;
image = images[imageDataIndex];
imageData = image.getImageData();
offScreenImageGC.drawImage(image, 0, 0, imageData.width,
imageData.height, imageData.x, imageData.y,
imageData.width, imageData.height);
final Image finalImage = image;
display.syncExec(new Runnable() {
/*
* (non-Javadoc)
*
* @see java.lang.Runnable#run()
*/
public void run() {
showImage(finalImage);
}
});
/*
* Sleep for the specified delay time (adding commonly-used
* slow-down fudge factors).
*/
// try {
// Thread.sleep(30);
// } catch (InterruptedException e) {
// }
if (images == null)
return;
} catch (SWTException ex) {
IStatus status = StatusUtil.newStatus(WorkbenchPlugin.PI_WORKBENCH,
ex);
StatusManager.getManager().handle(status);
}
}
private Image getOffscreenImage() {
saveStoppedImage();
imageDataIndex = 0;
image = images[imageDataIndex];
imageData = image.getImageData();
/*
* Create an off-screen image to draw on, and fill it with the shell
* background.
*/
offScreenImage = new Image(display, imageData.width, imageData.height);
offScreenImageGC = new GC(offScreenImage);
offScreenImageGC.setBackground(background);
offScreenImageGC.fillRectangle(0, 0, imageData.width, imageData.height);
/*
* Create the first image and draw it on the off-screen image.
*/
offScreenImageGC.drawImage(image, 0, 0, imageData.width,
imageData.height, imageData.x, imageData.y, imageData.width,
imageData.height);
return offScreenImage;
}
}