errorticks incl. outliner
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/JavaPlugin.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/JavaPlugin.java
index 205d8b7..6cebc10 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/JavaPlugin.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/JavaPlugin.java
@@ -61,7 +61,7 @@
 import org.eclipse.jdt.internal.ui.preferences.JavaEditorPreferencePage;

 import org.eclipse.jdt.internal.ui.refactoring.RefactoringPreferencePage;

 import org.eclipse.jdt.internal.ui.snippeteditor.SnippetFileDocumentProvider;

-import org.eclipse.jdt.internal.ui.viewsupport.JavaProblemMarkerFilter;

+import org.eclipse.jdt.internal.ui.viewsupport.ProblemMarkerFilter;

 

 /**

  * Represents the java plugin. It provides a series of convenience methods such as

@@ -76,7 +76,7 @@
 	private ClassFileDocumentProvider fClassFileDocumentProvider;

 	private FileDocumentProvider fSnippetDocumentProvider;

 	private JavaTextTools fJavaTextTools;

-	private JavaProblemMarkerFilter fJavaProblemMarkerFilter;

+	private ProblemMarkerFilter fProblemMarkerFilter;

 	

 	

 	public static JavaPlugin getDefault() {

@@ -228,10 +228,10 @@
 		return getCompilationUnitDocumentProvider();

 	}

 	

-	public JavaProblemMarkerFilter getJavaProblemMarkerFilter() {

-		if (fJavaProblemMarkerFilter == null)

-			fJavaProblemMarkerFilter= new JavaProblemMarkerFilter();

-		return fJavaProblemMarkerFilter;

+	public ProblemMarkerFilter getProblemMarkerFilter() {

+		if (fProblemMarkerFilter == null)

+			fProblemMarkerFilter= new ProblemMarkerFilter();

+		return fProblemMarkerFilter;

 	}	

 	

 	public JavaTextTools getJavaTextTools() {

diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/AnnotationErrorTickManager.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/AnnotationErrorTickManager.java
new file mode 100644
index 0000000..5c09562
--- /dev/null
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/AnnotationErrorTickManager.java
@@ -0,0 +1,85 @@
+package org.eclipse.jdt.internal.ui.javaeditor;

+

+import java.util.Iterator;

+

+import org.eclipse.core.resources.IMarker;

+import org.eclipse.core.runtime.CoreException;

+

+import org.eclipse.jface.text.Position;

+import org.eclipse.jface.text.source.Annotation;

+import org.eclipse.jface.text.source.IAnnotationModel;

+

+import org.eclipse.ui.texteditor.IDocumentProvider;

+import org.eclipse.ui.texteditor.ITextEditor;

+import org.eclipse.ui.texteditor.MarkerAnnotation;

+

+import org.eclipse.jdt.core.IJavaElement;

+import org.eclipse.jdt.core.IJavaModelMarker;

+import org.eclipse.jdt.core.ISourceRange;

+import org.eclipse.jdt.core.ISourceReference;

+import org.eclipse.jdt.core.JavaModelException;

+

+import org.eclipse.jdt.internal.ui.JavaPlugin;

+import org.eclipse.jdt.internal.ui.viewsupport.IErrorTickManager;

+

+public class AnnotationErrorTickManager implements IErrorTickManager {

+

+	private IAnnotationModel fAnnotationModel;

+

+	public AnnotationErrorTickManager(IAnnotationModel model) {

+		fAnnotationModel= model;

+	}

+	

+	public AnnotationErrorTickManager(ITextEditor editor) {

+		this(editor.getDocumentProvider().getAnnotationModel(editor.getEditorInput()));

+	}	

+

+

+	/**

+	 * @see IErrorTickManager#getErrorInfo(IJavaElement)

+	 */

+	public int getErrorInfo(IJavaElement element) {

+		int info= 0;

+		if (element instanceof ISourceReference) {

+			try {

+				ISourceRange range= ((ISourceReference)element).getSourceRange();

+				final int ERRORTICK_ALL= ERRORTICK_WARNING | ERRORTICK_ERROR;

+				

+				Iterator iter= fAnnotationModel.getAnnotationIterator();

+				while (info != ERRORTICK_ALL && iter.hasNext()) {

+					Annotation curr= (Annotation) iter.next();

+					IMarker marker= isApplicable(curr, range);

+					if (marker != null) {

+						int priority= marker.getAttribute(IMarker.SEVERITY, -1);

+						if (priority == IMarker.SEVERITY_WARNING) {

+							info |= ERRORTICK_WARNING;

+						} else if (priority == IMarker.SEVERITY_ERROR) {

+							info |= ERRORTICK_ERROR;

+						}

+					}

+				}

+			} catch (JavaModelException e) {

+				JavaPlugin.log(e.getStatus());

+			}

+		}

+		return info;

+	}

+		

