/*******************************************************************************
 * Copyright (c) 2008 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.wst.sse.ui;

import org.eclipse.ui.editors.text.DefaultEncodingSupport;
import org.eclipse.ui.editors.text.IEncodingSupport;
import org.eclipse.ui.texteditor.StatusTextEditor;
import org.eclipse.wst.sse.ui.internal.ExtendedConfigurationBuilder;

/**
 * An implementation that will try to use a <b>provisional</b> configuration
 * if IEncodingSupport.class as a delegate. A delegate, if found, will be
 * asked for encoding information before defaulting to the superclass
 * implementation, but will be told to set the encoding after the superclass
 * has. Delegates should not duplicate any functionality in the
 * DefaultEncodingSupport implementation.
 */
class EncodingSupport extends DefaultEncodingSupport {
	private String[] fConfigurationPoints = null;
	/** The editor this support is associated with. */
	private StatusTextEditor fStatusTextEditor;

	IEncodingSupport fSupportDelegate = null;

	EncodingSupport(String[] configurationPoints) {
		super();
		fConfigurationPoints = configurationPoints;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.editors.text.DefaultEncodingSupport#dispose()
	 */
	public void dispose() {
		super.dispose();

		if (fSupportDelegate instanceof DefaultEncodingSupport) {
			((DefaultEncodingSupport) fSupportDelegate).dispose();
		}
		fSupportDelegate = null;
		fStatusTextEditor = null;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @seeorg.eclipse.ui.editors.text.DefaultEncodingSupport#
	 * getDefaultEncoding()
	 */
	public String getDefaultEncoding() {
		IEncodingSupport delegate = getEncodingSupportDelegate();
		if (delegate != null) {
			return delegate.getDefaultEncoding();
		}

		return super.getDefaultEncoding();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.editors.text.DefaultEncodingSupport#getEncoding ()
	 */
	public String getEncoding() {
		IEncodingSupport delegate = getEncodingSupportDelegate();
		if (delegate != null) {
			return delegate.getEncoding();
		}

		return super.getEncoding();
	}

	IEncodingSupport getEncodingSupportDelegate() {
		if (fSupportDelegate == null) {
			ExtendedConfigurationBuilder builder = ExtendedConfigurationBuilder.getInstance();
			for (int i = 0; fSupportDelegate == null && i < fConfigurationPoints.length; i++) {
				fSupportDelegate = (IEncodingSupport) builder.getConfiguration(IEncodingSupport.class.getName(), fConfigurationPoints[i]);
			}
		}
		return fSupportDelegate;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.eclipse.ui.editors.text.DefaultEncodingSupport#initialize(org.eclipse
	 * .ui.texteditor.StatusTextEditor)
	 */
	public void initialize(StatusTextEditor textEditor) {
		super.initialize(textEditor);
		fStatusTextEditor = textEditor;

		IEncodingSupport encodingSupportDelegate = getEncodingSupportDelegate();
		if (encodingSupportDelegate instanceof DefaultEncodingSupport) {
			((DefaultEncodingSupport) encodingSupportDelegate).initialize(textEditor);
		}
	}

	void reinitialize(String[] configurationPoints) {
		if (fSupportDelegate instanceof DefaultEncodingSupport) {
			((DefaultEncodingSupport) fSupportDelegate).dispose();
		}
		fSupportDelegate = null;

		fConfigurationPoints = configurationPoints;

		IEncodingSupport encodingSupportDelegate = getEncodingSupportDelegate();
		if (encodingSupportDelegate instanceof DefaultEncodingSupport) {
			((DefaultEncodingSupport) encodingSupportDelegate).initialize(fStatusTextEditor);
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.editors.text.DefaultEncodingSupport#setEncoding
	 * (java.lang.String, boolean)
	 */
	protected void setEncoding(String encoding, boolean overwrite) {
		super.setEncoding(encoding, overwrite);

		IEncodingSupport delegate = getEncodingSupportDelegate();
		if (delegate != null && overwrite) {
			delegate.setEncoding(encoding);
		}
	}
}
