package com.aelitis.azureus.ui.swt.widgets; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.*; import org.eclipse.swt.widgets.*; import org.gudy.azureus2.core3.util.AEThread2; import com.aelitis.azureus.ui.swt.imageloader.ImageLoader; public class AnimatedImage { //wait time in ms private static final int SPEED = 100; Canvas canvas; boolean running; private AEThread2 runner; private Image[] images; private int currentImage = 0; private String imageName; public AnimatedImage(Composite parent) { canvas = new Canvas(parent,SWT.NONE); Color background = null; Composite p = parent; while(p != null && background == null) { background = p.getBackground(); if(background != null) { System.out.println("background : " + background + ", composite : " + p); } p = p.getParent(); } canvas.setBackground(background); canvas.addListener(SWT.Dispose, new Listener() { public void handleEvent(Event event) { stop(); disposeImages(); } }); } private void renderNextImage() { if(!canvas.isDisposed()) { Display display = canvas.getDisplay(); if(!display.isDisposed()) { display.asyncExec( new Runnable() { public void run() { if(!canvas.isDisposed() && images != null) { currentImage++; if(currentImage >= images.length) { currentImage = 0; } if(currentImage < images.length) { Image image = images[currentImage]; if(image != null && !image.isDisposed()) { GC gc = new GC(canvas); Point canvasSize = canvas.getSize(); Rectangle imageBounds = image.getBounds(); gc.drawImage(image, (canvasSize.x-imageBounds.width)/2, (canvasSize.y-imageBounds.height)/2); gc.dispose(); } } } } }); } } } public void setLayoutData(Object data) { canvas.setLayoutData(data); } public void start() { running = true; runner = new AEThread2("image runner",true) { public void run() { while(running) { try { renderNextImage(); Thread.sleep(SPEED); } catch (Exception e) { running = false; } } } }; runner.start(); } public void stop() { running = false; } public Control getControl() { return canvas; } public void dispose() { if(canvas != null && !canvas.isDisposed()) { canvas.dispose(); } } public void setImageFromName(String imageName) { this.imageName = imageName; ImageLoader imageLoader = ImageLoader.getInstance(); images = imageLoader.getImages(imageName); } private void setImages(Image[] images) { disposeImages(); this.images = images; } private void disposeImages() { if(images != null) { ImageLoader imageLoader = ImageLoader.getInstance(); imageLoader.releaseImage(imageName); images = null; } } }