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