Revert "Bug 320672 - [WorkbenchParts] [Compatibility] SWTException when activating an editor with stale content"

This reverts commit 919a0022e6f90d59d48982a7e42141187fc5c594.

Change-Id: I3cde4056b10acd792362004259e98ecb663696f0
diff --git a/org.eclipse.ui.workbench.texteditor.tests/META-INF/MANIFEST.MF b/org.eclipse.ui.workbench.texteditor.tests/META-INF/MANIFEST.MF
index 54d7943..4a1e176 100644
--- a/org.eclipse.ui.workbench.texteditor.tests/META-INF/MANIFEST.MF
+++ b/org.eclipse.ui.workbench.texteditor.tests/META-INF/MANIFEST.MF
@@ -15,10 +15,6 @@
  org.eclipse.ui.workbench.texteditor;bundle-version="[3.5.0,4.0.0)",
  org.eclipse.ui;bundle-version="[3.5.0,4.0.0)",
  org.junit;bundle-version="4.12.0",
- org.eclipse.text.tests;bundle-version="[3.5.0,4.0.0)",
- org.eclipse.ui.editors;bundle-version="3.11.0",
- org.eclipse.core.filesystem;bundle-version="1.7.0",
- org.eclipse.ui.ide;bundle-version="3.13.0",
- org.eclipse.e4.ui.model.workbench;bundle-version="1.3.0"
+ org.eclipse.text.tests;bundle-version="[3.5.0,4.0.0)"
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Eclipse-BundleShape: dir
diff --git a/org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/workbench/texteditor/tests/StatusEditorTest.java b/org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/workbench/texteditor/tests/StatusEditorTest.java
deleted file mode 100644
index 0302e62..0000000
--- a/org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/workbench/texteditor/tests/StatusEditorTest.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2017 Vasili Gulevich and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *      Vasili Gulevich <vasili.gulevich@xored.com> - initial implementation
- *      Andrey Loskutov <loskutov@gmx.de> - polishing and integration
- *******************************************************************************/
-package org.eclipse.ui.workbench.texteditor.tests;
-
-import java.lang.reflect.Method;
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-import org.eclipse.swt.custom.CTabFolder;
-import org.eclipse.swt.widgets.Display;
-
-import org.eclipse.core.filesystem.EFS;
-
-import org.eclipse.core.runtime.ILog;
-import org.eclipse.core.runtime.ILogListener;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.ide.FileStoreEditorInput;
-import org.eclipse.ui.internal.PartSite;
-
-import org.eclipse.ui.texteditor.AbstractTextEditor;
-import org.eclipse.ui.texteditor.IDocumentProvider;
-
-import org.eclipse.ui.editors.text.EditorsUI;
-import org.eclipse.ui.editors.text.ForwardingDocumentProvider;
-import org.eclipse.ui.editors.text.TextEditor;
-
-public class StatusEditorTest {
-	private IWorkbenchWindow window;
-	private Display display;
-	private IWorkbenchPage page;
-
-	@Before
-	public void before() throws WorkbenchException {
-		window = PlatformUI.getWorkbench().openWorkbenchWindow(null);
-		display = window.getShell().getDisplay();
-		page = window.getActivePage();
-		processEvents();
-	}
-
-	@After
-	public void after() {
-		window.close();
-		page = null;
-		processEvents();
-	}
-
-	/*
-	 * https://bugs.eclipse.org/bugs/attachment.cgi?bugid=320672
-	 * 
-	 * No exceptions are thrown when a status editor displaying an erroneous status is activated with a mouse click. 
-	 * @throws Exception 
-	 */
-	@Test
-	public void doNotThrowOnActivationInStale() throws Exception {
-		IEditorPart editor1 = openNonExistentFile(page, new URI("file:/1.txt"));
-		openNonExistentFile(page, new URI("file:/2.txt"));
-		ILog log = Platform.getLog(Platform.getBundle("org.eclipse.e4.ui.workbench"));
-		List<String> logEvents = new ArrayList<>();
-		ILogListener listener = (status, plugin) -> logEvents.add(status.toString());
-		log.addLogListener(listener);
-		// Clicks are not equivalent to activation from API, so we need this
-		// hack to imitate tab clicks.
-		CTabFolder folder = (CTabFolder) (((PartSite) editor1.getSite()).getModel().getParent().getWidget());
-		try {
-			folder.setSelection(0);
-			processEvents();
-			folder.setSelection(1);
-			processEvents();
-		} finally {
-			log.removeLogListener(listener);
-		}
-		if(!logEvents.isEmpty()) {
-			Assert.assertEquals("Unexpected errors logged", "", logEvents.toString());
-		}
-	}
-
-	private void processEvents() {
-		while (display.readAndDispatch()) {
-			//
-		}
-	}
-
-	private IEditorPart openNonExistentFile(IWorkbenchPage page1, URI uri) throws Exception {
-		FileStoreEditorInput input = new FileStoreEditorInput(EFS.getStore(uri));
-		TextEditor editor = (TextEditor) page1.openEditor(input, EditorsUI.DEFAULT_TEXT_EDITOR_ID, true);
-		Method setMethod= AbstractTextEditor.class.getDeclaredMethod("setDocumentProvider", IDocumentProvider.class);
-		setMethod.setAccessible(true);
-		setMethod.invoke(editor, new ErrorDocumentProvider(editor.getDocumentProvider()));
-		editor.setInput(input);
-		processEvents();
-		return editor;
-	}
-
-	private static class ErrorDocumentProvider extends ForwardingDocumentProvider {
-		public ErrorDocumentProvider(IDocumentProvider parent) {
-			super("", ignored -> { /**/	}, parent);
-		}
-
-		@Override
-		public IStatus getStatus(Object element) {
-			return new Status(IStatus.ERROR, "org.eclipse.ui.workbench.texteditor.tests", 
-					0, "This document provider always fails", null);
-		}
-	}
-}
diff --git a/org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/workbench/texteditor/tests/WorkbenchTextEditorTestSuite.java b/org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/workbench/texteditor/tests/WorkbenchTextEditorTestSuite.java
index 01a8a8e..ec8d266 100644
--- a/org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/workbench/texteditor/tests/WorkbenchTextEditorTestSuite.java
+++ b/org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/workbench/texteditor/tests/WorkbenchTextEditorTestSuite.java
@@ -33,8 +33,7 @@
 		ChangeRegionTest.class,
 		RulerTestSuite.class,
 		HunkComputerTest.class,
