1 /*******************************************************************************
2 * Copyright (c) 2000, 2011 IBM Corporation and others.
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
9 * IBM Corporation - initial API and implementation
10 *******************************************************************************/
11 package org.eclipse.jdt.internal.ui.viewsupport;
13 import java.util.ArrayList;
15 import org.eclipse.swt.graphics.Color;
16 import org.eclipse.swt.graphics.Image;
18 import org.eclipse.core.runtime.ListenerList;
19 import org.eclipse.core.runtime.SafeRunner;
21 import org.eclipse.core.resources.IStorage;
23 import org.eclipse.jface.util.SafeRunnable;
24 import org.eclipse.jface.viewers.IColorProvider;
25 import org.eclipse.jface.viewers.ILabelDecorator;
26 import org.eclipse.jface.viewers.ILabelProvider;
27 import org.eclipse.jface.viewers.ILabelProviderListener;
28 import org.eclipse.jface.viewers.LabelProviderChangedEvent;
29 import org.eclipse.jface.viewers.StyledCellLabelProvider;
30 import org.eclipse.jface.viewers.StyledString;
31 import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider;
33 import org.eclipse.jdt.ui.JavaElementLabels;
35 public class JavaUILabelProvider implements ILabelProvider, IColorProvider, IStyledLabelProvider {
37 protected ListenerList fListeners = new ListenerList();
39 protected JavaElementImageProvider fImageLabelProvider;
40 protected StorageLabelProvider fStorageLabelProvider;
42 private ArrayList<ILabelDecorator> fLabelDecorators;
44 private int fImageFlags;
45 private long fTextFlags;
48 * Creates a new label provider with default flags.
50 public JavaUILabelProvider() {
51 this(JavaElementLabels.ALL_DEFAULT, JavaElementImageProvider.OVERLAY_ICONS);
55 * @param textFlags Flags defined in <code>JavaElementLabels</code>.
56 * @param imageFlags Flags defined in <code>JavaElementImageProvider</code>.
58 public JavaUILabelProvider(long textFlags, int imageFlags) {
59 fImageLabelProvider= new JavaElementImageProvider();
60 fLabelDecorators= null;
62 fStorageLabelProvider= new StorageLabelProvider();
63 fImageFlags= imageFlags;
64 fTextFlags= textFlags;
68 * Adds a decorator to the label provider
69 * @param decorator the decorator to add
71 public void addLabelDecorator(ILabelDecorator decorator) {
72 if (fLabelDecorators == null) {
73 fLabelDecorators= new ArrayList<ILabelDecorator>(2);
75 fLabelDecorators.add(decorator);
80 * @param textFlags The textFlags to set
82 public final void setTextFlags(long textFlags) {
83 fTextFlags= textFlags;
88 * @param imageFlags The imageFlags to set
90 public final void setImageFlags(int imageFlags) {
91 fImageFlags= imageFlags;
95 * Gets the image flags.
96 * Can be overwritten by super classes.
97 * @return Returns a int
99 public final int getImageFlags() {
104 * Gets the text flags.
105 * @return Returns a int
107 public final long getTextFlags() {
112 * Evaluates the image flags for a element.
113 * Can be overwritten by super classes.
114 * @param element the element to compute the image flags for
115 * @return Returns a int
117 protected int evaluateImageFlags(Object element) {
118 return getImageFlags();
122 * Evaluates the text flags for a element. Can be overwritten by super classes.
123 * @param element the element to compute the text flags for
124 * @return Returns a int
126 protected long evaluateTextFlags(Object element) {
127 return getTextFlags();
130 protected Image decorateImage(Image image, Object element) {
131 if (fLabelDecorators != null && image != null) {
132 for (int i= 0; i < fLabelDecorators.size(); i++) {
133 ILabelDecorator decorator= fLabelDecorators.get(i);
134 image= decorator.decorateImage(image, element);
141 * @see ILabelProvider#getImage
143 public Image getImage(Object element) {
144 Image result= fImageLabelProvider.getImageLabel(element, evaluateImageFlags(element));
145 if (result == null && (element instanceof IStorage)) {
146 result= fStorageLabelProvider.getImage(element);
149 return decorateImage(result, element);
152 protected String decorateText(String text, Object element) {
153 if (fLabelDecorators != null && text.length() > 0) {
154 for (int i= 0; i < fLabelDecorators.size(); i++) {
155 ILabelDecorator decorator= fLabelDecorators.get(i);
156 String decorated= decorator.decorateText(text, element);
157 if (decorated != null) {
167 * @see ILabelProvider#getText
169 public String getText(Object element) {
170 String result= JavaElementLabels.getTextLabel(element, evaluateTextFlags(element));
171 if (result.length() == 0 && (element instanceof IStorage)) {
172 result= fStorageLabelProvider.getText(element);
174 return decorateText(result, element);
177 public StyledString getStyledText(Object element) {
178 StyledString string= JavaElementLabels.getStyledTextLabel(element, (evaluateTextFlags(element) | JavaElementLabels.COLORIZE));
179 if (string.length() == 0 && (element instanceof IStorage)) {
180 string= new StyledString(fStorageLabelProvider.getText(element));
182 String decorated= decorateText(string.getString(), element);
183 if (decorated != null) {
184 return StyledCellLabelProvider.styleDecoratedString(decorated, StyledString.DECORATIONS_STYLER, string);
190 * @see IBaseLabelProvider#dispose
192 public void dispose() {
193 if (fLabelDecorators != null) {
194 for (int i= 0; i < fLabelDecorators.size(); i++) {
195 ILabelDecorator decorator= fLabelDecorators.get(i);
198 fLabelDecorators= null;
200 fStorageLabelProvider.dispose();
201 fImageLabelProvider.dispose();
205 * @see IBaseLabelProvider#addListener(ILabelProviderListener)
207 public void addListener(ILabelProviderListener listener) {
208 if (fLabelDecorators != null) {
209 for (int i= 0; i < fLabelDecorators.size(); i++) {
210 ILabelDecorator decorator= fLabelDecorators.get(i);
211 decorator.addListener(listener);
214 fListeners.add(listener);
218 * @see IBaseLabelProvider#isLabelProperty(Object, String)
220 public boolean isLabelProperty(Object element, String property) {
225 * @see IBaseLabelProvider#removeListener(ILabelProviderListener)
227 public void removeListener(ILabelProviderListener listener) {
228 if (fLabelDecorators != null) {
229 for (int i= 0; i < fLabelDecorators.size(); i++) {
230 ILabelDecorator decorator= fLabelDecorators.get(i);
231 decorator.removeListener(listener);
234 fListeners.remove(listener);
237 public static ILabelDecorator[] getDecorators(boolean errortick, ILabelDecorator extra) {
240 return new ILabelDecorator[] {};
242 return new ILabelDecorator[] { extra };
246 return new ILabelDecorator[] { extra };
252 * @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object)
254 public Color getForeground(Object element) {
259 * @see org.eclipse.jface.viewers.IColorProvider#getBackground(java.lang.Object)
261 public Color getBackground(Object element) {
266 * Fires a label provider changed event to all registered listeners
267 * Only listeners registered at the time this method is called are notified.
269 * @param event a label provider changed event
271 * @see ILabelProviderListener#labelProviderChanged
273 protected void fireLabelProviderChanged(final LabelProviderChangedEvent event) {
274 Object[] listeners = fListeners.getListeners();
275 for (int i = 0; i < listeners.length; ++i) {
276 final ILabelProviderListener l = (ILabelProviderListener) listeners[i];
277 SafeRunner.run(new SafeRunnable() {
279 l.labelProviderChanged(event);