1 /*******************************************************************************
2  * Copyright (c) 2000, 2003 IBM Corporation and others.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Common Public License v1.0
5  * which accompanies this distribution, and is available at
6  * http://www.eclipse.org/legal/cpl-v10.html
7  *
8  * Contributors:
9  *     IBM Corporation - initial API and implementation
10  *******************************************************************************/
11 package net.sourceforge.phpeclipse.phpeditor;
12 
13 import net.sourceforge.phpdt.internal.ui.PHPUiImages;
14 import net.sourceforge.phpdt.ui.PreferenceConstants;
15 
16 import org.eclipse.jface.resource.ImageDescriptor;
17 import org.eclipse.jface.resource.ImageRegistry;
18 import org.eclipse.jface.text.source.Annotation;
19 import org.eclipse.swt.SWT;
20 import org.eclipse.swt.graphics.Image;
21 import org.eclipse.swt.widgets.Display;
22 import org.eclipse.ui.ISharedImages;
23 import org.eclipse.ui.PlatformUI;
24 import org.eclipse.ui.texteditor.IAnnotationImageProvider;
25 
26 /**
27  * Image provider for annotations based on Java problem markers.
28  *
29  * @since 3.0
30  */
31 public class JavaAnnotationImageProvider implements IAnnotationImageProvider {
32 
33 	private final static int NO_IMAGE = 0;
34 
35 	private final static int GRAY_IMAGE = 1;
36 
37 	private final static int OVERLAY_IMAGE = 2;
38 
39 	private final static int QUICKFIX_IMAGE = 3;
40 
41 	private final static int QUICKFIX_ERROR_IMAGE = 4;
42 
43 	private static Image fgQuickFixImage;
44 
45 	private static Image fgQuickFixErrorImage;
46 
47 	private static ImageRegistry fgImageRegistry;
48 
49 	private boolean fShowQuickFixIcon;
50 
51 	private int fCachedImageType;
52 
53 	private Image fCachedImage;
54 
JavaAnnotationImageProvider()55 	public JavaAnnotationImageProvider() {
56 		fShowQuickFixIcon = PreferenceConstants.getPreferenceStore()
57 				.getBoolean(PreferenceConstants.EDITOR_CORRECTION_INDICATION);
58 	}
59 
60 	/*
61 	 * @see org.eclipse.jface.text.source.IAnnotationImageProvider#getManagedImage(org.eclipse.jface.text.source.Annotation)
62 	 */
getManagedImage(Annotation annotation)63 	public Image getManagedImage(Annotation annotation) {
64 		if (annotation instanceof IJavaAnnotation) {
65 			IJavaAnnotation javaAnnotation = (IJavaAnnotation) annotation;
66 			int imageType = getImageType(javaAnnotation);
67 			return getImage(javaAnnotation, imageType, Display.getCurrent());
68 		}
69 		return null;
70 	}
71 
72 	/*
73 	 * @see org.eclipse.jface.text.source.IAnnotationImageProvider#getImageDescriptorId(org.eclipse.jface.text.source.Annotation)
74 	 */
getImageDescriptorId(Annotation annotation)75 	public String getImageDescriptorId(Annotation annotation) {
76 		// unmanaged images are not supported
77 		return null;
78 	}
79 
80 	/*
81 	 * @see org.eclipse.jface.text.source.IAnnotationImageProvider#getImageDescriptor(java.lang.String)
82 	 */
getImageDescriptor(String symbolicName)83 	public ImageDescriptor getImageDescriptor(String symbolicName) {
84 		// unmanaged images are not supported
85 		return null;
86 	}
87 
showQuickFix(IJavaAnnotation annotation)88 	private boolean showQuickFix(IJavaAnnotation annotation) {
89 		// return fShowQuickFixIcon && annotation.isProblem() &&
90 		// JavaCorrectionProcessor.hasCorrections(annotation);
91 		return false;
92 	}
93 
getQuickFixImage()94 	private Image getQuickFixImage() {
95 		if (fgQuickFixImage == null)
96 			fgQuickFixImage = PHPUiImages
97 					.get(PHPUiImages.IMG_OBJS_FIXABLE_PROBLEM);
98 		return fgQuickFixImage;
99 	}
100 
getQuickFixErrorImage()101 	private Image getQuickFixErrorImage() {
102 		if (fgQuickFixErrorImage == null)
103 			fgQuickFixErrorImage = PHPUiImages
104 					.get(PHPUiImages.IMG_OBJS_FIXABLE_ERROR);
105 		return fgQuickFixErrorImage;
106 	}
107 
getImageRegistry(Display display)108 	private ImageRegistry getImageRegistry(Display display) {
109 		if (fgImageRegistry == null)
110 			fgImageRegistry = new ImageRegistry(display);
111 		return fgImageRegistry;
112 	}
113 
getImageType(IJavaAnnotation annotation)114 	private int getImageType(IJavaAnnotation annotation) {
115 		int imageType = NO_IMAGE;
116 		if (annotation.hasOverlay())
117 			imageType = OVERLAY_IMAGE;
118 		else if (!annotation.isMarkedDeleted()) {
119 			if (showQuickFix(annotation))
120 				imageType = JavaMarkerAnnotation.ERROR_ANNOTATION_TYPE
121 						.equals(annotation.getType()) ? QUICKFIX_ERROR_IMAGE
122 						: QUICKFIX_IMAGE;
123 		} else {
124 			imageType = GRAY_IMAGE;
125 		}
126 		return imageType;
127 	}
128 
getImage(IJavaAnnotation annotation, int imageType, Display display)129 	private Image getImage(IJavaAnnotation annotation, int imageType,
130 			Display display) {
131 		if (fCachedImageType == imageType)
132 			return fCachedImage;
133 
134 		Image image = null;
135 		switch (imageType) {
136 		case OVERLAY_IMAGE:
137 			IJavaAnnotation overlay = annotation.getOverlay();
138 			image = overlay.getImage(display);
139 			break;
140 		case QUICKFIX_IMAGE:
141 			image = getQuickFixImage();
142 			break;
143 		case QUICKFIX_ERROR_IMAGE:
144 			image = getQuickFixErrorImage();
145 			break;
146 		case GRAY_IMAGE: {
147 			ISharedImages sharedImages = PlatformUI.getWorkbench()
148 					.getSharedImages();
149 			String annotationType = annotation.getType();
150 			if (JavaMarkerAnnotation.ERROR_ANNOTATION_TYPE
151 					.equals(annotationType)) {
152 				image = sharedImages.getImage(ISharedImages.IMG_OBJS_ERROR_TSK);
153 			} else if (JavaMarkerAnnotation.WARNING_ANNOTATION_TYPE
154 					.equals(annotationType)) {
155 				image = sharedImages.getImage(ISharedImages.IMG_OBJS_WARN_TSK);
156 			} else if (JavaMarkerAnnotation.INFO_ANNOTATION_TYPE
157 					.equals(annotationType)) {
158 				image = sharedImages.getImage(ISharedImages.IMG_OBJS_INFO_TSK);
159 			}
160 			if (image != null) {
161 				ImageRegistry registry = getImageRegistry(display);
162 				String key = Integer.toString(image.hashCode());
163 				Image grayImage = registry.get(key);
164 				if (grayImage == null) {
165 					grayImage = new Image(display, image, SWT.IMAGE_GRAY);
166 					registry.put(key, grayImage);
167 				}
168 				image = grayImage;
169 			}
170 			break;
171 		}
172 		}
173 
174 		fCachedImageType = imageType;
175 		fCachedImage = image;
176 		return fCachedImage;
177 	}
178 }
179