/******************************************************************************* * Copyright (c) 2000, 2012 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.swt.examples.fileviewer; import org.eclipse.swt.*; import org.eclipse.swt.graphics.*; import org.eclipse.swt.program.*; import org.eclipse.swt.widgets.*; import java.io.*; import java.util.*; /** * Manages icons for the application. * This is necessary as we could easily end up creating thousands of icons * bearing the same image. */ class IconCache { // Stock images public final int shellIcon = 0, iconClosedDrive = 1, iconClosedFolder = 2, iconFile = 3, iconOpenDrive = 4, iconOpenFolder = 5, cmdCopy = 6, cmdCut = 7, cmdDelete = 8, cmdParent = 9, cmdPaste = 10, cmdPrint = 11, cmdRefresh = 12, cmdRename = 13, cmdSearch = 14; public final String[] stockImageLocations = { "generic_example.gif", "icon_ClosedDrive.gif", "icon_ClosedFolder.gif", "icon_File.gif", "icon_OpenDrive.gif", "icon_OpenFolder.gif", "cmd_Copy.gif", "cmd_Cut.gif", "cmd_Delete.gif", "cmd_Parent.gif", "cmd_Paste.gif", "cmd_Print.gif", "cmd_Refresh.gif", "cmd_Rename.gif", "cmd_Search.gif" }; public Image stockImages[]; // Stock cursors public final int cursorDefault = 0, cursorWait = 1; public Cursor stockCursors[]; // Cached icons private Hashtable iconCache; /* map Program to Image */ public IconCache() { } /** * Loads the resources * * @param display the display */ public void initResources(Display display) { if (stockImages == null) { stockImages = new Image[stockImageLocations.length]; for (int i = 0; i < stockImageLocations.length; ++i) { Image image = createStockImage(display, stockImageLocations[i]); if (image == null) { freeResources(); throw new IllegalStateException( FileViewer.getResourceString("error.CouldNotLoadResources")); } stockImages[i] = image; } } if (stockCursors == null) { stockCursors = new Cursor[] { null, new Cursor(display, SWT.CURSOR_WAIT) }; } iconCache = new Hashtable(); } /** * Frees the resources */ public void freeResources() { if (stockImages != null) { for (int i = 0; i < stockImages.length; ++i) { final Image image = stockImages[i]; if (image != null) image.dispose(); } stockImages = null; } if (iconCache != null) { for (Enumeration it = iconCache.elements(); it.hasMoreElements(); ) { Image image = (Image) it.nextElement(); image.dispose(); } } if (stockCursors != null) { for (int i = 0; i < stockCursors.length; ++i) { final Cursor cursor = stockCursors[i]; if (cursor != null) cursor.dispose(); } stockCursors = null; } } /** * Creates a stock image * * @param display the display * @param path the relative path to the icon */ private Image createStockImage(Display display, String path) { InputStream stream = IconCache.class.getResourceAsStream (path); ImageData imageData = new ImageData (stream); ImageData mask = imageData.getTransparencyMask (); Image result = new Image (display, imageData, mask); try { stream.close (); } catch (IOException e) { e.printStackTrace (); } return result; } /** * Gets an image for a file associated with a given program * * @param program the Program */ public Image getIconFromProgram(Program program) { Image image = (Image) iconCache.get(program); if (image == null) { ImageData imageData = program.getImageData(); if (imageData != null) { image = new Image(null, imageData, imageData.getTransparencyMask()); iconCache.put(program, image); } else { image = stockImages[iconFile]; } } return image; } }