-		ScreenshotTest.class,
-		StatusEditorTest.class
+		ScreenshotTest.class
 })
 public class WorkbenchTextEditorTestSuite {
 	// see @SuiteClasses
diff --git a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/StatusTextEditor.java b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/StatusTextEditor.java
index 28131c4..5cd1851 100644
--- a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/StatusTextEditor.java
+++ b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/StatusTextEditor.java
@@ -23,7 +23,6 @@
 import org.eclipse.core.runtime.IStatus;
 
 import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.PlatformUI;
 
 
 /**
@@ -40,11 +39,6 @@
 	private Composite fDefaultComposite;
 	/** The status page */
 	private Control fStatusControl;
-	/** {@link #setFocus()} is still running */
-	private boolean setFocusIsRunning;
-
-	// No .options for plugin yet
-	private static final boolean DEBUG = false;
 
 	/*
 	 * @see org.eclipse.ui.texteditor.AbstractTextEditor.createPartControl(Composite)
@@ -70,13 +64,6 @@
 	 * @param input the input whose status is checked
 	 */
 	public void updatePartControl(IEditorInput input) {
-		final String where = "updatePartControl"; //$NON-NLS-1$
-		if (setFocusIsRunning) {
-			trace(where, "ERROR: trying to call update while processing focus", fStatusControl); //$NON-NLS-1$
-		} else {
-			trace(where, "START", fStatusControl); //$NON-NLS-1$
-		}
-
 		boolean restoreFocus= false;
 
 		if (fStatusControl != null) {
@@ -84,7 +71,6 @@
 				restoreFocus= containsFocus(fStatusControl);
 			}
 			fStatusControl.dispose();
-			trace(where, "status control disposed", fStatusControl); //$NON-NLS-1$
 			fStatusControl= null;
 		}
 
@@ -97,7 +83,6 @@
 					front= fDefaultComposite;
 				} else {
 					fStatusControl= createStatusControl(fParent, status);
-					trace(where, "status control created", fStatusControl); //$NON-NLS-1$
 					front= fStatusControl;
 				}
 			}
