Eclipseplugins
SWTResourceManager.java
1 /*******************************************************************************
2  * Copyright (c) 2011 Google, Inc.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Eclipse Public License v1.0
5  * which accompanies this distribution, and is available at
6  * http://www.eclipse.org/legal/epl-v10.html
7  *
8  * Contributors:
9  * Google, Inc. - initial API and implementation
10  *******************************************************************************/
11 package org.eclipse.wb.swt;
12 
13 import java.io.FileInputStream;
14 import java.io.IOException;
15 import java.io.InputStream;
16 import java.util.HashMap;
17 import java.util.Map;
18 
19 import org.eclipse.swt.SWT;
20 import org.eclipse.swt.graphics.Color;
21 import org.eclipse.swt.graphics.Cursor;
22 import org.eclipse.swt.graphics.Font;
23 import org.eclipse.swt.graphics.FontData;
24 import org.eclipse.swt.graphics.GC;
25 import org.eclipse.swt.graphics.Image;
26 import org.eclipse.swt.graphics.ImageData;
27 import org.eclipse.swt.graphics.RGB;
28 import org.eclipse.swt.graphics.Rectangle;
29 import org.eclipse.swt.widgets.Display;
30 
43 public class SWTResourceManager {
45  //
46  // Color
47  //
49  private static Map<RGB, Color> m_colorMap = new HashMap<RGB, Color>();
57  public static Color getColor(int systemColorID) {
58  Display display = Display.getCurrent();
59  return display.getSystemColor(systemColorID);
60  }
72  public static Color getColor(int r, int g, int b) {
73  return getColor(new RGB(r, g, b));
74  }
82  public static Color getColor(RGB rgb) {
83  Color color = m_colorMap.get(rgb);
84  if (color == null) {
85  Display display = Display.getCurrent();
86  color = new Color(display, rgb);
87  m_colorMap.put(rgb, color);
88  }
89  return color;
90  }
94  public static void disposeColors() {
95  for (Color color : m_colorMap.values()) {
96  color.dispose();
97  }
98  m_colorMap.clear();
99  }
101  //
102  // Image
103  //
105 
108  private static Map<String, Image> m_imageMap = new HashMap<String, Image>();
116  protected static Image getImage(InputStream stream) throws IOException {
117  try {
118  Display display = Display.getCurrent();
119  ImageData data = new ImageData(stream);
120  if (data.transparentPixel > 0) {
121  return new Image(display, data, data.getTransparencyMask());
122  }
123  return new Image(display, data);
124  } finally {
125  stream.close();
126  }
127  }
135  public static Image getImage(String path) {
136  Image image = m_imageMap.get(path);
137  if (image == null) {
138  try {
139  image = getImage(new FileInputStream(path));
140  m_imageMap.put(path, image);
141  } catch (Exception e) {
142  image = getMissingImage();
143  m_imageMap.put(path, image);
144  }
145  }
146  return image;
147  }
157  public static Image getImage(Class<?> clazz, String path) {
158  String key = clazz.getName() + '|' + path;
159  Image image = m_imageMap.get(key);
160  if (image == null) {
161  try {
162  image = getImage(clazz.getResourceAsStream(path));
163  m_imageMap.put(key, image);
164  } catch (Exception e) {
165  image = getMissingImage();
166  m_imageMap.put(key, image);
167  }
168  }
169  return image;
170  }
171  private static final int MISSING_IMAGE_SIZE = 10;
175  private static Image getMissingImage() {
176  Image image = new Image(Display.getCurrent(), MISSING_IMAGE_SIZE, MISSING_IMAGE_SIZE);
177  //
178  GC gc = new GC(image);
179  gc.setBackground(getColor(SWT.COLOR_RED));
180  gc.fillRectangle(0, 0, MISSING_IMAGE_SIZE, MISSING_IMAGE_SIZE);
181  gc.dispose();
182  //
183  return image;
184  }
188  public static final int TOP_LEFT = 1;
192  public static final int TOP_RIGHT = 2;
196  public static final int BOTTOM_LEFT = 3;
200  public static final int BOTTOM_RIGHT = 4;
204  protected static final int LAST_CORNER_KEY = 5;
208  @SuppressWarnings("unchecked")
209  private static Map<Image, Map<Image, Image>>[] m_decoratedImageMap = new Map[LAST_CORNER_KEY];
219  public static Image decorateImage(Image baseImage, Image decorator) {
220  return decorateImage(baseImage, decorator, BOTTOM_RIGHT);
221  }
233  public static Image decorateImage(final Image baseImage, final Image decorator, final int corner) {
234  if (corner <= 0 || corner >= LAST_CORNER_KEY) {
235  throw new IllegalArgumentException("Wrong decorate corner");
236  }
237  Map<Image, Map<Image, Image>> cornerDecoratedImageMap = m_decoratedImageMap[corner];
238  if (cornerDecoratedImageMap == null) {
239  cornerDecoratedImageMap = new HashMap<Image, Map<Image, Image>>();
240  m_decoratedImageMap[corner] = cornerDecoratedImageMap;
241  }
242  Map<Image, Image> decoratedMap = cornerDecoratedImageMap.get(baseImage);
243  if (decoratedMap == null) {
244  decoratedMap = new HashMap<Image, Image>();
245  cornerDecoratedImageMap.put(baseImage, decoratedMap);
246  }
247  //
248  Image result = decoratedMap.get(decorator);
249  if (result == null) {
250  Rectangle bib = baseImage.getBounds();
251  Rectangle dib = decorator.getBounds();
252  //
253  result = new Image(Display.getCurrent(), bib.width, bib.height);
254  //
255  GC gc = new GC(result);
256  gc.drawImage(baseImage, 0, 0);
257  if (corner == TOP_LEFT) {
258  gc.drawImage(decorator, 0, 0);
259  } else if (corner == TOP_RIGHT) {
260  gc.drawImage(decorator, bib.width - dib.width, 0);
261  } else if (corner == BOTTOM_LEFT) {
262  gc.drawImage(decorator, 0, bib.height - dib.height);
263  } else if (corner == BOTTOM_RIGHT) {
264  gc.drawImage(decorator, bib.width - dib.width, bib.height - dib.height);
265  }
266  gc.dispose();
267  //
268  decoratedMap.put(decorator, result);
269  }
270  return result;
271  }
275  public static void disposeImages() {
276  // dispose loaded images
277  {
278  for (Image image : m_imageMap.values()) {
279  image.dispose();
280  }
281  m_imageMap.clear();
282  }
283  // dispose decorated images
284  for (int i = 0; i < m_decoratedImageMap.length; i++) {
285  Map<Image, Map<Image, Image>> cornerDecoratedImageMap = m_decoratedImageMap[i];
286  if (cornerDecoratedImageMap != null) {
287  for (Map<Image, Image> decoratedMap : cornerDecoratedImageMap.values()) {
288  for (Image image : decoratedMap.values()) {
289  image.dispose();
290  }
291  decoratedMap.clear();
292  }
293  cornerDecoratedImageMap.clear();
294  }
295  }
296  }
298  //
299  // Font
300  //
302 
305  private static Map<String, Font> m_fontMap = new HashMap<String, Font>();
309  private static Map<Font, Font> m_fontToBoldFontMap = new HashMap<Font, Font>();
321  public static Font getFont(String name, int height, int style) {
322  return getFont(name, height, style, false, false);
323  }
340  public static Font getFont(String name, int size, int style, boolean strikeout, boolean underline) {
341  String fontName = name + '|' + size + '|' + style + '|' + strikeout + '|' + underline;
342  Font font = m_fontMap.get(fontName);
343  if (font == null) {
344  FontData fontData = new FontData(name, size, style);
345  if (strikeout || underline) {
346  try {
347  Class<?> logFontClass = Class.forName("org.eclipse.swt.internal.win32.LOGFONT"); //$NON-NLS-1$
348  Object logFont = FontData.class.getField("data").get(fontData); //$NON-NLS-1$
349  if (logFont != null && logFontClass != null) {
350  if (strikeout) {
351  logFontClass.getField("lfStrikeOut").set(logFont, Byte.valueOf((byte) 1)); //$NON-NLS-1$
352  }
353  if (underline) {
354  logFontClass.getField("lfUnderline").set(logFont, Byte.valueOf((byte) 1)); //$NON-NLS-1$
355  }
356  }
357  } catch (Throwable e) {
358  System.err.println("Unable to set underline or strikeout" + " (probably on a non-Windows platform). " + e); //$NON-NLS-1$ //$NON-NLS-2$
359  }
360  }
361  font = new Font(Display.getCurrent(), fontData);
362  m_fontMap.put(fontName, font);
363  }
364  return font;
365  }
373  public static Font getBoldFont(Font baseFont) {
374  Font font = m_fontToBoldFontMap.get(baseFont);
375  if (font == null) {
376  FontData fontDatas[] = baseFont.getFontData();
377  FontData data = fontDatas[0];
378  font = new Font(Display.getCurrent(), data.getName(), data.getHeight(), SWT.BOLD);
379  m_fontToBoldFontMap.put(baseFont, font);
380  }
381  return font;
382  }
386  public static void disposeFonts() {
387  // clear fonts
388  for (Font font : m_fontMap.values()) {
389  font.dispose();
390  }
391  m_fontMap.clear();
392  // clear bold fonts
393  for (Font font : m_fontToBoldFontMap.values()) {
394  font.dispose();
395  }
396  m_fontToBoldFontMap.clear();
397  }
399  //
400  // Cursor
401  //
403 
406  private static Map<Integer, Cursor> m_idToCursorMap = new HashMap<Integer, Cursor>();
414  public static Cursor getCursor(int id) {
415  Integer key = Integer.valueOf(id);
416  Cursor cursor = m_idToCursorMap.get(key);
417  if (cursor == null) {
418  cursor = new Cursor(Display.getDefault(), id);
419  m_idToCursorMap.put(key, cursor);
420  }
421  return cursor;
422  }
426  public static void disposeCursors() {
427  for (Cursor cursor : m_idToCursorMap.values()) {
428  cursor.dispose();
429  }
430  m_idToCursorMap.clear();
431  }
433  //
434  // General
435  //
437 
441  public static void dispose() {
442  disposeColors();
443  disposeImages();
444  disposeFonts();
445  disposeCursors();
446  }
447 }
static Font getFont(String name, int height, int style)
static Image decorateImage(Image baseImage, Image decorator)
static Color getColor(int systemColorID)
static Image decorateImage(final Image baseImage, final Image decorator, final int corner)
static Font getFont(String name, int size, int style, boolean strikeout, boolean underline)
static Image getImage(Class<?> clazz, String path)
static Image getImage(InputStream stream)
static Color getColor(int r, int g, int b)