+	private IMarker isApplicable(Annotation annot, ISourceRange range) {

+		try {

+			if (annot instanceof MarkerAnnotation) {

+				IMarker marker= ((MarkerAnnotation)annot).getMarker();

+				if (marker.isSubtypeOf(IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER)) {

+					Position pos= fAnnotationModel.getPosition(annot);

+					if (pos.overlapsWith(range.getOffset(), range.getLength())) {

+						return marker;

+					}

+				}

+			}

+		} catch (CoreException e) {

+			JavaPlugin.log(e.getStatus());

+		}						

+		return null;

+	}

+}

+

diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/JavaOutlinePage.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/JavaOutlinePage.java
index 527f906..68f5a1d 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/JavaOutlinePage.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/JavaOutlinePage.java
@@ -46,6 +46,8 @@
 import org.eclipse.ui.texteditor.IUpdate;

 import org.eclipse.ui.views.contentoutline.IContentOutlinePage;

 

+import org.eclipse.core.resources.IResource;

+import org.eclipse.core.runtime.CoreException;

 import org.eclipse.jdt.core.ElementChangedEvent;

 import org.eclipse.jdt.core.Flags;

 import org.eclipse.jdt.core.ICompilationUnit;

@@ -60,6 +62,7 @@
 import org.eclipse.jdt.core.ISourceRange;

 import org.eclipse.jdt.core.ISourceReference;

 import org.eclipse.jdt.core.IType;

+import org.eclipse.jdt.core.IWorkingCopy;

 import org.eclipse.jdt.core.JavaCore;

 import org.eclipse.jdt.core.JavaModelException;

 

@@ -76,6 +79,8 @@
 import org.eclipse.jdt.internal.ui.util.ArrayUtility;

 import org.eclipse.jdt.internal.ui.util.JavaModelUtility;

 import org.eclipse.jdt.internal.ui.util.OpenTypeHierarchyHelper;

+import org.eclipse.jdt.internal.ui.viewsupport.IProblemChangedListener;

+import org.eclipse.jdt.internal.ui.viewsupport.ProblemTreeViewer;

 import org.eclipse.jdt.internal.ui.viewsupport.StatusBarUpdater;

 

 

@@ -249,7 +254,7 @@
 			};

 			

 			

-			class JavaOutlineViewer extends TreeViewer {

+			class JavaOutlineViewer extends ProblemTreeViewer {

 				

 				/**

 				 * Indicates an item which has been reused. At the point of

@@ -527,6 +532,19 @@
 					

 					return false;

 				}

+				

+				/**

+				 * @see ProblemTreeViewer#getUnderlyingResource

+				 */

+				protected IResource getUnderlyingResource(Object obj) throws CoreException {

+					Object input= getInput();

+					if (input instanceof IWorkingCopy) {

+						return ((ICompilationUnit)input).getOriginalElement().getCorrespondingResource();

+					}

+					return null;

+				}

+							

+				

 			};

 			

 			class LexicalSorter extends ViewerSorter {

@@ -753,6 +771,8 @@
 						JavaPlugin.getDefault().getPreferenceStore().setValue(fPreferenceKey, on);

 				}

 			};

+			

+			

 

 			

 	private IJavaElement fInput;

@@ -765,6 +785,8 @@
 	private Hashtable fActions= new Hashtable();

 	private ContextMenuGroup[] fActionGroups;

 	

+	private IProblemChangedListener fJavaProblemListener;

+	

 

 	public JavaOutlinePage(String contextMenuID, JavaEditor editor) {

 		super();

@@ -789,9 +811,14 @@
 		

 		Tree tree= new Tree(parent, SWT.MULTI);

 		

+		JavaElementLabelProvider lprovider= new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_PARAMETERS | JavaElementLabelProvider.SHOW_OVERLAY_ICONS | JavaElementLabelProvider.SHOW_TYPE);

+		lprovider.setErrorTickManager(new AnnotationErrorTickManager(fEditor));	

+		

 		fOutlineViewer= new JavaOutlineViewer(tree);		

 		fOutlineViewer.setContentProvider(new ChildrenProvider());

-		fOutlineViewer.setLabelProvider(new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_PARAMETERS | JavaElementLabelProvider.SHOW_OVERLAY_ICONS | JavaElementLabelProvider.SHOW_TYPE));

+		fOutlineViewer.setLabelProvider(lprovider);

+		

+		JavaPlugin.getDefault().getProblemMarkerFilter().addListener(fOutlineViewer);

 				

 		MenuManager manager= new MenuManager(fContextMenuID, fContextMenuID);

 		manager.setRemoveAllWhenShown(true);

@@ -833,6 +860,8 @@
 			fSelectionChangedListeners.remove(listeners[i]);

 		fSelectionChangedListeners= null;

 		

+		JavaPlugin.getDefault().getProblemMarkerFilter().removeListener(fOutlineViewer);

