diff options
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/formatting/AndroidXmlFormatter.java')
-rw-r--r-- | eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/formatting/AndroidXmlFormatter.java | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/formatting/AndroidXmlFormatter.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/formatting/AndroidXmlFormatter.java new file mode 100644 index 000000000..403095450 --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/formatting/AndroidXmlFormatter.java @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Eclipse Public License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.eclipse.org/org/documents/epl-v10.php + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.ide.eclipse.adt.internal.editors.formatting; + +import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs; + +import org.eclipse.jface.text.BadLocationException; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.IRegion; +import org.eclipse.jface.text.TypedPosition; +import org.eclipse.jface.text.formatter.FormattingContext; +import org.eclipse.jface.text.formatter.FormattingContextProperties; +import org.eclipse.jface.text.formatter.IContentFormatter; +import org.eclipse.jface.text.formatter.IContentFormatterExtension; +import org.eclipse.jface.text.formatter.IFormattingContext; +import org.eclipse.jface.text.formatter.IFormattingStrategy; +import org.eclipse.wst.xml.core.text.IXMLPartitions; + +/** + * Formatter which replaces the Eclipse formatter for the Android XML editors, and + * delegates to it if the user has chosen to use the Eclipse formatter instead by turning + * off {@link AdtPrefs#getUseCustomXmlFormatter()} + */ +public class AndroidXmlFormatter implements IContentFormatter, IContentFormatterExtension { + @Override + public final void format(IDocument document, IRegion region) { + /** + * This method is probably not going to be called. It is part of the + * {@link IContentFormatter} but since we also implement + * {@link IContentFormatterExtension} Eclipse should /* be calling + * {@link #format(IDocument,IFormattingContext)} instead. However, for + * completeness (and because other implementations of {@link IContentFormatter} + * also do this we might as well make the method behave correctly + */ + FormattingContext context = new FormattingContext(); + context.setProperty(FormattingContextProperties.CONTEXT_DOCUMENT, Boolean.FALSE); + context.setProperty(FormattingContextProperties.CONTEXT_REGION, region); + + format(document, context); + } + + @Override + public IFormattingStrategy getFormattingStrategy(String contentType) { + return new AndroidXmlFormattingStrategy(); + } + + @Override + public void format(IDocument document, IFormattingContext context) { + context.setProperty(FormattingContextProperties.CONTEXT_MEDIUM, document); + formatMaster(context, document, 0, document.getLength()); + } + + protected void formatMaster(IFormattingContext context, IDocument document, int offset, + int length) { + try { + final int delta= offset - document.getLineInformationOfOffset(offset).getOffset(); + offset -= delta; + length += delta; + } catch (BadLocationException exception) { + // Do nothing + } + + AndroidXmlFormattingStrategy strategy = new AndroidXmlFormattingStrategy(); + context.setProperty(FormattingContextProperties.CONTEXT_PARTITION, + new TypedPosition(offset, length, IXMLPartitions.XML_DEFAULT)); + strategy.formatterStarts(context); + strategy.format(); + strategy.formatterStops(); + } +} |