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