1 /******************************************************************************* 2 * Copyright (c) 2007, 2017 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 package org.eclipse.pde.api.tools.ui.internal; 15 16 import java.io.File; 17 import java.io.IOException; 18 import java.text.MessageFormat; 19 20 import org.eclipse.core.resources.IResource; 21 import org.eclipse.core.resources.ResourcesPlugin; 22 import org.eclipse.core.runtime.CoreException; 23 import org.eclipse.core.runtime.IPath; 24 import org.eclipse.core.runtime.Path; 25 import org.eclipse.jdt.ui.JavaUI; 26 import org.eclipse.jface.resource.JFaceResources; 27 import org.eclipse.jface.viewers.BaseLabelProvider; 28 import org.eclipse.jface.viewers.IFontProvider; 29 import org.eclipse.jface.viewers.ILabelProvider; 30 import org.eclipse.osgi.util.NLS; 31 import org.eclipse.pde.api.tools.internal.provisional.ApiPlugin; 32 import org.eclipse.pde.api.tools.internal.provisional.comparator.IDelta; 33 import org.eclipse.pde.api.tools.internal.provisional.descriptors.IElementDescriptor; 34 import org.eclipse.pde.api.tools.internal.provisional.model.IApiBaseline; 35 import org.eclipse.pde.api.tools.internal.provisional.model.IApiComponent; 36 import org.eclipse.pde.api.tools.internal.provisional.problems.IApiProblem; 37 import org.eclipse.pde.api.tools.internal.provisional.problems.IApiProblemFilter; 38 import org.eclipse.pde.api.tools.ui.internal.wizards.ApiBaselineWizardPage.EEEntry; 39 import org.eclipse.swt.SWT; 40 import org.eclipse.swt.graphics.Font; 41 import org.eclipse.swt.graphics.FontData; 42 import org.eclipse.swt.graphics.Image; 43 import org.eclipse.swt.widgets.Display; 44 import org.eclipse.ui.ISharedImages; 45 import org.eclipse.ui.PlatformUI; 46 import org.eclipse.ui.ide.IDE.SharedImages; 47 48 /** 49 * Label provider for API tools objects. 50 * 51 * @since 1.0.0 52 */ 53 public class ApiToolsLabelProvider extends BaseLabelProvider implements ILabelProvider, IFontProvider { 54 55 /** 56 * Font for the default {@link IApiProfile} 57 */ 58 private Font font = null; 59 60 @Override dispose()61 public void dispose() { 62 if (font != null) { 63 font.dispose(); 64 } 65 super.dispose(); 66 } 67 68 @Override getImage(Object element)69 public Image getImage(Object element) { 70 if (element instanceof IApiComponent) { 71 IApiComponent comp = (IApiComponent) element; 72 return getApiComponentImage(comp); 73 } 74 if (element instanceof IResource) { 75 IResource resource = (IResource) element; 76 switch (resource.getType()) { 77 case IResource.FILE: 78 return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FILE); 79 case IResource.FOLDER: 80 return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FOLDER); 81 case IResource.PROJECT: 82 return PlatformUI.getWorkbench().getSharedImages().getImage(SharedImages.IMG_OBJ_PROJECT); 83 default: 84 break; 85 } 86 } 87 if (element instanceof File) { 88 return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FOLDER); 89 } 90 if (element instanceof IApiBaseline) { 91 return getBaselineImage(); 92 } 93 if (element instanceof EEEntry) { 94 return ApiUIPlugin.getSharedImage(IApiToolsConstants.IMG_OBJ_API_SYSTEM_LIBRARY); 95 } 96 if (element instanceof IApiProblemFilter) { 97 IApiProblemFilter filter = (IApiProblemFilter) element; 98 IApiProblem problem = filter.getUnderlyingProblem(); 99 /* 100 * int flags = (problem.getSeverity() == ApiPlugin.SEVERITY_ERROR ? 101 * CompositeApiImageDescriptor.ERROR : 102 * CompositeApiImageDescriptor.WARNING); CompositeApiImageDescriptor 103 * desc = new CompositeApiImageDescriptor(image, flags); 104 */ 105 return getApiProblemElementImage(problem);/* 106 * ApiUIPlugin.getImage(desc) 107 * ; 108 */ 109 } 110 return null; 111 } 112 113 /** 114 * Returns the image to use for the given {@link IApiProblem} 115 * 116 * @param problem 117 * @return the image to use for the given {@link IApiProblem 118 119 */ getApiProblemElementImage(IApiProblem problem)120 private Image getApiProblemElementImage(IApiProblem problem) { 121 if (problem.getCategory() != IApiProblem.CATEGORY_USAGE) { 122 switch (problem.getElementKind()) { 123 case IDelta.ANNOTATION_ELEMENT_TYPE: 124 return JavaUI.getSharedImages().getImage(org.eclipse.jdt.ui.ISharedImages.IMG_OBJS_ANNOTATION); 125 case IDelta.ENUM_ELEMENT_TYPE: 126 return JavaUI.getSharedImages().getImage(org.eclipse.jdt.ui.ISharedImages.IMG_OBJS_ENUM); 127 case IDelta.CLASS_ELEMENT_TYPE: 128 return JavaUI.getSharedImages().getImage(org.eclipse.jdt.ui.ISharedImages.IMG_OBJS_CLASS); 129 case IDelta.INTERFACE_ELEMENT_TYPE: 130 return JavaUI.getSharedImages().getImage(org.eclipse.jdt.ui.ISharedImages.IMG_OBJS_INTERFACE); 131 case IDelta.FIELD_ELEMENT_TYPE: 132 return JavaUI.getSharedImages().getImage(org.eclipse.jdt.ui.ISharedImages.IMG_FIELD_PUBLIC); 133 case IDelta.METHOD_ELEMENT_TYPE: 134 return JavaUI.getSharedImages().getImage(org.eclipse.jdt.ui.ISharedImages.IMG_OBJS_PUBLIC); 135 case IDelta.TYPE_PARAMETER_ELEMENT_TYPE: 136 return JavaUI.getSharedImages().getImage(org.eclipse.jdt.ui.ISharedImages.IMG_OBJS_CUNIT); 137 case IDelta.API_BASELINE_ELEMENT_TYPE: 138 return getBaselineImage(); 139 case IDelta.API_COMPONENT_ELEMENT_TYPE: { 140 IPath path = new Path(problem.getResourcePath()); 141 // try to find the component via the resource handle 142 IResource res = ResourcesPlugin.getWorkspace().getRoot().findMember(path); 143 if (res != null) { 144 IApiComponent comp = ApiPlugin.getDefault().getApiBaselineManager().getWorkspaceBaseline().getApiComponent(res.getProject().getName()); 145 if (comp != null) { 146 return getApiComponentImage(comp); 147 } 148 } 149 return ApiUIPlugin.getSharedImage(IApiToolsConstants.IMG_OBJ_BUNDLE); 150 } 151 default: 152 break; 153 } 154 } else { 155 switch (problem.getElementKind()) { 156 case IElementDescriptor.TYPE: 157 return JavaUI.getSharedImages().getImage(org.eclipse.jdt.ui.ISharedImages.IMG_OBJS_CLASS); 158 case IElementDescriptor.METHOD: 159 return JavaUI.getSharedImages().getImage(org.eclipse.jdt.ui.ISharedImages.IMG_OBJS_PUBLIC); 160 case IElementDescriptor.FIELD: 161 return JavaUI.getSharedImages().getImage(org.eclipse.jdt.ui.ISharedImages.IMG_FIELD_PUBLIC); 162 default: { 163 System.out.println(); 164 } 165 } 166 } 167 return null; 168 } 169 170 /** 171 * @return the image to use for an {@link IApiBaseline} 172 */ getBaselineImage()173 private Image getBaselineImage() { 174 return ApiUIPlugin.getSharedImage(IApiToolsConstants.IMG_OBJ_ECLIPSE_PROFILE); 175 } 176 177 /** 178 * Returns the image to use for the given {@link IApiComponent} 179 * 180 * @param component 181 * @return the image to use for the given {@link IApiComponent} 182 */ getApiComponentImage(IApiComponent component)183 private Image getApiComponentImage(IApiComponent component) { 184 if (component.isSystemComponent()) { 185 return ApiUIPlugin.getSharedImage(IApiToolsConstants.IMG_OBJ_API_SYSTEM_LIBRARY); 186 } 187 try { 188 if (component.isFragment()) { 189 return ApiUIPlugin.getSharedImage(IApiToolsConstants.IMG_OBJ_FRAGMENT); 190 } 191 } catch (CoreException e) { 192 ApiPlugin.log(e); 193 } 194 return ApiUIPlugin.getSharedImage(IApiToolsConstants.IMG_OBJ_BUNDLE); 195 } 196 197 @Override getText(Object element)198 public String getText(Object element) { 199 if (element instanceof IApiComponent) { 200 IApiComponent comp = (IApiComponent) element; 201 return MessageFormat.format(Messages.ApiToolsLabelProvider_0, comp.getSymbolicName(), comp.getVersion()); 202 } 203 if (element instanceof File) { 204 try { 205 return ((File) element).getCanonicalPath(); 206 } catch (IOException e) { 207 return ((File) element).getName(); 208 } 209 } 210 if (element instanceof IApiBaseline) { 211 IApiBaseline baseline = (IApiBaseline) element; 212 StringBuilder buffer = new StringBuilder(); 213 buffer.append(baseline.getName()); 214 if (isDefaultBaseline(baseline)) { 215 buffer.append(NLS.bind(Messages.ApiToolsLabelProvider_default_baseline_place_holder, Messages.ApiToolsLabelProvider_default_baseline)); 216 } 217 return buffer.toString(); 218 } 219 if (element instanceof EEEntry) { 220 return ((EEEntry) element).toString(); 221 } 222 if (element instanceof IApiProblemFilter) { 223 IApiProblemFilter filter = (IApiProblemFilter) element; 224 return filter.getUnderlyingProblem().getMessage(); 225 } 226 if (element instanceof IResource) { 227 IResource resource = (IResource) element; 228 IPath path = resource.getProjectRelativePath(); 229 StringBuilder buffer = new StringBuilder(); 230 buffer.append(path.removeFileExtension().lastSegment()); 231 buffer.append(" ("); //$NON-NLS-1$ 232 buffer.append(path.removeLastSegments(1)); 233 buffer.append(")"); //$NON-NLS-1$ 234 return buffer.toString(); 235 } 236 if (element instanceof String) { 237 return (String) element; 238 } 239 return "<unknown>"; //$NON-NLS-1$ 240 } 241 242 /** 243 * Returns if the specified {@link IApiProfile} is the default profile or 244 * not 245 * 246 * @param element 247 * @return if the profile is the default or not 248 */ isDefaultBaseline(Object element)249 protected boolean isDefaultBaseline(Object element) { 250 if (element instanceof IApiBaseline) { 251 IApiBaseline profile = (IApiBaseline) element; 252 IApiBaseline def = ApiPlugin.getDefault().getApiBaselineManager().getDefaultApiBaseline(); 253 if (def != null) { 254 return profile.getName().equals(def.getName()); 255 } 256 } 257 return false; 258 } 259 260 @Override getFont(Object element)261 public Font getFont(Object element) { 262 if (isDefaultBaseline(element)) { 263 if (font == null) { 264 Font dialogFont = JFaceResources.getDialogFont(); 265 FontData[] fontData = dialogFont.getFontData(); 266 for (FontData data : fontData) { 267 data.setStyle(SWT.BOLD); 268 } 269 Display display = ApiUIPlugin.getShell().getDisplay(); 270 font = new Font(display, fontData); 271 } 272 return font; 273 } 274 return null; 275 } 276 277 } 278