[124070] [editor] JSPX editor doesn't honor indent with spaces
diff --git a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/StructuredTextViewerConfigurationJSP.java b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/StructuredTextViewerConfigurationJSP.java
index 02d25e1..68b4cbf 100644
--- a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/StructuredTextViewerConfigurationJSP.java
+++ b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/StructuredTextViewerConfigurationJSP.java
@@ -39,17 +39,16 @@
 import org.eclipse.jst.jsp.ui.internal.autoedit.StructuredAutoEditStrategyJSPJava;
 import org.eclipse.jst.jsp.ui.internal.contentassist.JSPStructuredContentAssistProcessor;
 import org.eclipse.jst.jsp.ui.internal.format.FormattingStrategyJSPJava;
+import org.eclipse.jst.jsp.ui.internal.format.StructuredFormattingStrategyJSP;
 import org.eclipse.jst.jsp.ui.internal.preferences.JSPUIPreferenceNames;
 import org.eclipse.jst.jsp.ui.internal.style.LineStyleProviderForJSP;
 import org.eclipse.jst.jsp.ui.internal.style.java.LineStyleProviderForJava;
 import org.eclipse.jst.jsp.ui.internal.style.jspel.LineStyleProviderForJSPEL;
 import org.eclipse.wst.css.core.text.ICSSPartitions;
-import org.eclipse.wst.html.core.internal.format.HTMLFormatProcessorImpl;
 import org.eclipse.wst.html.core.internal.provisional.contenttype.ContentTypeIdForHTML;
 import org.eclipse.wst.html.core.text.IHTMLPartitions;
 import org.eclipse.wst.html.ui.StructuredTextViewerConfigurationHTML;
 import org.eclipse.wst.sse.ui.StructuredTextViewerConfiguration;
-import org.eclipse.wst.sse.ui.internal.format.StructuredFormattingStrategy;
 import org.eclipse.wst.sse.ui.internal.provisional.style.LineStyleProvider;
 import org.eclipse.wst.xml.core.internal.provisional.contenttype.ContentTypeIdForXML;
 import org.eclipse.wst.xml.core.text.IXMLPartitions;
@@ -212,7 +211,7 @@
 			formatter = new MultiPassContentFormatter(getConfiguredDocumentPartitioning(sourceViewer), IXMLPartitions.XML_DEFAULT);
 
 		MultiPassContentFormatter multiFormatter = (MultiPassContentFormatter) formatter;
-		multiFormatter.setMasterStrategy(new StructuredFormattingStrategy(new HTMLFormatProcessorImpl()));
+		multiFormatter.setMasterStrategy(new StructuredFormattingStrategyJSP());
 		multiFormatter.setSlaveStrategy(new FormattingStrategyJSPJava(), IJSPPartitions.JSP_CONTENT_JAVA);
 
 		return formatter;
diff --git a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/JSPUIMessages.java b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/JSPUIMessages.java
index 3b5034e..f3887f5 100644
--- a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/JSPUIMessages.java
+++ b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/JSPUIMessages.java
@@ -108,6 +108,7 @@
 	public static String JSPSourcePreferencePage_0;
 	public static String JSPSourcePreferencePage_1;
 	public static String JSPSourcePreferencePage_2;
+	public static String JSPSourcePreferencePage_format;
 	public static String JSPColorPage_jsp_content;
 	public static String JSPFilesPreferencePage_0;
 	public static String JSPFilesPreferencePage_1;
diff --git a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/JSPUIPluginResources.properties b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/JSPUIPluginResources.properties
index 23c103c..143ddb5 100644
--- a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/JSPUIPluginResources.properties
+++ b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/JSPUIPluginResources.properties
@@ -86,6 +86,7 @@
 JSPSourcePreferencePage_0=JSP Source preferences are based on the content within the JSP.
 JSPSourcePreferencePage_1=See <a>''{0}''</a> for JSP with HTML content.
 JSPSourcePreferencePage_2=See <a>''{0}''</a> for JSP with XML content.
+JSPSourcePreferencePage_format=&Format JSP XML documents as HTML
 JSPColorPage_jsp_content=Scripting Elements
 JSPFilesPreferencePage_0=Validating files
 JSPFilesPreferencePage_1=Validate JSP fragments
