/******************************************************************************* * Copyright (c) 2000, 2003 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Common Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/cpl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package net.sourceforge.phpeclipse.phpeditor; import java.util.Iterator; import net.sourceforge.phpdt.internal.ui.PHPUiImages; import net.sourceforge.phpdt.ui.PreferenceConstants; import net.sourceforge.phpeclipse.PHPeclipsePlugin; import org.eclipse.core.resources.IMarker; import org.eclipse.core.runtime.CoreException; import org.eclipse.debug.core.model.IBreakpoint; import org.eclipse.debug.ui.DebugUITools; import org.eclipse.debug.ui.IDebugModelPresentation; import org.eclipse.jface.resource.ImageRegistry; import org.eclipse.jface.text.Assert; import org.eclipse.search.ui.SearchUI; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.texteditor.MarkerAnnotation; import org.eclipse.ui.texteditor.MarkerUtilities; public class JavaMarkerAnnotation extends MarkerAnnotation implements IJavaAnnotation { private static final int NO_IMAGE= 0; private static final int ORIGINAL_MARKER_IMAGE= 1; private static final int QUICKFIX_IMAGE= 2; private static final int QUICKFIX_ERROR_IMAGE= 3; private static final int OVERLAY_IMAGE= 4; private static final int GRAY_IMAGE= 5; private static final int BREAKPOINT_IMAGE= 6; private static Image fgQuickFixImage; private static Image fgQuickFixErrorImage; private static ImageRegistry fgGrayMarkersImageRegistry; private IDebugModelPresentation fPresentation; private IJavaAnnotation fOverlay; private boolean fNotRelevant= false; private AnnotationType fType; private int fImageType; private boolean fQuickFixIconEnabled; public JavaMarkerAnnotation(IMarker marker) { super(marker); } /* * @see MarkerAnnotation#getUnknownImageName(IMarker) */ protected String getUnknownImageName(IMarker marker) { return PHPUiImages.IMG_OBJS_GHOST; } /** * Initializes the annotation's icon representation and its drawing layer * based upon the properties of the underlying marker. */ protected void initialize() { fQuickFixIconEnabled= PreferenceConstants.getPreferenceStore().getBoolean(PreferenceConstants.EDITOR_CORRECTION_INDICATION); fImageType= NO_IMAGE; IMarker marker= getMarker(); if (MarkerUtilities.isMarkerType(marker, IBreakpoint.BREAKPOINT_MARKER)) { if (fPresentation == null) fPresentation= DebugUITools.newDebugModelPresentation(); setImage(null); // see bug 32469 setLayer(4); fImageType= BREAKPOINT_IMAGE; fType= AnnotationType.UNKNOWN; } else { fType= AnnotationType.UNKNOWN; if (marker.exists()) { try { if (marker.isSubtypeOf(IMarker.PROBLEM)) { int severity= marker.getAttribute(IMarker.SEVERITY, -1); switch (severity) { case IMarker.SEVERITY_ERROR: fType= AnnotationType.ERROR; break; case IMarker.SEVERITY_WARNING: fType= AnnotationType.WARNING; break; } } else if (marker.isSubtypeOf(IMarker.TASK)) fType= AnnotationType.TASK; else if (marker.isSubtypeOf(SearchUI.SEARCH_MARKER)) fType= AnnotationType.SEARCH; else if (marker.isSubtypeOf(IMarker.BOOKMARK)) fType= AnnotationType.BOOKMARK; } catch(CoreException e) { PHPeclipsePlugin.log(e); } } super.initialize(); } } // private boolean mustShowQuickFixIcon() { // return fQuickFixIconEnabled && JavaCorrectionProcessor.hasCorrections(getMarker()); // } // // private Image getQuickFixImage() { // if (fgQuickFixImage == null) // fgQuickFixImage= JavaPluginImages.get(JavaPluginImages.IMG_OBJS_FIXABLE_PROBLEM); // return fgQuickFixImage; // } // // private Image getQuickFixErrorImage() { // if (fgQuickFixErrorImage == null) // fgQuickFixErrorImage= JavaPluginImages.get(JavaPluginImages.IMG_OBJS_FIXABLE_ERROR); // return fgQuickFixErrorImage; // } /* * @see IJavaAnnotation#getMessage() */ public String getMessage() { IMarker marker= getMarker(); if (marker == null || !marker.exists()) return ""; //$NON-NLS-1$ else return marker.getAttribute(IMarker.MESSAGE, ""); //$NON-NLS-1$ } /* * @see IJavaAnnotation#isTemporary() */ public boolean isTemporary() { return false; } /* * @see IJavaAnnotation#getArguments() */ public String[] getArguments() { IMarker marker= getMarker(); // if (marker != null && marker.exists() && isProblem()) // return Util.getProblemArgumentsFromMarker(marker.getAttribute(IJavaModelMarker.ARGUMENTS, "")); //$NON-NLS-1$ return null; } /* * @see IJavaAnnotation#getId() */ public int getId() { IMarker marker= getMarker(); // if (marker != null && marker.exists() && isProblem()) // return marker.getAttribute(IJavaModelMarker.ID, -1); return -1; } /* * @see IJavaAnnotation#isProblem() */ public boolean isProblem() { return fType == AnnotationType.WARNING || fType == AnnotationType.ERROR; } /* * @see IJavaAnnotation#isRelevant() */ public boolean isRelevant() { return !fNotRelevant; } /** * Overlays this annotation with the given javaAnnotation. * * @param javaAnnotation annotation that is overlaid by this annotation */ public void setOverlay(IJavaAnnotation javaAnnotation) { if (fOverlay != null) fOverlay.removeOverlaid(this); fOverlay= javaAnnotation; fNotRelevant= (fNotRelevant || fOverlay != null); if (javaAnnotation != null) javaAnnotation.addOverlaid(this); } /* * @see IJavaAnnotation#hasOverlay() */ public boolean hasOverlay() { return fOverlay != null; } /* * @see MarkerAnnotation#getImage(Display) */ public Image getImage(Display display) { if (fImageType == BREAKPOINT_IMAGE) { Image result= super.getImage(display); if (result == null) { IMarker marker= getMarker(); if (marker != null && marker.exists()) { result= fPresentation.getImage(getMarker()); setImage(result); } } return result; } int newImageType= NO_IMAGE; if (hasOverlay()) newImageType= OVERLAY_IMAGE; else if (isRelevant()) { // if (mustShowQuickFixIcon()) { // if (fType == AnnotationType.ERROR) // newImageType= QUICKFIX_ERROR_IMAGE; // else // newImageType= QUICKFIX_IMAGE; // } else newImageType= ORIGINAL_MARKER_IMAGE; } else newImageType= GRAY_IMAGE; if (fImageType == newImageType && newImageType != OVERLAY_IMAGE) // Nothing changed - simply return the current image return super.getImage(display); Image newImage= null; switch (newImageType) { case ORIGINAL_MARKER_IMAGE: newImage= null; break; case OVERLAY_IMAGE: newImage= fOverlay.getImage(display); break; // case QUICKFIX_IMAGE: // newImage= getQuickFixImage(); // break; // case QUICKFIX_ERROR_IMAGE: // newImage= getQuickFixErrorImage(); // break; case GRAY_IMAGE: if (fImageType != ORIGINAL_MARKER_IMAGE) setImage(null); Image originalImage= super.getImage(display); if (originalImage != null) { ImageRegistry imageRegistry= getGrayMarkerImageRegistry(display); if (imageRegistry != null) { String key= Integer.toString(originalImage.hashCode()); Image grayImage= imageRegistry.get(key); if (grayImage == null) { grayImage= new Image(display, originalImage, SWT.IMAGE_GRAY); imageRegistry.put(key, grayImage); } newImage= grayImage; } } break; default: Assert.isLegal(false); } fImageType= newImageType; setImage(newImage); return super.getImage(display); } private ImageRegistry getGrayMarkerImageRegistry(Display display) { if (fgGrayMarkersImageRegistry == null) fgGrayMarkersImageRegistry= new ImageRegistry(display); return fgGrayMarkersImageRegistry; } /* * @see IJavaAnnotation#addOverlaid(IJavaAnnotation) */ public void addOverlaid(IJavaAnnotation annotation) { // not supported } /* * @see IJavaAnnotation#removeOverlaid(IJavaAnnotation) */ public void removeOverlaid(IJavaAnnotation annotation) { // not supported } /* * @see IJavaAnnotation#getOverlaidIterator() */ public Iterator getOverlaidIterator() { // not supported return null; } /* * @see org.eclipse.jdt.internal.ui.javaeditor.IJavaAnnotation#getAnnotationType() */ public AnnotationType getAnnotationType() { return fType; } }