/*******************************************************************************
 * 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.internal.provisional.style;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
import org.eclipse.wst.sse.ui.internal.ExtendedConfigurationBuilder;
import org.eclipse.wst.sse.ui.internal.Logger;

public class ReconcilerHighlighter {

	private static final String LINE_STYLE_PROVIDER_EXTENDED_ID = "linestyleprovider"; //$NON-NLS-1$

	private Map fTableOfProviders = null;

	private Map fExtendedProviders = null;

	private ITextViewer fTextViewer = null;

	private final static boolean _trace = Boolean.valueOf(Platform.getDebugOption("org.eclipse.wst.sse.ui/structuredPresentationReconciler")).booleanValue(); //$NON-NLS-1$
	private final static String TRACE_PREFIX = "StructuredPresentationReconciler: "; //$NON-NLS-1$
	private long time0;

	/**
	 * instance for older LineStyleProviders loaded by extension point,
	 * created if needed
	 */
	private CompatibleHighlighter fCompatibleHighlighter = null;

	public void refreshDisplay() {
		if (_trace) {
			time0 = System.currentTimeMillis();
		}
		if (fTextViewer != null)
			fTextViewer.invalidateTextPresentation();
		if (_trace) {
			System.out.println(TRACE_PREFIX + "ReconcilerHighlighter refreshDisplay took " + (System.currentTimeMillis() - time0) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
			System.out.flush();
		}
	}

	/**
	 * Registers a given line style provider for a particular partition type.
	 * If there is already a line style provider registered for this type, the
	 * new line style provider is registered instead of the old one.
	 * 
	 * @param partitionType
	 *            the partition type under which to register
	 * @param the
	 *            line style provider to register, or <code>null</code> to
	 *            remove an existing one
	 */
	public void addProvider(String partitionType, LineStyleProvider provider) {
		getTableOfProviders().put(partitionType, provider);
	}

	public void removeProvider(String partitionType) {
		getTableOfProviders().remove(partitionType);
	}

	public LineStyleProvider getProvider(String partitionType) {
		LineStyleProvider result = (LineStyleProvider) getTableOfProviders().get(partitionType);

		// The provider was not within the default set of providers. Use the
		// extended configuration
		// to look up additional providers
		if (result == null) {
			// NOT YET FINALIZED - DO NOT CONSIDER AS API
			synchronized (getExtendedProviders()) {
				if (!getExtendedProviders().containsKey(partitionType)) {
					result = (LineStyleProvider) ExtendedConfigurationBuilder.getInstance().getConfiguration(LINE_STYLE_PROVIDER_EXTENDED_ID, partitionType);
					getExtendedProviders().put(partitionType, result);

					if (result != null && fTextViewer != null && fTextViewer.getDocument() instanceof IStructuredDocument) {
						if (result instanceof AbstractLineStyleProvider) {
							((AbstractLineStyleProvider) result).init((IStructuredDocument) fTextViewer.getDocument(), this);
						}
						else {
							Logger.log(Logger.INFO_DEBUG, "CompatibleHighlighter installing compatibility for " + result.getClass()); //$NON-NLS-1$
							if (fCompatibleHighlighter == null) {
								fCompatibleHighlighter = new CompatibleHighlighter();
								fCompatibleHighlighter.install(fTextViewer);
							}
							result.init((IStructuredDocument) fTextViewer.getDocument(), fCompatibleHighlighter);
						}
					}
				}
				else {
					result = (LineStyleProvider) getExtendedProviders().get(partitionType);
				}
			}
		}
		return result;
	}

	private Map getTableOfProviders() {
		if (fTableOfProviders == null) {
			fTableOfProviders = new HashMap();
		}
		return fTableOfProviders;
	}

	private Map getExtendedProviders() {
		if (fExtendedProviders == null) {
			fExtendedProviders = new HashMap(3);
		}
		return fExtendedProviders;
	}

	public void install(ITextViewer textViewer) {
		fTextViewer = textViewer;
		if (fCompatibleHighlighter != null) {
			fCompatibleHighlighter.uninstall();
			fCompatibleHighlighter.install(fTextViewer);
		}
		refreshDisplay();
	}

	public void uninstall() {
		Iterator it = getTableOfProviders().values().iterator();

		while (it.hasNext()) {
			LineStyleProvider provider = (LineStyleProvider) it.next();
			if (provider != null)
				provider.release();
		}

		it = getExtendedProviders().values().iterator();
		while (it.hasNext()) {
			LineStyleProvider provider = (LineStyleProvider) it.next();
			if (provider != null)
				provider.release();
		}

		getTableOfProviders().clear();
		getExtendedProviders().clear();
		fTableOfProviders = null;
		if (fCompatibleHighlighter != null) {
			fCompatibleHighlighter.uninstall();
		}
		fTextViewer = null;
	}
}