diff --git a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/format/StructuredFormattingStrategyJSP.java b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/format/StructuredFormattingStrategyJSP.java
new file mode 100644
index 0000000..b931534
--- /dev/null
+++ b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/format/StructuredFormattingStrategyJSP.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * 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.jst.jsp.ui.internal.format;
+
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.formatter.ContextBasedFormattingStrategy;
+import org.eclipse.jface.text.formatter.FormattingContextProperties;
+import org.eclipse.jface.text.formatter.IFormattingContext;
+import org.eclipse.jst.jsp.ui.internal.JSPUIPlugin;
+import org.eclipse.jst.jsp.ui.internal.preferences.JSPUIPreferenceNames;
+import org.eclipse.wst.html.core.internal.format.HTMLFormatProcessorImpl;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.ui.internal.format.StructuredFormattingStrategy;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
+import org.eclipse.wst.xml.ui.internal.XMLFormattingStrategy;
+
+public class StructuredFormattingStrategyJSP extends ContextBasedFormattingStrategy {
+
+	private static final String XMLNS_ATTR = "xmlns:jsp"; //$NON-NLS-1$
+	private static final String NAMESPACE = "http://java.sun.com/JSP/Page"; //$NON-NLS-1$
+
+	private XMLFormattingStrategy xmlStrategy;
+	private ContextBasedFormattingStrategy htmlStrategy;
+
+	private IDocument fDocument;
+	private ContextBasedFormattingStrategy fStrategy;
+
+	public StructuredFormattingStrategyJSP() {
+		xmlStrategy = new XMLFormattingStrategy();
+		htmlStrategy = new StructuredFormattingStrategy(new HTMLFormatProcessorImpl());
+	}
+	public void formatterStarts(IFormattingContext context) {
+		super.formatterStarts(context);
+		fDocument = (IDocument) context.getProperty(FormattingContextProperties.CONTEXT_MEDIUM);
+		getFormattingStrategy().formatterStarts(context);
+	}
+
+	public void format() {
+		super.format();
+		getFormattingStrategy().format();
+	}
+
+	public void formatterStops() {
+		super.formatterStops();
+		getFormattingStrategy().formatterStops();
+		fDocument = null;
+		fStrategy = null;
+	}
+
+	protected ContextBasedFormattingStrategy getFormattingStrategy() {
+		IDOMModel model = null;
+
+		if(fStrategy != null)
+			return fStrategy;
+
+		if (fDocument == null || JSPUIPlugin.getInstance().getPreferenceStore().getBoolean(JSPUIPreferenceNames.USE_HTML_FORMATTER)) {
+			fStrategy = htmlStrategy;
+		}
+		else {
+			/* Always release the model */
+			model = (IDOMModel) StructuredModelManager.getModelManager().getExistingModelForRead(fDocument);
+			try {
+				String attr = null;
+				
+				/* Check the xmlns:jsp attribute to determine if it is XML content */
+				if(model != null && model.getDocument() != null)
+					attr = model.getDocument().getDocumentElement().getAttribute(XMLNS_ATTR);
+				
+				if(NAMESPACE.equals(attr))
+					fStrategy = xmlStrategy;
+				else
+					fStrategy = htmlStrategy;
+			}
+			finally {
+				if (model != null)
+					model.releaseFromRead();
+			}
+		}
+		return fStrategy;
+	}
+
+}
diff --git a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/preferences/JSPUIPreferenceInitializer.java b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/preferences/JSPUIPreferenceInitializer.java
index 286616a..4b5f60f 100644
--- a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/preferences/JSPUIPreferenceInitializer.java
+++ b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/preferences/JSPUIPreferenceInitializer.java
@@ -112,6 +112,7 @@
 				"org.eclipse.wst.css.ui.proposalCategory.css");
 		store.setDefault(JSPUIPreferenceNames.AUTO_IMPORT_INSERT, true);
 		store.setDefault(JSPUIPreferenceNames.INSERT_SINGLE_SUGGESTION, true);
+		store.setDefault(JSPUIPreferenceNames.USE_HTML_FORMATTER, true);
 	}
 
 }