@@ -112,7 +97,6 @@
 		if (restoreFocus && fStatusControl != null && !containsFocus(fStatusControl)) {
 			fParent.setFocus();
 		}
-		trace(where, "END", fStatusControl); //$NON-NLS-1$
 	}
 
 	private boolean containsFocus(Control control) {
@@ -128,14 +112,6 @@
 
 	@Override
 	public void setFocus() {
-		final String where = "setFocus"; //$NON-NLS-1$
-		if (setFocusIsRunning) {
-			trace(where, "ERROR: trying to call setFocus while processing focus", fStatusControl); //$NON-NLS-1$
-		} else {
-			trace(where, "START", fStatusControl); //$NON-NLS-1$
-		}
-		setFocusIsRunning = true;
-
 		if (fStatusControl != null && !fStatusControl.isDisposed()) {
 			/* even if the control does not really take focus, we still have to set it
 			 * to fulfill the contract and to make e.g. Ctrl+PageUp/Down work. */
@@ -143,10 +119,6 @@
 		} else {
 			super.setFocus();
 		}
-
-		setFocusIsRunning = false;
-
-		trace(where, "END", fStatusControl); //$NON-NLS-1$
 	}
 
 	@Override
@@ -255,59 +227,37 @@
 	@Override
 	protected void doSetInput(IEditorInput input) throws CoreException {
 		super.doSetInput(input);
-		updatePartControl();
+		if (fParent != null && !fParent.isDisposed())
+			updatePartControl(getEditorInput());
 	}
 
 	@Override
 	public void doRevertToSaved() {
 		// http://dev.eclipse.org/bugs/show_bug.cgi?id=19014
 		super.doRevertToSaved();
-		updatePartControl();
+		if (fParent != null && !fParent.isDisposed())
+			updatePartControl(getEditorInput());
 	}
 
 	@Override
 	protected void sanityCheckState(IEditorInput input) {
 		// http://dev.eclipse.org/bugs/show_bug.cgi?id=19014
 		super.sanityCheckState(input);
-		if (!setFocusIsRunning) {
-			updatePartControl();
-		} else {
-			trace("sanityCheck", "delaying update", fStatusControl); //$NON-NLS-1$ //$NON-NLS-2$
-			PlatformUI.getWorkbench().getDisplay().asyncExec(() -> {
-				trace("sanityCheck", "incoming update", fStatusControl); //$NON-NLS-1$ //$NON-NLS-2$
-				updatePartControl();
-			});
-		}
+		if (fParent != null && !fParent.isDisposed())
+			updatePartControl(getEditorInput());
 	}
 
 	@Override
 	protected void handleEditorInputChanged() {
 		super.handleEditorInputChanged();
-		updatePartControl();
+		if (fParent != null && !fParent.isDisposed())
+			updatePartControl(getEditorInput());
 	}
 
 	@Override
 	protected void handleElementContentReplaced() {
 		super.handleElementContentReplaced();
-		updatePartControl();
-	}
-
-	private void updatePartControl() {
-		if (fParent != null && !fParent.isDisposed()) {
+		if (fParent != null && !fParent.isDisposed())
 			updatePartControl(getEditorInput());
-		}
-	}
-
-	private static void trace(String where, String what, Control o) {
-		if (!DEBUG) {
-			return;
-		}
-		String id;
-		if (o == null) {
-			id = "null"; //$NON-NLS-1$
-		} else {
-			id = System.identityHashCode(o) + (o.isDisposed() ? "<disposed!>" : ""); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		System.out.println(where + " |" + id + "| " + what); //$NON-NLS-1$//$NON-NLS-2$
 	}
 }