001: /*******************************************************************************
002: * Copyright (c) 2006, 2007 IBM Corporation and others.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * IBM Corporation - initial API and implementation
010: *******************************************************************************/package org.eclipse.jface.viewers;
011:
012: import org.eclipse.core.runtime.Assert;
013: import org.eclipse.swt.graphics.Color;
014: import org.eclipse.swt.graphics.Font;
015: import org.eclipse.swt.graphics.Image;
016:
017: /**
018: * The WrappedViewerLabelProvider is a label provider that allows
019: * {@link ILabelProvider}, {@link IColorProvider} and {@link IFontProvider} to
020: * be mapped to a ColumnLabelProvider.
021: *
022: * @since 3.3
023: *
024: */
025: class WrappedViewerLabelProvider extends ColumnLabelProvider {
026:
027: private static ILabelProvider defaultLabelProvider = new LabelProvider();
028:
029: private ILabelProvider labelProvider = defaultLabelProvider;
030:
031: private IColorProvider colorProvider;
032:
033: private IFontProvider fontProvider;
034:
035: private IViewerLabelProvider viewerLabelProvider;
036:
037: private ITreePathLabelProvider treePathLabelProvider;
038:
039: /**
040: * Create a new instance of the receiver based on labelProvider.
041: *
042: * @param labelProvider
043: */
044: public WrappedViewerLabelProvider(IBaseLabelProvider labelProvider) {
045: super ();
046: setProviders(labelProvider);
047: }
048:
049: /**
050: * Set the any providers for the receiver that can be adapted from provider.
051: *
052: * @param provider
053: * {@link Object}
054: */
055: public void setProviders(Object provider) {
056: if (provider instanceof ITreePathLabelProvider)
057: treePathLabelProvider = ((ITreePathLabelProvider) provider);
058:
059: if (provider instanceof IViewerLabelProvider)
060: viewerLabelProvider = ((IViewerLabelProvider) provider);
061:
062: if (provider instanceof ILabelProvider)
063: labelProvider = ((ILabelProvider) provider);
064:
065: if (provider instanceof IColorProvider)
066: colorProvider = (IColorProvider) provider;
067:
068: if (provider instanceof IFontProvider)
069: fontProvider = (IFontProvider) provider;
070:
071: }
072:
073: /*
074: * (non-Javadoc)
075: *
076: * @see org.eclipse.jface.viewers.IFontProvider#getFont(java.lang.Object)
077: */
078: public Font getFont(Object element) {
079: if (fontProvider == null) {
080: return null;
081: }
082:
083: return fontProvider.getFont(element);
084:
085: }
086:
087: /*
088: * (non-Javadoc)
089: *
090: * @see org.eclipse.jface.viewers.IColorProvider#getBackground(java.lang.Object)
091: */
092: public Color getBackground(Object element) {
093: if (colorProvider == null) {
094: return null;
095: }
096:
097: return colorProvider.getBackground(element);
098: }
099:
100: /*
101: * (non-Javadoc)
102: *
103: * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
104: */
105: public String getText(Object element) {
106: return getLabelProvider().getText(element);
107: }
108:
109: /*
110: * (non-Javadoc)
111: *
112: * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
113: */
114: public Image getImage(Object element) {
115: return getLabelProvider().getImage(element);
116: }
117:
118: /*
119: * (non-Javadoc)
120: *
121: * @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object)
122: */
123: public Color getForeground(Object element) {
124: if (colorProvider == null) {
125: return null;
126: }
127:
128: return colorProvider.getForeground(element);
129: }
130:
131: /**
132: * Get the label provider
133: *
134: * @return {@link ILabelProvider}
135: */
136: ILabelProvider getLabelProvider() {
137: return labelProvider;
138: }
139:
140: /**
141: * Get the color provider
142: *
143: * @return {@link IColorProvider}
144: */
145: IColorProvider getColorProvider() {
146: return colorProvider;
147: }
148:
149: /**
150: * Get the font provider
151: *
152: * @return {@link IFontProvider}.
153: */
154: IFontProvider getFontProvider() {
155: return fontProvider;
156: }
157:
158: public void update(ViewerCell cell) {
159: Object element = cell.getElement();
160: if (viewerLabelProvider == null
161: && treePathLabelProvider == null) {
162: // inlined super implementation with performance optimizations
163: cell.setText(getText(element));
164: Image image = getImage(element);
165: cell.setImage(image);
166: if (colorProvider != null) {
167: cell.setBackground(getBackground(element));
168: cell.setForeground(getForeground(element));
169: }
170: if (fontProvider != null) {
171: cell.setFont(getFont(element));
172: }
173: return;
174: }
175:
176: ViewerLabel label = new ViewerLabel(cell.getText(), cell
177: .getImage());
178:
179: if (treePathLabelProvider != null) {
180: TreePath treePath = cell.getViewerRow().getTreePath();
181:
182: Assert.isNotNull(treePath);
183: treePathLabelProvider.updateLabel(label, treePath);
184: } else if (viewerLabelProvider != null) {
185: viewerLabelProvider.updateLabel(label, element);
186: }
187: if (!label.hasNewForeground() && colorProvider != null)
188: label.setForeground(getForeground(element));
189:
190: if (!label.hasNewBackground() && colorProvider != null)
191: label.setBackground(getBackground(element));
192:
193: if (!label.hasNewFont() && fontProvider != null)
194: label.setFont(getFont(element));
195:
196: applyViewerLabel(cell, label);
197: }
198:
199: private void applyViewerLabel(ViewerCell cell, ViewerLabel label) {
200: if (label.hasNewText()) {
201: cell.setText(label.getText());
202: }
203: if (label.hasNewImage()) {
204: cell.setImage(label.getImage());
205: }
206: if (colorProvider != null || label.hasNewBackground()) {
207: cell.setBackground(label.getBackground());
208: }
209: if (colorProvider != null || label.hasNewForeground()) {
210: cell.setForeground(label.getForeground());
211: }
212: if (fontProvider != null || label.hasNewFont()) {
213: cell.setFont(label.getFont());
214: }
215: }
216: }
|