Fix for Bug 331866 -  [ui] Show when callin marker creator is waiting for java indexes
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 c41fcb8..27d2309 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
@@ -1,7 +1,7 @@
 /**********************************************************************
  * This file is part of "Object Teams Development Tooling"-Software
  * 
- * Copyright 2003, 2008 Fraunhofer Gesellschaft, Munich, Germany,
+ * Copyright 2003, 2010 Fraunhofer Gesellschaft, Munich, Germany,
  * for its Fraunhofer Institute for Computer Architecture and Software
  * Technology (FIRST), Berlin, Germany and Technical University Berlin,
  * Germany.
@@ -52,9 +52,11 @@
 import org.eclipse.jdt.core.JavaModelException;
 import org.eclipse.jdt.core.search.IJavaSearchConstants;
 import org.eclipse.jdt.core.search.IJavaSearchScope;
+import org.eclipse.jdt.core.search.SearchEngine;
 import org.eclipse.jdt.core.search.SearchMatch;
 import org.eclipse.jdt.core.search.SearchPattern;
 import org.eclipse.jdt.core.search.SearchRequestor;
+import org.eclipse.jdt.core.search.TypeNameRequestor;
 import org.eclipse.jdt.internal.ui.javaeditor.IClassFileEditorInput;
 import org.eclipse.jface.action.IStatusLineManager;
 import org.eclipse.jface.preference.IPreferenceStore;
@@ -102,6 +104,7 @@
     private Set<IClassFile> m_cachedMarkersForJavaElements = new HashSet<IClassFile>();
     private boolean m_enabled = false;
     protected AnnotationHelper annotationHelper;
+    private boolean isInitialized = false;
 
 	/**
 	 * Typical usage:
@@ -793,7 +796,47 @@
 		}
     }
 
-    protected void schedule(final CallinMarkerJob job, IStatusLineManager statusLine)
+    /** chained scheduling:<ul>
+     *  <li> first wait until the indexes are ready (only on first invocation),
+     *  <li> only then schedule our job.
+     */
+    protected synchronized void schedule(final CallinMarkerJob job, final IStatusLineManager statusLine)
+    {
+    	if (this.isInitialized) {
+    		doSchedule(job, statusLine);
+    		return;
+    	} else {
+    		this.isInitialized = true;
+    		Job waitForIndex = new Job(OTDTUIPlugin.getResourceString("CallinMarkerCreator2.wait_for_index_message")) { //$NON-NLS-1$
+    			@Override
+    			protected IStatus run(IProgressMonitor monitor) {
+    				try {
+    					// dummy query for waiting until the indexes are ready (see AbstractJavaModelTest)
+						new SearchEngine().searchAllTypeNames(
+								null,
+								SearchPattern.R_EXACT_MATCH,
+								"!@$#!@".toCharArray(), //$NON-NLS-1$
+								SearchPattern.R_PATTERN_MATCH | SearchPattern.R_CASE_SENSITIVE,
+								IJavaSearchConstants.CLASS,
+								SearchEngine.createWorkspaceScope(),
+								new TypeNameRequestor() {
+									public void acceptType(int modifiers,char[] packageName,char[] simpleTypeName,char[][] enclosingTypeNames,String path) {}
+								},
+								IJavaSearchConstants.WAIT_UNTIL_READY_TO_SEARCH,
+								null);
+					} catch (CoreException e) {
+					} finally {
+						// chaining:
+						doSchedule(job, statusLine);
+					}
+					return Status.OK_STATUS;
+    			}
+    		};
+    		waitForIndex.setPriority(Job.DECORATE);
+    		waitForIndex.schedule(100);
+    	}    	
+    }
+    protected void doSchedule(final CallinMarkerJob job, IStatusLineManager statusLine)
     {
         job.addJobChangeListener(new JobListener(statusLine) {
             protected void jobFinished(int status) {
diff --git a/plugins/org.eclipse.objectteams.otdt.ui/src/org/eclipse/objectteams/otdt/ui/OTDTUIPlugin.java b/plugins/org.eclipse.objectteams.otdt.ui/src/org/eclipse/objectteams/otdt/ui/OTDTUIPlugin.java
index a0f1414..fb57345 100644
--- a/plugins/org.eclipse.objectteams.otdt.ui/src/org/eclipse/objectteams/otdt/ui/OTDTUIPlugin.java
+++ b/plugins/org.eclipse.objectteams.otdt.ui/src/org/eclipse/objectteams/otdt/ui/OTDTUIPlugin.java
@@ -23,8 +23,6 @@
 import java.util.MissingResourceException;
 import java.util.ResourceBundle;
 
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.IAdapterManager;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Platform;
diff --git a/plugins/org.eclipse.objectteams.otdt.ui/src/org/eclipse/objectteams/otdt/ui/OTPluginResources.properties b/plugins/org.eclipse.objectteams.otdt.ui/src/org/eclipse/objectteams/otdt/ui/OTPluginResources.properties
index 0e1a817..2844d19 100644
--- a/plugins/org.eclipse.objectteams.otdt.ui/src/org/eclipse/objectteams/otdt/ui/OTPluginResources.properties
+++ b/plugins/org.eclipse.objectteams.otdt.ui/src/org/eclipse/objectteams/otdt/ui/OTPluginResources.properties
@@ -62,6 +62,7 @@
 CallinMarkerCreator2.search_failed_message=Searching for bound base methods failed -- no markers will be shown.
 CallinMarkerCreator2.search_canceled_message=Searching for bound base methods canceled -- no markers will be shown.
 CallinMarkerCreator2.line_number_error_message=Cannot compute line number for callin marker
+CallinMarkerCreator2.wait_for_index_message=OTDT Waiting for Java Indexes
 
 #Team activation tab:
 TeamConfig.tab_title=Team Activation