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