+		

 		if (fMenu != null && !fMenu.isDisposed()) {

 			fMenu.dispose();

 			fMenu= null;

diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/packageview/PackageExplorerPart.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/packageview/PackageExplorerPart.java
index 12ac0e8..249c230 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/packageview/PackageExplorerPart.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/packageview/PackageExplorerPart.java
Binary files differ
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/LineBreakingReader.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/LineBreakingReader.java
index 0495756..f6b1f75 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/LineBreakingReader.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/LineBreakingReader.java
Binary files differ
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/MethodsViewer.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/MethodsViewer.java
index d049e84..8f6b766 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/MethodsViewer.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/MethodsViewer.java
@@ -4,13 +4,14 @@
  */

 package org.eclipse.jdt.internal.ui.typehierarchy;

 

-import java.util.Collection;

+import java.util.Set;

 

 import org.eclipse.swt.SWT;

 import org.eclipse.swt.events.ControlAdapter;

 import org.eclipse.swt.events.ControlEvent;

 import org.eclipse.swt.events.DisposeEvent;

 import org.eclipse.swt.widgets.Composite;

+import org.eclipse.swt.widgets.Control;

 import org.eclipse.swt.widgets.Item;

 import org.eclipse.swt.widgets.Menu;

 import org.eclipse.swt.widgets.ScrollBar;

@@ -52,8 +53,10 @@
 import org.eclipse.jdt.internal.ui.actions.OpenSourceReferenceAction;

 import org.eclipse.jdt.internal.ui.search.JavaSearchGroup;

 import org.eclipse.jdt.internal.ui.util.ExceptionHandler;

+import org.eclipse.jdt.internal.ui.viewsupport.IProblemChangedListener;

 import org.eclipse.jdt.internal.ui.viewsupport.JavaTextLabelProvider;

-import org.eclipse.jdt.internal.ui.viewsupport.SeverityItemMapper;

+import org.eclipse.jdt.internal.ui.viewsupport.MarkerErrorTickManager;

+import org.eclipse.jdt.internal.ui.viewsupport.ProblemItemMapper;

 

 

 /**

@@ -61,18 +64,18 @@
  * Offers filter actions.

  * No dependency to the type hierarchy view

  */

-public class MethodsViewer extends TableViewer {

+public class MethodsViewer extends TableViewer implements IProblemChangedListener {

 	

-	private SeverityItemMapper fSeverityItemMapper;

+	private ProblemItemMapper fProblemItemMapper;

 	

 	/**

 	 * Sorter that uses the unmodified labelprovider (No declaring class names)

 	 */

 	private static class MethodsViewerSorter extends ViewerSorter {

-		private JavaTextLabelProvider fLabelProvider;

+		private JavaTextLabelProvider fTextLabelProvider;

 		

 		public MethodsViewerSorter() {

-			fLabelProvider= new JavaTextLabelProvider(JavaElementLabelProvider.SHOW_DEFAULT);

+			fTextLabelProvider= new JavaTextLabelProvider(JavaElementLabelProvider.SHOW_DEFAULT);

 		}

 		

 		public boolean isSorterProperty(Object element, Object property) {

@@ -103,8 +106,8 @@
 				return cat1 - cat2;

 

 			// cat1 == cat2

-			String name1= fLabelProvider.getTextLabel((IJavaElement)e1);

-			String name2= fLabelProvider.getTextLabel((IJavaElement)e2);

+			String name1= fTextLabelProvider.getTextLabel((IJavaElement)e1);

+			String name2= fTextLabelProvider.getTextLabel((IJavaElement)e2);

 			return getCollator().compare(name1, name2);

 		}

 	}

@@ -129,7 +132,7 @@
 	public MethodsViewer(Composite parent, IWorkbenchPart part) {

 		super(new Table(parent, SWT.MULTI));

 		

-		fSeverityItemMapper= new SeverityItemMapper();

+		fProblemItemMapper= new ProblemItemMapper();

 		

 		final Table table= getTable();

 		final TableColumn column= new TableColumn(table, SWT.NULL | SWT.MULTI | SWT.FULL_SELECTION);

@@ -139,8 +142,11 @@
 			}

 		});

 

+		JavaElementLabelProvider lprovider= new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_DEFAULT);

+		lprovider.setErrorTickManager(new MarkerErrorTickManager());

 		MethodsContentProvider contentProvider= new MethodsContentProvider();

-		setLabelProvider(new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_DEFAULT));

+

+		setLabelProvider(lprovider);

 		setContentProvider(contentProvider);

 				

 		fOpen= new OpenSourceReferenceAction(this);

@@ -308,15 +314,27 @@
 		tbm.add(fFilterActions[1]); // static

 		tbm.add(fFilterActions[2]); // public

 	}

+

+

+	/**

+	 * @see IProblemChangedListener#problemsChanged

+	 */

