/*******************************************************************************
 * Copyright (c) 2001, 2006 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
 *     Jens Lukowski/Innoopract - initial renaming/restructuring
 *     
 *******************************************************************************/
package org.eclipse.wst.sse.ui.internal.openon;



import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITypedRegion;
import org.eclipse.jface.text.TextUtilities;
import org.eclipse.wst.sse.core.StructuredModelManager;
import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredPartitioning;


/**
 * Determines the appropriate IOpenOn to call based on current partition.
 * 
 * @deprecated Use base support for hyperlink navigation
 */
public class OpenOnProvider {
	private static OpenOnProvider fInstance;

	/**
	 * returns singleton instance of OpenOnProvider
	 * 
	 * @return OpenOnProvider
	 */
	public synchronized static OpenOnProvider getInstance() {
		if (fInstance == null) {
			fInstance = new OpenOnProvider();
		}
		return fInstance;
	}


	/**
	 * Returns the content type of document
	 * 
	 * @param document -
	 *            assumes document is not null
	 * @return String content type of given document
	 */
	protected String getContentType(IDocument document) {
		String type = null;

		IModelManager mgr = StructuredModelManager.getModelManager();
		IStructuredModel model = null;
		try {
			model = mgr.getExistingModelForRead(document);
			if (model != null) {
				type = model.getContentTypeIdentifier();
			}
		}
		finally {
			if (model != null) {
				model.releaseFromRead();
			}
		}
		return type;
	}

	/**
	 * Returns the appropriate IOpenOn for the current partition
	 * 
	 * @return
	 */
	public IOpenOn getOpenOn(IDocument document, int offset) {
		IOpenOn openOn = null;

		// determine the current partition
		if (document != null) {
			String contentTypeID = getContentType(document);
			String partitionType = getPartitionType(document, offset);

			IContentType contentType = Platform.getContentTypeManager().getContentType(contentTypeID);

			while (openOn == null && contentType != null) {
				// Query OpenOnBuilder and get the list of OpenOns for the
				// current partition
				OpenOnDefinition[] defs = OpenOnBuilder.getInstance().getOpenOnDefinitions(contentType.getId(), partitionType);
				contentType = contentType.getBaseType();

				// If more than 1 openon is returned, need to further check
				// which OpenOn is the appropriate one to return
				// for now just returning the first one
				if (defs != null && defs.length > 0) {
					openOn = defs[0].createOpenOn();
				}
			}
		}

		return openOn;
	}

	/**
	 * Returns the partition type located at offset in the document
	 * 
	 * @param document -
	 *            assumes document is not null
	 * @param offset
	 * @return String partition type
	 */
	protected String getPartitionType(IDocument document, int offset) {
		String type = null;
		try {
			// TODO: provide partitioning information so we're not using a default like this
			if (document instanceof IStructuredDocument) {
				type = TextUtilities.getContentType(document, IStructuredPartitioning.DEFAULT_STRUCTURED_PARTITIONING, offset, false);
			}
		}
		catch (BadLocationException e1) {
		}
		finally {
			if (type == null) {
				try {
					ITypedRegion region = document.getPartition(offset);
					if (region != null) {
						type = region.getType();
					}
				}
				catch (BadLocationException e) {
					type = null;
				}
			}
		}
		return type;
	}
}
