blob: c0a9fc06ef2f42fd62ad474768db882884419fc0 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2010 Soyatec (http://www.soyatec.com) 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:
* Soyatec - initial API and implementation
*******************************************************************************/
package org.eclipse.xwt.utils;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import org.eclipse.xwt.XWTMaps;
import org.eclipse.xwt.internal.utils.ObjectUtil;
/**
* @author jliu
*/
public class ResourceManager {
public static ResourceManager resources = new ResourceManager();
private Map<String, Color> key2Colors = new HashMap<String, Color>();
private Map<String, Font> key2Fonts = new HashMap<String, Font>();
private Map<String, Image> key2Images = new HashMap<String, Image>();
/**
* Default constructor.
*/
private ResourceManager() {
}
public Color getColor(String colorStr) {
Color color = key2Colors.get(colorStr);
if (color == null || color.isDisposed()) {
key2Colors.put(colorStr, color = ColorTool.getColor(colorStr));
}
return color;
}
public Font getFont(String fontStr) {
Font font = key2Fonts.get(fontStr);
if (font == null || font.isDisposed()) {
key2Fonts.put(fontStr, font = FontTool.getFont(fontStr));
}
return font;
}
public Image getImage(String imagePath) {
if (imagePath == null) {
return null;
}
try {
return getImage(new URL(imagePath));
} catch (Exception e) {
return null;
}
}
public Image getImage(URL file) {
String key = file.toString();
Image image = key2Images.get(key);
if (image == null || image.isDisposed()) {
key2Images.put(key, image = ImageTool.getImage(file));
}
return image;
}
public synchronized void dispose() {
// dispose colors.
Collection<Color> colors = key2Colors.values();
for (Color color : colors) {
if (color != null) {
color.dispose();
}
}
key2Colors.clear();
// dispose fonts.
Collection<Font> fonts = key2Fonts.values();
for (Font font : fonts) {
if (font != null) {
font.dispose();
}
}
key2Colors.clear();
// dispose images
Collection<Image> images = key2Images.values();
for (Image image : images) {
if (image != null) {
image.dispose();
}
}
}
static class ColorTool {
static Color getColor(String colorStr) {
if (NamedColorsUtil.hasColor(colorStr)) {
return NamedColorsUtil.getColor(colorStr);
}
if (colorStr.toLowerCase().startsWith("swt.")) {
return getSWTColor(colorStr);
} else if (colorStr.startsWith("#")) {
try {
int rgb = Integer.parseInt(colorStr.substring(1), 16);
return getColor(rgb);
} catch (NumberFormatException e) {
return null;
}
} else if (colorStr.indexOf(",") != -1) {
List<String> rgbs = new ArrayList<String>();
StringTokenizer stk = new StringTokenizer(colorStr, ",");
while (stk.hasMoreTokens()) {
rgbs.add(stk.nextToken());
}
if (rgbs.size() == 3) {
try {
int r = Integer.parseInt(rgbs.get(0).trim());
int g = Integer.parseInt(rgbs.get(1).trim());
int b = Integer.parseInt(rgbs.get(2).trim());
return getColor(r, g, b);
} catch (NumberFormatException e) {
return null;
}
}
}
return getSWTColor(colorStr);
}
static Color getColor(int red, int green, int blue) {
if (red > 255 || green > 255 || blue > 255 || red < 0 || green < 0 || blue < 0) {
return null;
}
return new Color(Display.getCurrent(), red, green, blue);
}
static Color getColor(int rgb) {
int value = 0xff000000 | rgb;
int red = (value >> 16) & 0xFF;
int green = (value >> 8) & 0xFF;
int blue = (value >> 0) & 0xFF;
return getColor(red, green, blue);
}
static Color getSWTColor(String colorStr) {
if (!(colorStr.toLowerCase().startsWith("swt."))) {
if (!(colorStr.toLowerCase().startsWith("color_"))) {
colorStr = "COLOR_" + colorStr;
}
colorStr = "SWT." + colorStr;
}
int swtColor = XWTMaps.getColor(colorStr);
return getSWTColor(swtColor);
}
static Color getSWTColor(int swtValue) {
return Display.getCurrent().getSystemColor(swtValue);
}
}
static class FontTool {
static Font getFont(String fontStr) {
if (fontStr.indexOf(",") != -1) {
StringTokenizer stk = new StringTokenizer(fontStr, ",");
String name = null;
int height = 0;
int style = SWT.NORMAL;
while (stk.hasMoreTokens()) {
String token = stk.nextToken().trim();
if (token.equalsIgnoreCase("normal") || token.equalsIgnoreCase("bold") || token.equalsIgnoreCase("italic") || token.contains("|")) {
style = (Integer) ObjectUtil.resolveValue(token, Integer.class, style);
} else if (isInt(token)) {
height = Integer.parseInt(token);
} else {
name = token;
}
}
return getFont(name, height, style);
}
return getFont(fontStr, 12, SWT.NORMAL);
}
static boolean isInt(String value) {
try {
Integer.parseInt(value);
} catch (NumberFormatException e) {
return false;
}
return true;
}
static Font getFont(String name, int height, int style) {
if (name == null) {
return null;
}
return new Font(Display.getCurrent(), name, height, style);
}
static Font getSWTFont() {
return Display.getCurrent().getSystemFont();
}
}
static class ImageTool {
static Image getImage(String resource) {
return getImage(ResourceManager.class.getResource(resource));
}
static Image getImage(URL url) {
if (url == null) {
return null;
}
try {
InputStream stream = url.openStream();
try {
return new Image(Display.getCurrent(), stream);
} finally {
stream.close();
}
} catch (IOException e) {
return null;
}
}
}
}