+	public void problemsChanged(final Set changed) {

+		Control control= getControl();

+		if (control != null && !control.isDisposed()) {

+			control.getDisplay().asyncExec(new Runnable() {

+				public void run() {

+					fProblemItemMapper.problemsChanged(changed, (ILabelProvider)getLabelProvider());

+				}

+			});

+		}

+	}

 	

 	private IResource getMappingResource(IMember member) {

 		try {

-			int type= member.getElementType();

-			if (type == IJavaElement.TYPE || type == IJavaElement.METHOD || type == IJavaElement.INITIALIZER) {

-				ICompilationUnit cu= member.getCompilationUnit();

-				if (cu != null) {

-					return cu.getCorrespondingResource();

-				}

+			ICompilationUnit cu= member.getCompilationUnit();

+			if (cu != null) {

+				return cu.getCorrespondingResource();

 			}

 		} catch (JavaModelException e) {

 			JavaPlugin.log(e.getStatus());

@@ -331,7 +349,7 @@
 		super.mapElement(element, widget);

 		IResource res= getMappingResource((IMember)element);

 		if (res != null && widget instanceof Item) {

-			fSeverityItemMapper.addToMap(res, (Item)widget);

+			fProblemItemMapper.addToMap(res, (Item)widget);

 		}

 	}

 

@@ -342,7 +360,7 @@
 		super.unmapElement(element);

 		IResource res= getMappingResource((IMember)element);

 		if (res != null) {

-			fSeverityItemMapper.removeFromMap(res, element);

+			fProblemItemMapper.removeFromMap(res, element);

 		}

 	}

 

@@ -352,14 +370,7 @@
 	 */	

 	protected void unmapAllElements() {

 		super.unmapAllElements();

-		fSeverityItemMapper.clearMap();

+		fProblemItemMapper.clearMap();

 	}

 

-	/**

-	 * Called when severities changed.

-	 */	

-	public void severitiesChanged(Collection changed) {

-		fSeverityItemMapper.severitiesChanged(changed, (ILabelProvider)getLabelProvider());

-	}	

-

 }
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/TypeHierarchyViewPart.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/TypeHierarchyViewPart.java
index 437b0cf..3b665f7 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/TypeHierarchyViewPart.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/TypeHierarchyViewPart.java
@@ -6,7 +6,6 @@
 

 import java.util.ArrayList;

 import java.util.List;

-import java.util.Set;

 

 import org.eclipse.swt.SWT;

 import org.eclipse.swt.custom.BusyIndicator;

@@ -38,7 +37,6 @@
 import org.eclipse.jface.action.ToolBarManager;

 import org.eclipse.jface.dialogs.IDialogSettings;

 import org.eclipse.jface.viewers.IInputSelectionProvider;

-import org.eclipse.jface.viewers.ILabelProvider;

 import org.eclipse.jface.viewers.ISelection;

 import org.eclipse.jface.viewers.ISelectionChangedListener;

 import org.eclipse.jface.viewers.ISelectionProvider;

@@ -88,7 +86,8 @@
 import org.eclipse.jdt.internal.ui.util.JavaModelUtility;

 import org.eclipse.jdt.internal.ui.util.OpenTypeHierarchyHelper;

 import org.eclipse.jdt.internal.ui.util.SelectionUtil;

-import org.eclipse.jdt.internal.ui.viewsupport.IJavaProblemListener;

+import org.eclipse.jdt.internal.ui.viewsupport.IProblemChangedListener;

+import org.eclipse.jdt.internal.ui.viewsupport.MarkerErrorTickManager;

 import org.eclipse.jdt.internal.ui.viewsupport.SelectionProviderMediator;

 import org.eclipse.jdt.internal.ui.viewsupport.StatusBarUpdater;

 

@@ -119,7 +118,7 @@
 	private ArrayList fInputHistory;

 	private int fCurrHistoryIndex;

 	

-	private IJavaProblemListener fJavaProblemListener;

+	private IProblemChangedListener fHierarchyProblemListener;

 	

 	private TypeHierarchyLifeCycle fHierarchyLifeCycle;

 	private ITypeHierarchyLifeCycleListener fTypeHierarchyLifeCycleListener;

@@ -138,7 +137,7 @@
 	private Label fEmptyTypesViewer;

 	

 	private CLabel fMethodViewerPaneLabel;

-	private ILabelProvider fPaneLabelProvider;

+	private JavaElementLabelProvider fPaneLabelProvider;

 	

 	private IDialogSettings fDialogSettings;

 	

@@ -166,13 +165,7 @@
 		};

 		fHierarchyLifeCycle.addChangedListener(fTypeHierarchyLifeCycleListener);

 		

-		fJavaProblemListener= new IJavaProblemListener() {

-			public void severitiesChanged(Set elements) {

-				doSeverityChanged(elements);

-			}

-		};

-		JavaPlugin.getDefault().getJavaProblemMarkerFilter().addListener(fJavaProblemListener);

-		

+		fHierarchyProblemListener= null;

 		

 		fIsEnableMemberFilter= false;

 		

@@ -211,6 +204,7 @@
 		fFocusOnTypeAction= new FocusOnTypeAction(this);

 		

 		fPaneLabelProvider= new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_BASICS);

+		fPaneLabelProvider.setErrorTickManager(new MarkerErrorTickManager());

 		

 		fAllViewers= new TypeHierarchyViewer[3];

 	

@@ -364,9 +358,13 @@
 	public void dispose() {

 		fHierarchyLifeCycle.freeHierarchy();

 		fHierarchyLifeCycle.removeChangedListener(fTypeHierarchyLifeCycleListener);

-		JavaPlugin.getDefault().getJavaProblemMarkerFilter().removeListener(fJavaProblemListener);

 		fPaneLabelProvider.dispose();

 		getSite().getPage().removePartListener(fPartListener);

+

+		if (fHierarchyProblemListener != null) {

+			JavaPlugin.getDefault().getProblemMarkerFilter().removeListener(fHierarchyProblemListener);

+		}

+		JavaPlugin.getDefault().getProblemMarkerFilter().removeListener(fMethodsViewer);

 		super.dispose();

 	}

 		

