| /* |
| * 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(); |
| } |
| } |