diff --git a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/preferences/JSPUIPreferenceNames.java b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/preferences/JSPUIPreferenceNames.java
index 6586d4e..5c34ea9 100644
--- a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/preferences/JSPUIPreferenceNames.java
+++ b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/preferences/JSPUIPreferenceNames.java
@@ -184,4 +184,10 @@
 	 * </p>
 	 */
 	public static final String INSERT_SINGLE_SUGGESTION = "insertSingleSuggestion"; //$NON-NLS-1$
+
+	/**
+	 * <p>preference key to store the option for using the HTML formatter with XML-syntax JSPs</p>
+	 * <p>Value is of type <code>boolean</code></p>
+	 */
+	public static final String USE_HTML_FORMATTER = "useHTMLFormatter"; //$NON-NLS-1$
 }
diff --git a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/preferences/ui/JSPSourcePreferencePage.java b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/preferences/ui/JSPSourcePreferencePage.java
index 6176b4d..c252c9c 100644
--- a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/preferences/ui/JSPSourcePreferencePage.java
+++ b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/preferences/ui/JSPSourcePreferencePage.java
@@ -11,11 +11,15 @@
 package org.eclipse.jst.jsp.ui.internal.preferences.ui;
 
 import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.preference.IPreferenceStore;
 import org.eclipse.jface.preference.PreferencePage;
 import org.eclipse.jst.jsp.ui.internal.JSPUIMessages;
+import org.eclipse.jst.jsp.ui.internal.JSPUIPlugin;
+import org.eclipse.jst.jsp.ui.internal.preferences.JSPUIPreferenceNames;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Label;
@@ -27,6 +31,8 @@
 
 public class JSPSourcePreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
 
+	private Button fFormatterButton;
+
 	public void init(IWorkbench workbench) {
 		// do nothing
 	}
@@ -57,6 +63,10 @@
 		data = new GridData(SWT.FILL, SWT.DEFAULT, true, false);
 		data.horizontalIndent = 5;
 		contentTypeArea.getControl().setLayoutData(data);
+		fFormatterButton = new Button(composite, SWT.CHECK);
+		fFormatterButton.setText(JSPUIMessages.JSPSourcePreferencePage_format);
+		fFormatterButton.setSelection(getPreferenceStore().getBoolean(JSPUIPreferenceNames.USE_HTML_FORMATTER));
+
 		return composite;
 	}
 
@@ -77,4 +87,22 @@
 
 		return composite;
 	}
+
+	protected IPreferenceStore doGetPreferenceStore() {
+		return JSPUIPlugin.getInstance().getPreferenceStore();
+	}
+
+	protected void performDefaults() {
+		if (fFormatterButton != null) {
+			fFormatterButton.setSelection(getPreferenceStore().getDefaultBoolean(JSPUIPreferenceNames.USE_HTML_FORMATTER));
+		}
+		super.performDefaults();
+	}
+
+	public boolean performOk() {
+		if (fFormatterButton != null) {
+			getPreferenceStore().setValue(JSPUIPreferenceNames.USE_HTML_FORMATTER, fFormatterButton.getSelection());
+		}
+		return super.performOk();
+	}
 }
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/formatter/DefaultXMLPartitionFormatter.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/formatter/DefaultXMLPartitionFormatter.java
index 9537d42..cc24cc4 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/formatter/DefaultXMLPartitionFormatter.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/formatter/DefaultXMLPartitionFormatter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2011 IBM Corporation and others.
+ * Copyright (c) 2007, 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
@@ -441,7 +441,7 @@
 	private DOMRegion formatRegion(TextEdit edit, Position formatRange, XMLFormattingConstraints parentConstraints, DOMRegion domRegion, IStructuredDocumentRegion previousRegion) {
 		IStructuredDocumentRegion currentRegion = domRegion.documentRegion;
 		String regionType = currentRegion.getType();
-		if (DOMRegionContext.XML_TAG_NAME.equals(regionType)) {
+		if (DOMRegionContext.XML_TAG_NAME.equals(regionType) || "JSP_ROOT_TAG_NAME".equals(regionType) || "JSP_DIRECTIVE_NAME".equals(regionType)) {
 			ITextRegion textRegion = currentRegion.getFirstRegion();
 			String textRegionType = textRegion.getType();
 			if (DOMRegionContext.XML_TAG_OPEN.equals(textRegionType)) {