/* * Copyright (c) 2007-2008 Matthew Hall 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: * Matthew Hall - initial API and implementation */ package org.eclipse.nebula.paperclips.core.internal.util; import java.util.HashMap; import java.util.Map; import java.util.WeakHashMap; import org.eclipse.nebula.paperclips.core.PaperClips; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Device; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.RGB; /** * Manages a pool of graphics resources for a graphics device (fonts, colors). * * @author Matthew Hall */ public class ResourcePool { private static Map devices = new WeakHashMap(); // Map <Device, // ResourcePool> /** * Returns a SharedGraphics which creates resources on the given device. * * @param device * the device which resources will be created on. * @return a SharedGraphics which creates resources on the given device. */ public synchronized static ResourcePool forDevice(Device device) { Util.notNull(device); notDisposed(device); ResourcePool sharedGraphics = (ResourcePool) devices.get(device); if (sharedGraphics == null) { sharedGraphics = new ResourcePool(device); devices.put(device, sharedGraphics); } return sharedGraphics; } private static void notDisposed(Device device) { if (device.isDisposed()) PaperClips.error(SWT.ERROR_DEVICE_DISPOSED); } private final Device device; private final Map fonts; // Map <FontData, Font> private final Map colors; // Map <RGB, Color> private ResourcePool(Device device) { this.device = device; this.fonts = new HashMap(); this.colors = new HashMap(); } /** * Returns a font for the passed in FontData. * * @param fontData * FontData describing the required font. * @return a font for the passed in FontData. */ public Font getFont(FontData fontData) { if (fontData == null) return null; notDisposed(device); Font font = (Font) fonts.get(fontData); if (font == null) { font = new Font(device, fontData); fonts.put(SWTUtil.copy(fontData), font); } return font; } /** * Returns a color for the passed in RGB. * * @param rgb * RGB describing the required color. * @return a color for the passed in RGB. */ public Color getColor(RGB rgb) { if (rgb == null) return null; notDisposed(device); Color color = (Color) colors.get(rgb); if (color == null) { color = new Color(device, rgb); colors.put(SWTUtil.copy(rgb), color); } return color; } }