@@ -481,6 +479,8 @@
 				viewPartKeyShortcuts(event);

 			}

 		});

+		

+		JavaPlugin.getDefault().getProblemMarkerFilter().addListener(fMethodsViewer);

 		return control;

 	}

 	

@@ -841,23 +841,7 @@
 				}

 			});

 		}

-	}

-	

-	/**

-	 * Called from ISeverityListener#severitiesChanged

-	 */	

-	private void doSeverityChanged(final Set changeElements) {

-		Display display= getDisplay();

-		if (display != null) {

-			display.asyncExec(new Runnable() {

-				public void run() {

-					getCurrentViewer().severitiesChanged(changeElements);

-					fMethodsViewer.severitiesChanged(changeElements);

-				}

-			});

-		}

-	}

-	

+	}	

 	

 	private Display getDisplay() {

 		if (fPagebook != null && !fPagebook.isDisposed()) {

@@ -893,8 +877,9 @@
 	 * called from ToggleViewAction

 	 */	

 	public void setView(int viewerIndex) {

-		if (viewerIndex < fAllViewers.length && fCurrentViewerIndex != viewerIndex) {

+		if (viewerIndex < fAllViewers.length && fCurrentViewerIndex != viewerIndex) {			

 			fCurrentViewerIndex= viewerIndex;

+			

 			updateTypesViewer();

 			if (fInput != null) {

 				ISelection currSelection= getCurrentViewer().getSelection();

@@ -904,9 +889,16 @@
 				if (!fIsEnableMemberFilter) {

 					typeSelectionChanged(getCurrentViewer().getSelection());

 				}

-			}

-		

+			}		

 			updateTitle();

+			

+			if (fHierarchyProblemListener != null) {

+				JavaPlugin.getDefault().getProblemMarkerFilter().removeListener(fHierarchyProblemListener);

+			}

+			fHierarchyProblemListener= getCurrentViewer();

+			JavaPlugin.getDefault().getProblemMarkerFilter().addListener(fHierarchyProblemListener);

+			

+			

 			fDialogSettings.put(DIALOGSTORE_HIERARCHYVIEW, viewerIndex);

 			getCurrentViewer().getTree().setFocus();

 		}

diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/TypeHierarchyViewer.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/TypeHierarchyViewer.java
index eae0ac3..761a2f4 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/TypeHierarchyViewer.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/TypeHierarchyViewer.java
@@ -4,18 +4,11 @@
  */

 package org.eclipse.jdt.internal.ui.typehierarchy;

 

-import java.util.Collection;

-import java.util.HashMap;

-

 import org.eclipse.swt.SWT;

 import org.eclipse.swt.events.DisposeEvent;

 import org.eclipse.swt.widgets.Composite;

-import org.eclipse.swt.widgets.Item;

 import org.eclipse.swt.widgets.Menu;

 import org.eclipse.swt.widgets.Tree;

-import org.eclipse.swt.widgets.Widget;

-

-import org.eclipse.core.resources.IResource;

 

 import org.eclipse.jface.action.IMenuListener;

 import org.eclipse.jface.action.IMenuManager;

@@ -25,16 +18,12 @@
 import org.eclipse.jface.viewers.DoubleClickEvent;

 import org.eclipse.jface.viewers.IContentProvider;

 import org.eclipse.jface.viewers.IDoubleClickListener;

-import org.eclipse.jface.viewers.ILabelProvider;

 import org.eclipse.jface.viewers.IStructuredContentProvider;

-import org.eclipse.jface.viewers.TreeViewer;

 import org.eclipse.jface.viewers.ViewerSorter;

 

 import org.eclipse.ui.IWorkbenchPart;

 import org.eclipse.ui.IWorkbenchPartSite;

 

-import org.eclipse.jdt.core.ICompilationUnit;

-import org.eclipse.jdt.core.IJavaElement;

 import org.eclipse.jdt.core.IMember;

 import org.eclipse.jdt.core.IType;

 import org.eclipse.jdt.core.JavaModelException;

@@ -42,36 +31,31 @@
 import org.eclipse.jdt.ui.IContextMenuConstants;

 import org.eclipse.jdt.ui.JavaElementLabelProvider;

 

-import org.eclipse.jdt.internal.ui.JavaPlugin;

 import org.eclipse.jdt.internal.ui.actions.ContextMenuGroup;

 import org.eclipse.jdt.internal.ui.actions.GenerateGroup;

 import org.eclipse.jdt.internal.ui.actions.OpenSourceReferenceAction;

 import org.eclipse.jdt.internal.ui.actions.ShowInPackageViewAction;

 import org.eclipse.jdt.internal.ui.search.JavaSearchGroup;

-import org.eclipse.jdt.internal.ui.viewsupport.SeverityItemMapper;

+import org.eclipse.jdt.internal.ui.viewsupport.IProblemChangedListener;

+import org.eclipse.jdt.internal.ui.viewsupport.MarkerErrorTickManager;

+import org.eclipse.jdt.internal.ui.viewsupport.ProblemTreeViewer;

 import org.eclipse.jdt.internal.ui.wizards.NewGroup;

-

  

-public abstract class TypeHierarchyViewer extends TreeViewer {

+public abstract class TypeHierarchyViewer extends ProblemTreeViewer implements IProblemChangedListener {

 	

 	private OpenSourceReferenceAction fOpen;

 	private ShowInPackageViewAction fShowInPackageViewAction;

 	private ContextMenuGroup[] fStandardGroups;

-	

-	private SeverityItemMapper fSeverityItemMapper;

-	

-	private HashMap fPathToWidget;

-	

+			

 	public TypeHierarchyViewer(Composite parent, IContentProvider contentProvider, IWorkbenchPart part) {

 		super(new Tree(parent, SWT.SINGLE));

-		

-		fSeverityItemMapper= new SeverityItemMapper();

-		

-		fPathToWidget= new HashMap();

-		

-		setContentProvider(contentProvider);

 				

-		setLabelProvider(new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_DEFAULT));

+		setContentProvider(contentProvider);

+		

+		JavaElementLabelProvider lprovider= new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_DEFAULT);

+		lprovider.setErrorTickManager(new MarkerErrorTickManager());

+				

+		setLabelProvider(lprovider);

 		setSorter(new ViewerSorter() {

 			public boolean isSorterProperty(Object element, Object property) {

 				return true;

@@ -147,61 +131,7 @@
 	public void setMemberFilter(IMember[] memberFilter) {

 		getHierarchyContentProvider().setMemberFilter(memberFilter);

 	}	

-	

-	

-	private IResource getMappingResource(IMember member) {

-		try {

-			int type= member.getElementType();

-			if (type == IJavaElement.TYPE || type == IJavaElement.METHOD || type == IJavaElement.INITIALIZER) {

-				ICompilationUnit cu= member.getCompilationUnit();

-				if (cu != null) {

-					return cu.getCorrespondingResource();

-				}

-			}

-		} catch (JavaModelException e) {

-			JavaPlugin.log(e.getStatus());

-		}			

-		return null;

-	}	

-	

-	/**

-	 * @see TreeViewer#mapElement

-	 */

-	protected void mapElement(Object element, Widget widget) {

-		super.mapElement(element, widget);

-		IResource res= getMappingResource((IMember)element);

-		if (res != null && widget instanceof Item) {

-			fSeverityItemMapper.addToMap(res, (Item)widget);

-		}

-	}

-

-	/**

-	 * @see TreeViewer#unmapElement

-	 */	

-	protected void unmapElement(Object element) {

-		super.unmapElement(element);

-		IResource res= getMappingResource((IMember)element);

-		if (res != null) {

-			fSeverityItemMapper.removeFromMap(res, element);

-		}

-	}

-

-	/**

-	 * @see TreeViewer#unmapAllElements

-	 */	

-	protected void unmapAllElements() {

-		super.unmapAllElements();

-		fSeverityItemMapper.clearMap();

-	}

-

-	/**

-	 * @called when severities changed

-	 */	

-	public void severitiesChanged(Collection changed) {

-		fSeverityItemMapper.severitiesChanged(changed, (ILabelProvider)getLabelProvider());

-	}

-	

-	

+		

 	/**

 	 * Returns true if the hierarchy contains elements.

 	 * With member filtering it is possible that no elements are visible

diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/IErrorTickManager.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/IErrorTickManager.java
new file mode 100644
index 0000000..e5f68dc
--- /dev/null
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/IErrorTickManager.java
@@ -0,0 +1,17 @@
+package org.eclipse.jdt.internal.ui.viewsupport;

+

+import org.eclipse.jdt.core.IJavaElement;

+

+public interface IErrorTickManager {

+	

+	public static final int ERRORTICK_WARNING= 1;

+	public static final int ERRORTICK_ERROR= 2;	

+	

+	/**

+	 * @returns an set (specified by an int) using the constants

+	 * ERRORTICK_ERROR, ERRORTICK_WARNING

+	 */

+	int getErrorInfo(IJavaElement element);	

+

+}

+

diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/IProblemChangedListener.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/IProblemChangedListener.java
new file mode 100644
index 0000000..6118d30
--- /dev/null
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/IProblemChangedListener.java
@@ -0,0 +1,12 @@
+/*

+ * (c) Copyright IBM Corp. 2000, 2001.

+ * All Rights Reserved.

+ */

+package org.eclipse.jdt.internal.ui.viewsupport;

+

+import java.util.Set;

+

+public interface IProblemChangedListener {

+	

+	void problemsChanged(Set changedElements);

+}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/JavaElementDescriptorFactory.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/JavaElementDescriptorFactory.java
index 34c0f45..59b9d7f 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/JavaElementDescriptorFactory.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/JavaElementDescriptorFactory.java
Binary files differ
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/JavaImageLabelProvider.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/JavaImageLabelProvider.java
index 0527fe3..4dcace6 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/JavaImageLabelProvider.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/JavaImageLabelProvider.java
Binary files differ
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/MarkerErrorTickManager.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/MarkerErrorTickManager.java
new file mode 100644
index 0000000..4ee8ef0
--- /dev/null
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/MarkerErrorTickManager.java
@@ -0,0 +1,84 @@
+package org.eclipse.jdt.internal.ui.viewsupport;

+

+import org.eclipse.core.resources.IMarker;

+import org.eclipse.core.resources.IResource;

+import org.eclipse.core.runtime.CoreException;

+

+import org.eclipse.jdt.core.ICompilationUnit;

+import org.eclipse.jdt.core.IJavaElement;

+import org.eclipse.jdt.core.IJavaModelMarker;

+import org.eclipse.jdt.core.IMember;

+import org.eclipse.jdt.core.ISourceRange;

+

+import org.eclipse.jdt.internal.ui.JavaPlugin;

+

+public class MarkerErrorTickManager implements IErrorTickManager {

+	

+	/**

+	 * @see IErrorTickManager#getErrorInfo

+	 */

+	public int getErrorInfo(IJavaElement element) {

+		int info= 0;

+		try {

+			IResource res= null;

+			ISourceRange range= null;

+			int depth= IResource.DEPTH_INFINITE;

+			

+			int type= element.getElementType();

+			

+			if (type < IJavaElement.TYPE) {

+				res= element.getCorrespondingResource();

+				if (type == IJavaElement.PACKAGE_FRAGMENT) {

+					depth= IResource.DEPTH_ONE;

+				} else if (type == IJavaElement.JAVA_PROJECT) {

+					IMarker[] bpMarkers= res.findMarkers(IJavaModelMarker.BUILDPATH_PROBLEM_MARKER, true, IResource.DEPTH_ONE);

+					info= accumulateProblems(bpMarkers, info, null);

+				}

+			} else if (type == IJavaElement.TYPE || type == IJavaElement.METHOD || type == IJavaElement.INITIALIZER) {

+				// we assume that only source elements can have markers

+				ICompilationUnit cu= ((IMember)element).getCompilationUnit();

+				if (cu != null) {

+					res= element.getUnderlyingResource();

+					range= ((IMember)element).getSourceRange();

+				}

+			}

+			

+			if (res != null) {

+				IMarker[] markers= res.findMarkers(IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER, true, depth);

+				if (markers != null) {

+					info= accumulateProblems(markers, info, range);

+				}

+			}

+		} catch (CoreException e) {

+			JavaPlugin.log(e.getStatus());

+		}

+		return info;

+	}

+	

+	private int accumulateProblems(IMarker[] markers, int info, ISourceRange range) {

+		if (markers != null) {

+			final int ERRORTICK_ALL= ERRORTICK_WARNING | ERRORTICK_ERROR; 

+							

+			for (int i= 0; i < markers.length && (info != ERRORTICK_ALL); i++) {

+				IMarker curr= markers[i];

+				if (range == null || isInRange(curr, range)) {

+					int priority= curr.getAttribute(IMarker.SEVERITY, -1);

+					if (priority == IMarker.SEVERITY_WARNING) {

+						info |= ERRORTICK_WARNING;

+					} else if (priority == IMarker.SEVERITY_ERROR) {

+						info |= ERRORTICK_ERROR;

+					}

+				}

+			}

+		}

+		return info;

+	}

+	

+	private boolean isInRange(IMarker marker, ISourceRange range) {

+		int pos= marker.getAttribute(IMarker.CHAR_START, -1);

+		int offset= range.getOffset();

+		return (offset <= pos && offset + range.getLength() > pos);

+	}	

+

+}

+

diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/OverlayIconManager.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/OverlayIconManager.java
index 5c21326..790caaf 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/OverlayIconManager.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/OverlayIconManager.java
Binary files differ
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/ProblemItemMapper.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/ProblemItemMapper.java
new file mode 100644
index 0000000..ec8d1db
--- /dev/null
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/ProblemItemMapper.java
Binary files differ
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/ProblemMarkerFilter.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/ProblemMarkerFilter.java
new file mode 100644
index 0000000..cc44e75
--- /dev/null
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/ProblemMarkerFilter.java
Binary files differ
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/ProblemTreeViewer.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/ProblemTreeViewer.java
new file mode 100644
index 0000000..c796432
--- /dev/null
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/ProblemTreeViewer.java
@@ -0,0 +1,130 @@
+package org.eclipse.jdt.internal.ui.viewsupport;

+

+import java.util.Set;

+

+import org.eclipse.swt.widgets.Composite;

+import org.eclipse.swt.widgets.Control;

+import org.eclipse.swt.widgets.Item;

+import org.eclipse.swt.widgets.Tree;

+import org.eclipse.swt.widgets.Widget;

+

+import org.eclipse.core.resources.IResource;

+import org.eclipse.core.runtime.CoreException;

+

+import org.eclipse.jface.viewers.ILabelProvider;

+import org.eclipse.jface.viewers.TreeViewer;

+

+import org.eclipse.jdt.core.IJavaElement;

+

+import org.eclipse.jdt.internal.ui.JavaPlugin;

+import org.eclipse.jdt.internal.ui.util.JavaModelUtility;

+

+public class ProblemTreeViewer extends TreeViewer implements IProblemChangedListener {

+

+	private ProblemItemMapper fSeverityItemMapper;

+

+	/**

+	 * @see TreeViewer#TreeViewer(Composite)

+	 */

+	public ProblemTreeViewer(Composite parent) {

+		super(parent);

+		initMapper();

+	}

+

+	/**

+	 * @see TreeViewer#TreeViewer(Composite, int)

+	 */

+	public ProblemTreeViewer(Composite parent, int style) {

+		super(parent, style);

+		initMapper();

+	}

+

+	/**

+	 * @see TreeViewer#TreeViewer(Tree)

+	 */

+	public ProblemTreeViewer(Tree tree) {

+		super(tree);

+		initMapper();

+	}

+	

+	private void initMapper() {

+		fSeverityItemMapper= new ProblemItemMapper();

+	}

+	

+	

+	/**

+	 * @see IProblemChangedListener#problemsChanged

+	 */

+	public void problemsChanged(final Set changed) {

+		Control control= getControl();

+		if (control != null && !control.isDisposed()) {

+			control.getDisplay().asyncExec(new Runnable() {

+				public void run() {

+					fSeverityItemMapper.problemsChanged(changed, (ILabelProvider)getLabelProvider());

+				}

+			});

+		}

+	}

+	

+	/**

+	 * Called to get the underlying resource of an element that can show

+	 * error markers.

+	 * If the element can not show error markers, return null.

+	 */

+	protected IResource getUnderlyingResource(Object obj) throws CoreException {

+		if (obj instanceof IJavaElement) {

+			IJavaElement elem= (IJavaElement)obj;

+			

+			int type= elem.getElementType();

+			if (type < IJavaElement.TYPE) {

+				return elem.getCorrespondingResource();

+			} else {

+				IJavaElement cu= JavaModelUtility.findElementOfKind(elem, IJavaElement.COMPILATION_UNIT);

+				if (cu != null) {

+					return cu.getCorrespondingResource();

+				}

+			}

+		}

+		return null;

+	}	

+	

+	/**

+	 * @see TreeViewer#mapElement

+	 */

+	protected void mapElement(Object element, Widget widget) {

+		super.mapElement(element, widget);

+		try {

+			IResource res= getUnderlyingResource(element);

+			if (res != null && widget instanceof Item) {

+				fSeverityItemMapper.addToMap(res, (Item)widget);

+			}

+		} catch (CoreException e) {

+			JavaPlugin.log(e.getStatus());

+		}			

+	}

+

+	/**

+	 * @see TreeViewer#unmapElement

+	 */	

+	protected void unmapElement(Object element) {

+		super.unmapElement(element);

+		try {

+			IResource res= getUnderlyingResource(element);

+			if (res != null) {

+				fSeverityItemMapper.removeFromMap(res, element);

+			}

+		} catch (CoreException e) {

+			JavaPlugin.log(e.getStatus());

+		}			

+	}

+

+	/**

+	 * @see TreeViewer#unmapAllElements

+	 */	

+	protected void unmapAllElements() {

+		super.unmapAllElements();

+		fSeverityItemMapper.clearMap();

+	}	

+

+}

+

diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/JavaElementLabelProvider.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/JavaElementLabelProvider.java
index 734bbf4..59d8359 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/JavaElementLabelProvider.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/JavaElementLabelProvider.java
@@ -11,21 +11,18 @@
 

 import org.eclipse.swt.graphics.Image;

 

+import org.eclipse.core.resources.IStorage;

+

 import org.eclipse.jface.resource.ImageDescriptor;

 import org.eclipse.jface.viewers.LabelProvider;

 

-import org.eclipse.core.resources.IStorage;

-import org.eclipse.core.runtime.IAdaptable;

-import org.eclipse.core.runtime.IPath;

-import org.eclipse.core.runtime.Path;

-

 import org.eclipse.ui.IEditorRegistry;

 import org.eclipse.ui.PlatformUI;

-import org.eclipse.ui.model.IWorkbenchAdapter;

 import org.eclipse.ui.model.WorkbenchLabelProvider;

 

 import org.eclipse.jdt.core.IJavaElement;

 

+import org.eclipse.jdt.internal.ui.viewsupport.IErrorTickManager;

 import org.eclipse.jdt.internal.ui.viewsupport.JavaImageLabelProvider;

 import org.eclipse.jdt.internal.ui.viewsupport.JavaTextLabelProvider;

 

@@ -205,6 +202,10 @@
 		disposeJarEntryImages();

 	}

 	

+	public void setErrorTickManager(IErrorTickManager manager) {

+		fImageLabelProvider.setErrorTickManager(manager);

+	}	

+	

 	/*

 	 * Dispose the cached images for JarEntry files

 	 */