[312381] [ui] Smart Insert Close Element functionality (automatic insertion of ending tags) does not work as expected when StructuredTextViewer is embedded in a dialog for editing XML code
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/text/StructuredAutoEditStrategy.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/text/StructuredAutoEditStrategy.java
new file mode 100644
index 0000000..4a5a31b
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/text/StructuredAutoEditStrategy.java
@@ -0,0 +1,78 @@
+/*******************************************************************************

+ * Copyright (c) 2012 IBM Corporation 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:

+ *     IBM Corporation - initial API and implementation

+ *******************************************************************************/

+package org.eclipse.wst.sse.ui.internal.text;

+

+import org.eclipse.jface.text.IAutoEditStrategy;

+import org.eclipse.jface.text.IDocument;

+import org.eclipse.ui.IEditorPart;

+import org.eclipse.ui.IWorkbenchPage;

+import org.eclipse.ui.IWorkbenchWindow;

+import org.eclipse.ui.PlatformUI;

+import org.eclipse.ui.texteditor.IDocumentProvider;

+import org.eclipse.ui.texteditor.ITextEditor;

+import org.eclipse.ui.texteditor.ITextEditorExtension3;

+

+/**

+ * Abstract class providing functionality to verify if a document supports

+ * the smart insert mode.

+ *

+ */

+public abstract class StructuredAutoEditStrategy implements IAutoEditStrategy {

+

+	/**

+	 * Evaluates if the document should support smart insert mode

+	 * @param document the document being edited

+	 * @return false if the document belongs to an active editor whose smart insert mode is disabled; otherwise, true.

+	 */

+	protected boolean supportsSmartInsert(IDocument document) {

+		Object editor = getActiveTextEditor();

+		if (editor instanceof ITextEditor) {

+			ITextEditor textEditor = (ITextEditor) editor;

+			final IDocumentProvider provider = textEditor.getDocumentProvider();

+			if (provider != null) {

+				if (document == provider.getDocument(textEditor.getEditorInput())) {

+					// Document belongs to the active editor

+					if (!((textEditor instanceof ITextEditorExtension3) && (((ITextEditorExtension3) textEditor).getInsertMode() == ITextEditorExtension3.SMART_INSERT))) {

+						return false;

+					}

+				}

+			}

+		}

+		return true;

+	}

+

+	/**

+	 * Return the active text editor if possible, otherwise the active editor

+	 * part.

+	 * 

+	 * @return Object

+	 */

+	private Object getActiveTextEditor() {

+		IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();

+		if (window != null) {

+			IWorkbenchPage page = window.getActivePage();

+			if (page != null) {

+				IEditorPart editor = page.getActiveEditor();

+				if (editor != null) {

+					if (editor instanceof ITextEditor) {

+						return editor;

+					}

+					ITextEditor textEditor = (ITextEditor) editor.getAdapter(ITextEditor.class);

+					if (textEditor != null) {

+						return textEditor;

+					}

+					return editor;

+				}

+			}

+		}

+		return null;

+	}

+}