make the callin marker creator cancellable
diff --git a/plugins/org.eclipse.objectteams.otdt.ui/src/org/eclipse/objectteams/otdt/internal/ui/callinmarkers/CallinMarkerCreator2.java b/plugins/org.eclipse.objectteams.otdt.ui/src/org/eclipse/objectteams/otdt/internal/ui/callinmarkers/CallinMarkerCreator2.java
index a6ad884..ba860c9 100644
--- a/plugins/org.eclipse.objectteams.otdt.ui/src/org/eclipse/objectteams/otdt/internal/ui/callinmarkers/CallinMarkerCreator2.java
+++ b/plugins/org.eclipse.objectteams.otdt.ui/src/org/eclipse/objectteams/otdt/internal/ui/callinmarkers/CallinMarkerCreator2.java
@@ -314,12 +314,14 @@
 		    Set<IType> allTypes = target.getAllTypes(projects, monitor); // 10 ticks
 		    Map<IMember, Set<IType>> playedByMap = searchPlayedByBindings(allTypes, projects, new MySubProgressMonitor(monitor, 20));
 			if (playedByMap == null || playedByMap.size() == 0)
-				return;
+				return; // no base types or cancelled
 
 			createMarkersFor(target, playedByMap, CallinMarker.PLAYEDBY_ID, new MySubProgressMonitor(monitor, 5));
 
 		    // collect all roles for use as search scope:
 		    IMember[] allRoleTypes = collectRolesAndSubroles(playedByMap, new MySubProgressMonitor(monitor, 10));
+		    if (monitor.isCanceled())
+		    	return;
 		    
 		    // ==== callin/callout bindings: ====
 		    Set<IMember> allMembers = getAllMethodsAndFields(target.getJavaElement());
@@ -340,6 +342,7 @@
 		for (Set<IType> value : playedByMap.values()) {
 			collectedRoleTypes.addAll(value);
 			for (IType member : value) {
+				if (submon.isCanceled()) return null;
 				if (member.exists()) {
 					IOTType otType = OTModelManager.getOTElement(member);
 					if (otType != null) {
@@ -379,10 +382,12 @@
 			    															  new IJavaProject[]{member.getJavaProject()}, 
 			    															  new MySubProgressMonitor(monitor, 20));
 			    if (playedByMap == null || playedByMap.isEmpty())
-			    	return;
+			    	return; // no base types or cancelled
 
 			    // collect all roles w/ subroles for use as search scope:
 			    IMember[] allRoleTypes = collectRolesAndSubroles(playedByMap, new MySubProgressMonitor(monitor, 10));
+			    if (monitor.isCanceled())
+			    	return;
 			    
 			    ArrayList<IMember> memberSet = new ArrayList<IMember>(1);
 			    memberSet.add(member);
@@ -401,6 +406,7 @@
 			Map<IMember, Set<IMember>> callinMap = new HashMap<IMember, Set<IMember>>();
 			Map<IMember, Set<IMember>> calloutMap = new HashMap<IMember, Set<IMember>>();
 			searchMemberBindings(memberSet, allRoleTypes, callinMap, calloutMap, new MySubProgressMonitor(monitor, 20));
+			if (monitor.isCanceled()) return;
 			createMarkersFor(target, callinMap, CallinMarker.CALLIN_ID, new MySubProgressMonitor(monitor, 10));
 			createMarkersFor(target, calloutMap, CallinMarker.CALLOUT_ID, new MySubProgressMonitor(monitor, 10));
 		} finally {
@@ -568,6 +574,7 @@
 	        
 	        for (final IType baseType : baseTypes)
 	        {
+	        	if (monitor.isCanceled()) return null;
 	        	try
 	        	{
 		            IProgressMonitor searchMonitor = new SubProgressMonitor(monitor, 1);
@@ -633,6 +640,8 @@
         // given all potential role types, just directly traverse to the callin bindings:
         for (IMember roleMember : allRoleTypes) 
         {
+        	if (monitor.isCanceled()) return;
+        	
 			IOTType otType = OTModelManager.getOTElement((IType)roleMember);
 			if (otType == null || !otType.isRole()) continue;
 			IRoleType roleType = (IRoleType)otType;