Bug 538943: [SourceEditor] Add workarounds for bug 94106 and bug 512251
to fix hiding of context information popups

Change-Id: Iedfe0cc1873bcde16095242e3553842975f699a8
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/ContentAssist.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/ContentAssist.java
index 7627979..05459de 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/ContentAssist.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/ContentAssist.java
@@ -14,6 +14,8 @@
 
 package org.eclipse.statet.ltk.ui.sourceediting.assist;
 
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
 import org.eclipse.jface.bindings.keys.KeySequence;
 import org.eclipse.jface.text.ITextViewer;
 import org.eclipse.jface.text.contentassist.ContentAssistEvent;
@@ -25,11 +27,14 @@
 import org.eclipse.jface.text.contentassist.IContextInformation;
 import org.eclipse.jface.text.contentassist.IContextInformationValidator;
 import org.eclipse.osgi.util.NLS;
+import org.eclipse.ui.statushandlers.StatusManager;
 import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;
 
 import org.eclipse.statet.ecommons.ui.SharedMessages;
 import org.eclipse.statet.ecommons.ui.workbench.WorkbenchUIUtils;
 
+import org.eclipse.statet.internal.ltk.ui.LTKUIPlugin;
+
 
 /**
  * LTK content assistant.
@@ -214,8 +219,27 @@
 		return super.isContextInfoPopupActive();
 	}
 	
-	void hidePopups() {
-		super.hide();
+	public void hidePopups() {
+		hide();
+	}
+	
+	@Override
+	protected void hide() {
+		// Workaround for bug 94106 (-> loop) and bug 512251 (-> catch exception) in Platform Text
+		try {
+			super.hide();
+		}
+		catch (final RuntimeException e) {
+			StatusManager.getManager().handle(new Status(IStatus.ERROR, LTKUIPlugin.BUNDLE_ID,
+					"An error occurred when hiding content assistant.", e ));
+		}
+		
+		for (int counter= 0; counter < 100 && isContextInfoPopupActive(); counter++) {
+			try {
+				super.hide();
+			}
+			catch (final RuntimeException e) {}
+		}
 	}
 	
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/ContentAssistProcessor.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/ContentAssistProcessor.java
index 2cf49a5..c77e105 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/ContentAssistProcessor.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/ContentAssistProcessor.java
@@ -470,11 +470,6 @@
 		final IAssistCompletionProposal[] result= filterAndSortCompletionProposals(proposals,
 				context, m.newChild(1) );
 		
-		if (result.length > 1
-				&& assistant.isContextInfoPopupActive1()
-				&& !assistant.isProposalPopupActive1()) {
-			assistant.hidePopups();
-		}
 		if (modificationStamp != 0) {
 			this.informationModeOffset= context.getInvocationOffset();
 			this.informationModeTimestamp= System.nanoTime();