/*******************************************************************************
 * Copyright (c) 2004, 2013 John-Mason P. Shackelford 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:
 *     John-Mason P. Shackelford - initial API and implementation
 * 	   IBM Corporation - bug 52076
 *******************************************************************************/

package org.eclipse.ant.internal.ui.editor.formatter;

import java.util.LinkedList;

import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.TextUtilities;
import org.eclipse.jface.text.formatter.ContextBasedFormattingStrategy;
import org.eclipse.jface.text.formatter.FormattingContextProperties;
import org.eclipse.jface.text.formatter.IFormattingContext;

public class XmlDocumentFormattingStrategy extends ContextBasedFormattingStrategy {

	/** Documents to be formatted by this strategy */
	private final LinkedList<IDocument> fDocuments = new LinkedList<IDocument>();

	/** access to the preferences store * */
	private FormattingPreferences prefs;

	private int indent = -1;

	public XmlDocumentFormattingStrategy() {
		this.prefs = new FormattingPreferences();
	}

	public XmlDocumentFormattingStrategy(FormattingPreferences prefs, int indent) {
		Assert.isNotNull(prefs);
		this.prefs = prefs;
		this.indent = indent;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jface.text.formatter.IFormattingStrategyExtension#format()
	 */
	@Override
	public void format() {

		super.format();
		final IDocument document = fDocuments.removeFirst();
		if (document != null) {
			// allow formatting of regions, not just the entire document; bug 75611
			String documentText = document.get();
			XmlDocumentFormatter formatter = new XmlDocumentFormatter();
			if (indent != -1) {
				formatter.setInitialIndent(indent);
			}
			formatter.setDefaultLineDelimiter(TextUtilities.getDefaultLineDelimiter(document));
			String formattedText = formatter.format(documentText, this.prefs);
			if (formattedText != null && !formattedText.equals(documentText)) {
				document.set(formattedText);
			}
		}
	}

	/*
	 * @see org.eclipse.jface.text.formatter.ContextBasedFormattingStrategy#formatterStarts(org.eclipse.jface.text.formatter.IFormattingContext)
	 */
	@Override
	public void formatterStarts(final IFormattingContext context) {
		super.formatterStarts(context);
		fDocuments.addLast((IDocument) context.getProperty(FormattingContextProperties.CONTEXT_MEDIUM));
	}

	/*
	 * @see org.eclipse.jface.text.formatter.ContextBasedFormattingStrategy#formatterStops()
	 */
	@Override
	public void formatterStops() {
		super.formatterStops();

		fDocuments.clear();
	}
}