/* ******************************************************************************
* Copyright (c) 2006-2012 XMind Ltd. and others.
*
* This file is a part of XMind 3. XMind releases 3 and
* above are dual-licensed under the Eclipse Public License (EPL),
* which is available at http://www.eclipse.org/legal/epl-v10.html
* and the GNU Lesser General Public License (LGPL),
* which is available at http://www.gnu.org/licenses/lgpl.html
* See http://www.xmind.net/license.html for details.
*
* Contributors:
* XMind Ltd. - initial API and implementation
*******************************************************************************/
/**
*
*/
package org.xmind.ui.viewers;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.jface.resource.ColorDescriptor;
import org.eclipse.jface.resource.FontDescriptor;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.IColorProvider;
import org.eclipse.jface.viewers.IFontProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Resource;
import org.eclipse.swt.widgets.Display;
/**
* @author Frank Shaka
*/
public class CachedLabelProvider extends LabelProvider implements
IColorProvider, IFontProvider {
private ILabelDescriptor labelDescriptor;
private Map<Object, Image> images = new HashMap<Object, Image>();
private Map<Object, Color> foregroundColors = new HashMap<Object, Color>();
private Map<Object, Color> backgroundColors = new HashMap<Object, Color>();
private Map<Object, Font> fonts = new HashMap<Object, Font>();
/**
*
*/
public CachedLabelProvider(ILabelDescriptor labelDescriptor) {
this.labelDescriptor = labelDescriptor;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
*/
@Override
public String getText(Object element) {
if (labelDescriptor == null)
return getDefaultText(element);
return labelDescriptor.getText(element);
}
protected String getDefaultText(Object element) {
return super.getText(element);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object)
*/
@Override
public Image getImage(Object element) {
if (labelDescriptor == null)
return getDefaultImage(element);
Image image = images.get(element);
if (image == null || image.isDisposed()) {
ImageDescriptor imageDescriptor = labelDescriptor.getImage(element);
image = imageDescriptor == null ? null : imageDescriptor
.createImage(false, Display.getCurrent());
images.put(element, image);
}
return image;
}
protected Image getDefaultImage(Object element) {
return super.getImage(element);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.IFontProvider#getFont(java.lang.Object)
*/
public Font getFont(Object element) {
if (labelDescriptor == null)
return getDefaultFont(element);
Font font = fonts.get(element);
if (font == null || font.isDisposed()) {
FontDescriptor fontDescriptor = labelDescriptor.getFont(element);
font = fontDescriptor == null ? null : fontDescriptor
.createFont(Display.getCurrent());
fonts.put(element, font);
}
return font;
}
protected Font getDefaultFont(Object element) {
return null;
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object)
*/
public Color getForeground(Object element) {
if (labelDescriptor == null)
return getDefaultForeground(element);
Color color = foregroundColors.get(element);
if (color == null || color.isDisposed()) {
ColorDescriptor colorDescriptor = labelDescriptor
.getForeground(element);
color = colorDescriptor == null ? null : colorDescriptor
.createColor(Display.getCurrent());
foregroundColors.put(element, color);
}
return color;
}
protected Color getDefaultForeground(Object element) {
return null;
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.jface.viewers.IColorProvider#getBackground(java.lang.Object)
*/
public Color getBackground(Object element) {
if (labelDescriptor == null)
return getDefaultBackground(element);
Color color = backgroundColors.get(element);
if (color == null || color.isDisposed()) {
ColorDescriptor colorDescriptor = labelDescriptor
.getBackground(element);
color = colorDescriptor == null ? null : colorDescriptor
.createColor(Display.getCurrent());
backgroundColors.put(element, color);
}
return color;
}
protected Color getDefaultBackground(Object element) {
return null;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.BaseLabelProvider#dispose()
*/
@Override
public void dispose() {
Object[] cachedImages = images.values().toArray();
Object[] cachedForegroundColors = foregroundColors.values().toArray();
Object[] cachedBackgroundColors = backgroundColors.values().toArray();
Object[] cachedFonts = fonts.values().toArray();
images.clear();
foregroundColors.clear();
backgroundColors.clear();
fonts.clear();
disposeResources(cachedImages);
disposeResources(cachedForegroundColors);
disposeResources(cachedBackgroundColors);
disposeResources(cachedFonts);
super.dispose();
}
private static void disposeResources(Object[] resources) {
for (int i = 0; i < resources.length; i++) {
if (resources[i] != null)
((Resource) resources[i]).dispose();
}
}
}