delegate type hierarchy creation for SourceTypes, introduce type hierarchy mode
diff --git a/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/core/ITypeHierarchy.java b/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/core/ITypeHierarchy.java
index 8482ed8..06aeea9 100644
--- a/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/core/ITypeHierarchy.java
+++ b/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/core/ITypeHierarchy.java
@@ -43,6 +43,10 @@
  * </p>
  */
 public interface ITypeHierarchy {
+	public static enum Mode {
+		HIERARCHY, SUPERTYPE
+	}
+	
 	/**
 	 * Adds the given listener for changes to this type hierarchy. Listeners are
 	 * notified when this type hierarchy changes and needs to be refreshed. Has
diff --git a/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/core/ITypeHierarchyBuilder.java b/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/core/ITypeHierarchyBuilder.java
index b8dce55..8ecb2fc 100644
--- a/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/core/ITypeHierarchyBuilder.java
+++ b/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/core/ITypeHierarchyBuilder.java
@@ -15,6 +15,7 @@
 
 public interface ITypeHierarchyBuilder {
 
-	ITypeHierarchy build(IType type, IProgressMonitor monitor);
+	ITypeHierarchy build(IType type, ITypeHierarchy.Mode mode,
+			IProgressMonitor monitor);
 
 }
diff --git a/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/internal/core/SourceType.java b/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/internal/core/SourceType.java
index 68f8719..44cb5f1 100644
--- a/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/internal/core/SourceType.java
+++ b/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/internal/core/SourceType.java
@@ -33,6 +33,7 @@
 import org.eclipse.dltk.core.search.IDLTKSearchScope;
 import org.eclipse.dltk.core.search.SearchEngine;
 import org.eclipse.dltk.internal.core.hierarchy.TypeHierarchy;
+import org.eclipse.dltk.internal.core.hierarchy.TypeHierarchyBuilders;
 import org.eclipse.dltk.internal.core.util.MementoTokenizer;
 import org.eclipse.dltk.internal.core.util.Messages;
 import org.eclipse.dltk.utils.CorePrinter;
@@ -388,6 +389,11 @@
 	 */
 	public ITypeHierarchy newSupertypeHierarchy(WorkingCopyOwner owner,
 			IProgressMonitor monitor) throws ModelException {
+		final ITypeHierarchy hierarchy = TypeHierarchyBuilders
+				.getTypeHierarchy(this, ITypeHierarchy.Mode.SUPERTYPE, monitor);
+		if (hierarchy != null) {
+			return hierarchy;
+		}
 
 		ISourceModule[] workingCopies = ModelManager.getModelManager()
 				.getWorkingCopies(owner, true/* add primary working copies */);
@@ -468,6 +474,11 @@
 	 */
 	public ITypeHierarchy newTypeHierarchy(IProgressMonitor monitor)
 			throws ModelException {
+		final ITypeHierarchy hierarchy = TypeHierarchyBuilders
+				.getTypeHierarchy(this, ITypeHierarchy.Mode.HIERARCHY, monitor);
+		if (hierarchy != null) {
+			return hierarchy;
+		}
 		CreateTypeHierarchyOperation op;
 		op = new CreateTypeHierarchyOperation(this, null,
 				createReferencingProjectsScope(), true);
diff --git a/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/internal/core/hierarchy/TypeHierarchyBuilders.java b/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/internal/core/hierarchy/TypeHierarchyBuilders.java
index bb14a45..43abb65 100644
--- a/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/internal/core/hierarchy/TypeHierarchyBuilders.java
+++ b/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/internal/core/hierarchy/TypeHierarchyBuilders.java
@@ -38,7 +38,7 @@
 	}
 
 	public static ITypeHierarchy getTypeHierarchy(IType type,
-			IProgressMonitor monitor) {
+			ITypeHierarchy.Mode mode, IProgressMonitor monitor) {
 		final IDLTKLanguageToolkit toolkit = DLTKLanguageManager
 				.getLanguageToolkit(type);
 		if (toolkit != null) {
@@ -46,7 +46,7 @@
 					toolkit.getNatureId());
 			if (builders != null) {
 				for (ITypeHierarchyBuilder builder : builders) {
-					final ITypeHierarchy hierarchy = builder.build(type,
+					final ITypeHierarchy hierarchy = builder.build(type, mode,
 							monitor);
 					if (hierarchy != null) {
 						return hierarchy;