blob: 69096cfcaee30c17958d06105b45aaf53492c0ef [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012 Tilera Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* William R. Swanson (Tilera Corporation)
*******************************************************************************/
package org.eclipse.cdt.visualizer.ui.util;
import java.net.URL;
import org.eclipse.cdt.visualizer.core.ResourceManager;
import org.eclipse.jface.resource.ColorRegistry;
import org.eclipse.jface.resource.FontRegistry;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.plugin.AbstractUIPlugin;
// ---------------------------------------------------------------------------
// UIResourceManager
// ---------------------------------------------------------------------------
/**
* Plugin resource manager.
* Provides one-stop-shopping for UI plugin resources
* (strings, images, fonts, colors).
* This class should be instanced in the UI plugin's "start()" method,
* and disposed in the "stop()" method.
*/
public class UIResourceManager extends ResourceManager {
// --- members ---
/** UI Plugin */
protected AbstractUIPlugin m_UIplugin = null;
/** Parent resource manager, if any */
protected UIResourceManager m_parentUIManager = null;
/** Image resource manager */
protected ImageRegistry m_images = null;
/** Font resource manager */
protected FontRegistry m_fonts = null;
/** Color resource manager */
protected ColorRegistry m_colors = null;
// --- constructors/destructors ---
/** Constructor
* Note: the plugin ID is assumed to also be the parent package name
* of the plugin, for example "com.tilera.ide.core"; it's assumed that string
* resources are found in the plugin directory in "messages.properties".
*/
public UIResourceManager(AbstractUIPlugin plugin) {
super(plugin);
m_UIplugin = plugin;
getImageRegistry(); // creates registry object
getFontRegistry(); // creates registry object
getColorRegistry(); // creates registry object
}
/** Dispose method */
@Override
public void dispose() {
disposeImageRegistry();
disposeFontRegistry();
disposeColorRegistry();
}
// --- parent manager management ---
/** Sets parent resource manager, if any */
@Override
public void setParentManager(ResourceManager parentManager) {
super.setParentManager(parentManager);
if (parentManager instanceof UIResourceManager) {
m_parentUIManager = (UIResourceManager) parentManager;
} else {
m_parentUIManager = null;
}
}
/** Gets parent UI resource manager, if any */
@Override
public UIResourceManager getParentManager() {
return m_parentUIManager;
}
// --- image resource management ---
/** Creates/returns image registry */
protected ImageRegistry getImageRegistry() {
if (m_images == null) {
// use the plugin's image registry
m_images = m_UIplugin.getImageRegistry();
}
return m_images;
}
/** Disposes image registry */
protected void disposeImageRegistry() {
if (m_images != null) {
// we're using the plugin's image registry, so it will dispose of it
//m_images.dispose();
m_images = null;
}
}
/**
* Returns an image descriptor for the image file at the given
* plug-in relative path.
*/
public ImageDescriptor getImageDescriptor(String path) {
ImageDescriptor result = null;
if (path == null)
return result;
// get image registry, look up path
ImageRegistry images = getImageRegistry();
result = images.getDescriptor(path);
// if we don't find it, see if it exists as a file in this plugin
if (result == null) {
URL url = m_UIplugin.getBundle().getEntry(path);
if (url != null) {
// if so, we'll add an entry for it to this resource manager
ImageDescriptor desc = ImageDescriptor.createFromURL(url);
images.put(path, desc);
result = images.getDescriptor(path);
} else {
// if not, see if we can find it in the parent manager
// NOTE: this may be in a different plugin, so the path will be
// resolved relative to that plugin's base directory
UIResourceManager parent = getParentManager();
if (parent != null) {
result = parent.getImageDescriptor(path);
}
}
}
return result;
}
/**
* Gets specified image from plugin directory.
* Caches images so subsequent requests will be faster.
*/
public Image getImage(String path) {
Image result = null;
if (path == null)
return result;
// get image registry, look up path
ImageRegistry images = getImageRegistry();
result = images.get(path);
// if we don't find it, see if it exists as a file in this plugin
if (result == null) {
URL url = m_UIplugin.getBundle().getEntry(path);
if (url != null) {
// if so, we'll add an entry for it to this resource manager
ImageDescriptor desc = ImageDescriptor.createFromURL(url);
images.put(path, desc);
result = images.get(path);
} else {
// if not, see if we can find it in the parent manager
// NOTE: this may be in a different plugin, so the path will be
// resolved relative to that plugin's base directory
UIResourceManager parent = getParentManager();
if (parent != null) {
result = parent.getImage(path);
}
}
}
return result;
}
// --- font registry ---
/** Creates/returns font registry */
protected FontRegistry getFontRegistry() {
if (m_fonts == null) {
Display display = getDisplay();
m_fonts = new FontRegistry(display);
}
return m_fonts;
}
/** Disposes font registry */
protected void disposeFontRegistry() {
if (m_fonts != null) {
// doesn't appear to be a way to flush the registry cache
// so let finalizer handle it
m_fonts = null;
}
}
/** Sets cached font for specified ID */
public void setFont(String fontID, String fontName, int height, int style) {
setCachedFont(fontID, fontName, height, style);
}
/** Gets cached font for specified ID */
public Font getFont(String fontID) {
return getCachedFont(fontID);
}
/** Gets/creates font with specified properties */
public Font getFont(String fontName, int height) {
return getCachedFont(fontName, height, SWT.NORMAL);
}
/** Gets/creates font with specified properties */
public Font getFont(String fontName, int height, int style) {
return getCachedFont(fontName, height, style);
}
/** Sets cached font for specified ID */
protected void setCachedFont(String fontID, String fontName, int height, int style) {
FontData[] fontData = new FontData[1];
fontData[0] = new FontData(fontName, height, style);
FontRegistry fonts = getFontRegistry();
fonts.put(fontID, fontData);
}
/** Gets cached font, if any, for specified ID */
protected Font getCachedFont(String fontID) {
Font result = null;
// get font registry, look up font ID
FontRegistry fonts = getFontRegistry();
if (fonts.hasValueFor(fontID)) {
result = fonts.get(fontID);
} else {
// if we don't find it, see if parent manager has it
UIResourceManager parent = getParentManager();
if (parent != null) {
result = parent.getCachedFont(fontID);
}
}
return result;
}
/** Gets/creates font with specified properties */
protected Font getCachedFont(String fontName, int height, int style) {
Font result = null;
String fontID = fontName + "," + height + "," + style; //$NON-NLS-1$ //$NON-NLS-2$
// look for the cached font (this checks the parent manager too)
result = getCachedFont(fontID);
// if we didn't find it, add an entry to this resource manager
if (result == null) {
setCachedFont(fontID, fontName, height, style);
result = getCachedFont(fontID);
}
return result;
}
// --- color registry ---
/** Creates/returns color registry */
protected ColorRegistry getColorRegistry() {
if (m_colors == null) {
Display display = getDisplay();
m_colors = new ColorRegistry(display);
}
return m_colors;
}
/** Disposes color registry */
protected void disposeColorRegistry() {
if (m_colors != null) {
// doesn't appear to be a way to flush the registry cache
// so let finalizer handle it
m_colors = null;
}
}
/** Gets cached color with specified SWT color ID */
public Color getColor(int colorID) {
// NOTE: we don't cache these colors, we just look them up every time
return getDisplay().getSystemColor(colorID);
}
/** Gets cached color with specified ID */
public Color getColor(String colorID) {
return getCachedColor(colorID);
}
/** Gets/creates color with specified properties */
public Color getColor(int red, int green, int blue) {
return getCachedColor(red, green, blue);
}
/** Sets cached color for specified ID */
protected void setCachedColor(String colorID, int red, int green, int blue) {
RGB rgb = new RGB(red, green, blue);
ColorRegistry colors = getColorRegistry();
colors.put(colorID, rgb);
}
/** Gets cached color with specified ID */
protected Color getCachedColor(String colorID) {
Color result = null;
ColorRegistry colors = getColorRegistry();
if (colors.hasValueFor(colorID)) {
result = colors.get(colorID);
} else {
// if we don't find it, see if parent manager has it
UIResourceManager parent = getParentManager();
if (parent != null) {
result = parent.getCachedColor(colorID);
}
}
return result;
}
/** Gets/creates color with specified properties */
protected Color getCachedColor(int red, int green, int blue) {
Color result = null;
String colorID = "Color[R=" + red + ",G=" + green + ",B=" + blue + "]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
// look for the cached color (this checks the parent manager too)
result = getCachedColor(colorID);
// if we don't find it, create an entry in this resource manager
if (result == null) {
setCachedColor(colorID, red, green, blue);
result = getCachedColor(colorID);
}
return result;
}
// --- utilities ---
/**
* Returns the current SWT display.
*
* The method first checks whether the caller already has
* an associated display. If so, this display is returned.
* Otherwise the method returns the default display.
*
* This allows GUIUtils to work in contexts like tests
* where the SWT display has not already been defined.
*
* (Credit: Borrowed from DebugUIPlugin.)
*/
public static Display getDisplay() {
Display display = Display.getCurrent();
if (display == null) {
display = Display.getDefault();
}
return display;
}
}