1 /*******************************************************************************
2  * Copyright (c) 2006, 2015 IBM Corporation and others.
3  *
4  * This program and the accompanying materials
5  * are made available under the terms of the Eclipse Public License 2.0
6  * which accompanies this distribution, and is available at
7  * https://www.eclipse.org/legal/epl-2.0/
8  *
9  * SPDX-License-Identifier: EPL-2.0
10  *
11  * Contributors:
12  *     IBM Corporation - initial API and implementation
13  *******************************************************************************/
14 
15 package org.eclipse.jface.viewers;
16 
17 import org.eclipse.core.runtime.Assert;
18 import org.eclipse.swt.graphics.Color;
19 import org.eclipse.swt.graphics.Font;
20 import org.eclipse.swt.graphics.Image;
21 
22 /**
23  * The WrappedViewerLabelProvider is a label provider that allows
24  * {@link ILabelProvider}, {@link IColorProvider} and {@link IFontProvider} to
25  * be mapped to a ColumnLabelProvider.
26  *
27  * @since 3.3
28  *
29  */
30 class WrappedViewerLabelProvider extends ColumnLabelProvider {
31 
32 	private static ILabelProvider defaultLabelProvider = new LabelProvider();
33 
34 	private ILabelProvider labelProvider = defaultLabelProvider;
35 
36 	private IColorProvider colorProvider;
37 
38 	private IFontProvider fontProvider;
39 
40 	private IViewerLabelProvider viewerLabelProvider;
41 
42 	private ITreePathLabelProvider treePathLabelProvider;
43 
44 	/**
45 	 * Create a new instance of the receiver based on labelProvider.
46 	 *
47 	 * @param labelProvider
48 	 */
WrappedViewerLabelProvider(IBaseLabelProvider labelProvider)49 	public WrappedViewerLabelProvider(IBaseLabelProvider labelProvider) {
50 		super();
51 		setProviders(labelProvider);
52 	}
53 
54 	/**
55 	 * Set the any providers for the receiver that can be adapted from provider.
56 	 *
57 	 * @param provider
58 	 *            {@link Object}
59 	 */
setProviders(Object provider)60 	public void setProviders(Object provider) {
61 		if (provider instanceof ITreePathLabelProvider)
62 			treePathLabelProvider = ((ITreePathLabelProvider) provider);
63 
64 		if (provider instanceof IViewerLabelProvider)
65 			viewerLabelProvider = ((IViewerLabelProvider) provider);
66 
67 		if (provider instanceof ILabelProvider)
68 			labelProvider = ((ILabelProvider) provider);
69 
70 		if (provider instanceof IColorProvider)
71 			colorProvider = (IColorProvider) provider;
72 
73 		if (provider instanceof IFontProvider)
74 			fontProvider = (IFontProvider) provider;
75 
76 	}
77 
78 	@Override
getFont(Object element)79 	public Font getFont(Object element) {
80 		if (fontProvider == null) {
81 			return null;
82 		}
83 
84 		return fontProvider.getFont(element);
85 
86 	}
87 
88 	@Override
getBackground(Object element)89 	public Color getBackground(Object element) {
90 		if (colorProvider == null) {
91 			return null;
92 		}
93 
94 		return colorProvider.getBackground(element);
95 	}
96 
97 	@Override
getText(Object element)98 	public String getText(Object element) {
99 		return getLabelProvider().getText(element);
100 	}
101 
102 	@Override
getImage(Object element)103 	public Image getImage(Object element) {
104 		return getLabelProvider().getImage(element);
105 	}
106 
107 	@Override
getForeground(Object element)108 	public Color getForeground(Object element) {
109 		if (colorProvider == null) {
110 			return null;
111 		}
112 
113 		return colorProvider.getForeground(element);
114 	}
115 
116 	/**
117 	 * Get the label provider
118 	 *
119 	 * @return {@link ILabelProvider}
120 	 */
getLabelProvider()121 	ILabelProvider getLabelProvider() {
122 		return labelProvider;
123 	}
124 
125 	/**
126 	 * Get the color provider
127 	 *
128 	 * @return {@link IColorProvider}
129 	 */
getColorProvider()130 	IColorProvider getColorProvider() {
131 		return colorProvider;
132 	}
133 
134 	/**
135 	 * Get the font provider
136 	 *
137 	 * @return {@link IFontProvider}.
138 	 */
getFontProvider()139 	IFontProvider getFontProvider() {
140 		return fontProvider;
141 	}
142 
143 	@Override
update(ViewerCell cell)144 	public void update(ViewerCell cell) {
145 		Object element = cell.getElement();
146 		if(viewerLabelProvider == null && treePathLabelProvider == null){
147 			// inlined super implementation with performance optimizations
148 			cell.setText(getText(element));
149 			Image image = getImage(element);
150 			cell.setImage(image);
151 			if (colorProvider != null) {
152 				cell.setBackground(getBackground(element));
153 				cell.setForeground(getForeground(element));
154 			}
155 			if (fontProvider != null) {
156 				cell.setFont(getFont(element));
157 			}
158 			return;
159 		}
160 
161 		ViewerLabel label = new ViewerLabel(cell.getText(), cell.getImage());
162 
163 		if (treePathLabelProvider != null) {
164 			TreePath treePath = cell.getViewerRow().getTreePath();
165 
166 			Assert.isNotNull(treePath);
167 			treePathLabelProvider.updateLabel(label, treePath);
168 		} else if (viewerLabelProvider != null) {
169 			viewerLabelProvider.updateLabel(label, element);
170 		}
171 		if (!label.hasNewForeground() && colorProvider != null)
172 			label.setForeground(getForeground(element));
173 
174 		if (!label.hasNewBackground() && colorProvider != null)
175 			label.setBackground(getBackground(element));
176 
177 		if (!label.hasNewFont() && fontProvider != null)
178 			label.setFont(getFont(element));
179 
180 		applyViewerLabel(cell, label);
181 	}
182 
applyViewerLabel(ViewerCell cell, ViewerLabel label)183 	private void applyViewerLabel(ViewerCell cell, ViewerLabel label) {
184 		if (label.hasNewText()) {
185 			cell.setText(label.getText());
186 		}
187 		if (label.hasNewImage()) {
188 			cell.setImage(label.getImage());
189 		}
190 		if (colorProvider!= null || label.hasNewBackground()) {
191 			cell.setBackground(label.getBackground());
192 		}
193 		if (colorProvider!= null || label.hasNewForeground()) {
194 			cell.setForeground(label.getForeground());
195 		}
196 		if (fontProvider!= null || label.hasNewFont()) {
197 			cell.setFont(label.getFont());
198 		}
199 	}
200 }
201