Mercurial > projects > dwt-samples
diff snippets/toolbar/Snippet288.d @ 78:4a04b6759f98
Clean up directory names
author | John Reimer <terminal.node@gmail.com> |
---|---|
date | Sat, 10 May 2008 13:32:45 -0700 |
parents | |
children | 1f0a7a472680 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/snippets/toolbar/Snippet288.d Sat May 10 13:32:45 2008 -0700 @@ -0,0 +1,208 @@ +/******************************************************************************* + * Copyright (c) 2008 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 + *******************************************************************************/ +module snippets.toolbar.Snippet288; + +/* + * Create a ToolBar containing animated GIFs + * + * For a list of all SWT example snippets see + * http://www.eclipse.org/swt/snippets/ + */ +import dwt.DWT; +import dwt.DWTException; +import dwt.graphics.GC; +import dwt.graphics.Color; +import dwt.graphics.Image; +import dwt.graphics.ImageLoader; +import dwt.graphics.ImageData; +import dwt.widgets.Display; +import dwt.widgets.Shell; +import dwt.widgets.ToolBar; +import dwt.widgets.ToolItem; +import dwt.widgets.FileDialog; +import dwt.dwthelper.Runnable; + +import tango.io.FilePath; +import tango.io.FileConst; +import tango.core.Thread; +import tango.io.Stdout; +import tango.util.Convert; +import tango.core.Exception; + +static Display display; +static Shell shell; +static GC shellGC; +static Color shellBackground; +static ImageLoader[] loader; +static ImageData[][] imageDataArray; +static Thread[] animateThread; +static Image[][] image; +private static ToolItem[] item; +static final bool useGIFBackground = false; + +void main () { + display = new Display(); + Shell shell = new Shell (display); + shellBackground = shell.getBackground(); + FileDialog dialog = new FileDialog(shell, DWT.OPEN | DWT.MULTI); + dialog.setText("Select Multiple Animated GIFs"); + dialog.setFilterExtensions(["*.gif"]); + char[] filename = dialog.open(); + char[][] filenames = dialog.getFileNames(); + int numToolBarItems = filenames.length; + if (numToolBarItems > 0) { + try { + loadAllImages((new FilePath(filename)).parent, filenames); + } catch (DWTException e) { + Stdout.print("There was an error loading an image.").newline; + e.printStackTrace(); + } + ToolBar toolBar = new ToolBar (shell, DWT.FLAT | DWT.BORDER | DWT.WRAP); + item = new ToolItem[numToolBarItems]; + for (int i = 0; i < numToolBarItems; i++) { + item[i] = new ToolItem (toolBar, DWT.PUSH); + item[i].setImage(image[i][0]); + } + toolBar.pack (); + shell.open (); + + startAnimationThreads(); + + while (!shell.isDisposed()) { + if (!display.readAndDispatch ()) display.sleep (); + } + + for (int i = 0; i < numToolBarItems; i++) { + for (int j = 0; j < image[i].length; j++) { + image[i][j].dispose(); + } + } + display.dispose (); + } + thread_joinAll(); +} + +private static void loadAllImages(char[] directory, char[][] filenames) { + int numItems = filenames.length; + loader.length = numItems; + imageDataArray.length = numItems; + image.length = numItems; + for (int i = 0; i < numItems; i++) { + loader[i] = new ImageLoader(); + int fullWidth = loader[i].logicalScreenWidth; + int fullHeight = loader[i].logicalScreenHeight; + imageDataArray[i] = loader[i].load(directory ~ FileConst.PathSeparatorChar ~ filenames[i]); + int numFramesOfAnimation = imageDataArray[i].length; + image[i] = new Image[numFramesOfAnimation]; + for (int j = 0; j < numFramesOfAnimation; j++) { + if (j == 0) { + //for the first frame of animation, just draw the first frame + image[i][j] = new Image(display, imageDataArray[i][j]); + fullWidth = imageDataArray[i][j].width; + fullHeight = imageDataArray[i][j].height; + } + else { + //after the first frame of animation, draw the background or previous frame first, then the new image data + image[i][j] = new Image(display, fullWidth, fullHeight); + GC gc = new GC(image[i][j]); + gc.setBackground(shellBackground); + gc.fillRectangle(0, 0, fullWidth, fullHeight); + ImageData imageData = imageDataArray[i][j]; + switch (imageData.disposalMethod) { + case DWT.DM_FILL_BACKGROUND: + /* Fill with the background color before drawing. */ + Color bgColor = null; + if (useGIFBackground && loader[i].backgroundPixel != -1) { + bgColor = new Color(display, imageData.palette.getRGB(loader[i].backgroundPixel)); + } + gc.setBackground(bgColor !is null ? bgColor : shellBackground); + gc.fillRectangle(imageData.x, imageData.y, imageData.width, imageData.height); + if (bgColor !is null) bgColor.dispose(); + break; + default: + /* Restore the previous image before drawing. */ + gc.drawImage( + image[i][j-1], + 0, + 0, + fullWidth, + fullHeight, + 0, + 0, + fullWidth, + fullHeight); + break; + } + Image newFrame = new Image(display, imageData); + gc.drawImage(newFrame, + 0, + 0, + imageData.width, + imageData.height, + imageData.x, + imageData.y, + imageData.width, + imageData.height); + newFrame.dispose(); + gc.dispose(); + } + } + } +} + +private static void startAnimationThreads() { + animateThread = new Thread[image.length]; + for (int ii = 0; ii < image.length; ii++) { + animateThread[ii] = new class(ii) Thread { + int imageDataIndex = 0; + int id = 0; + this(int _id) { + id = _id; + name = "Animation "~to!(char[])(ii); + isDaemon = true; + super(&run); + } + void run() { + try { + int repeatCount = loader[id].repeatCount; + while (loader[id].repeatCount == 0 || repeatCount > 0) { + imageDataIndex = (imageDataIndex + 1) % imageDataArray[id].length; + if (!display.isDisposed()) { + display.asyncExec(new class Runnable { + public void run() { + if (!item[id].isDisposed()) + item[id].setImage(image[id][imageDataIndex]); + } + }); + } + + /* Sleep for the specified delay time (adding commonly-used slow-down fudge factors). */ + try { + int ms = imageDataArray[id][imageDataIndex].delayTime * 10; + if (ms < 20) ms += 30; + if (ms < 30) ms += 10; + Thread.sleep(0.001*ms); + } catch (ThreadException e) { + } + + /* If we have just drawn the last image, decrement the repeat count and start again. */ + if (imageDataIndex == imageDataArray[id].length - 1) repeatCount--; + } + } catch (DWTException ex) { + Stdout.print("There was an error animating the GIF").newline; + ex.printStackTrace(); + } + } + }; + animateThread[ii].start(); + } +} +