/*******************************************************************************
 * Copyright (c) 2003, 2005 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.ui.navigator.internal.extensions;

import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.osgi.util.NLS;
import org.eclipse.ui.WorkbenchException;
import org.eclipse.ui.navigator.CommonActionProvider;
import org.eclipse.ui.navigator.INavigatorViewerDescriptor;
import org.eclipse.ui.navigator.NavigatorActionService;
import org.eclipse.ui.navigator.internal.CommonNavigatorMessages;
import org.eclipse.ui.navigator.internal.NavigatorPlugin;

/**
 * Encapsulates the <code>org.eclipse.ui.navigator.viewer</code> extension.
 * <p>
 * <strong>EXPERIMENTAL</strong>. This class or interface has been added as
 * part of a work in progress. There is a guarantee neither that this API will
 * work nor that it will remain the same. Please do not use this API without
 * consulting with the Platform/UI team.
 * </p>
 * 
 * @since 3.2
 */
public class NavigatorViewerDescriptor implements INavigatorViewerDescriptor {

	static final String TAG_INCLUDES = "includes"; //$NON-NLS-1$

	static final String TAG_EXCLUDES = "excludes"; //$NON-NLS-1$

	static final String ATT_IS_ROOT = "isRoot"; //$NON-NLS-1$

	static final String ATT_PATTERN = "pattern"; //$NON-NLS-1$

	private static final String TAG_CONTENT_EXTENSION = "contentExtension"; //$NON-NLS-1$

	private static final String TAG_ACTION_EXTENSION = "actionExtension"; //$NON-NLS-1$

	private final String viewerId;

	private String popupMenuId = null;

	private Binding actionBinding = new Binding(TAG_ACTION_EXTENSION);

	private Binding contentBinding = new Binding(TAG_CONTENT_EXTENSION);

	private InsertionPoint[] customInsertionPoints = null;

	private boolean allowsPlatformContributions = true;

	/**
	 * Creates a new content descriptor from a configuration element.
	 * 
	 * @param aViewerId
	 *            The identifier for this descriptor.
	 */
	public NavigatorViewerDescriptor(String aViewerId) {
		super();
		this.viewerId = aViewerId;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.navigator.internal.extensions.INavigatorViewerDescriptor#getViewerId()
	 */
	public String getViewerId() {
		return viewerId;
	}

	/**
	 * Update the popupMenuId. If a value is already set, then a warning message
	 * will be logged.
	 * 
	 * @param newPopupMenuId
	 *            The new popup menu id.
	 */
	public void setPopupMenuId(String newPopupMenuId) {

		if (newPopupMenuId != null) {
			if (popupMenuId != null)
				NavigatorPlugin
						.log(NLS
								.bind(
										CommonNavigatorMessages.NavigatorViewerDescriptor_Popup_Menu_Overridden,
										new Object[] { getViewerId(),
												popupMenuId, newPopupMenuId }));
			popupMenuId = newPopupMenuId;
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.navigator.internal.extensions.INavigatorViewerDescriptor#getPopupMenuId()
	 */
	public String getPopupMenuId() {
		return popupMenuId != null ? popupMenuId : viewerId;
	}

	/**
	 * Consume an action binding for this viewer.
	 * 
	 * @param element
	 *            The IConfigurationElement containing a viewerActionBinding
	 *            element.
	 * @throws WorkbenchException
	 *             If something goes horribly wrong.
	 */
	public void consumeActionBinding(IConfigurationElement element)
			throws WorkbenchException {
		consumeBinding(element, false);
	}

	/**
	 * Consume a content binding for this viewer.
	 * 
	 * @param element
	 *            The IConfigurationElement containing a viewerContentBinding
	 *            element.
	 * @throws WorkbenchException
	 *             If something goes horribly wrong.
	 */
	public void consumeContentBinding(IConfigurationElement element)
			throws WorkbenchException {
		consumeBinding(element, true);
	}

	public boolean isRootExtension(String aContentExtensionId) {
		return contentBinding.isRootExtension(aContentExtensionId);
	}

	public boolean allowsPlatformContributionsToContextMenu() {
		return allowsPlatformContributions;
	}

	public boolean isVisibleContentExtension(String aContentExtensionId) {
		return contentBinding.isVisibleExtension(aContentExtensionId);
	}

	public boolean isVisibleActionExtension(String anActionExtensionId) {
		return actionBinding.isVisibleExtension(anActionExtensionId);
	}

	public boolean hasOverriddenRootExtensions() {
		return contentBinding.hasOverriddenRootExtensions();
	}

	private void consumeBinding(IConfigurationElement element, boolean isContent)
			throws WorkbenchException {
		IConfigurationElement[] includesElement = element
				.getChildren(TAG_INCLUDES);

		if (includesElement.length == 1) {
			if (isContent)
				contentBinding.consumeIncludes(includesElement[0], true);
			else
				actionBinding.consumeIncludes(includesElement[0], false);
		} else if (includesElement.length >= 1) {
			NavigatorPlugin.logError(0, NLS.bind(
					CommonNavigatorMessages.Too_many_elements_Warning,
					new Object[] {
							TAG_INCLUDES,
							element.getDeclaringExtension()
									.getUniqueIdentifier(),
							element.getDeclaringExtension().getNamespace() }),
					null);
		}

		IConfigurationElement[] excludesElement = element
				.getChildren(TAG_EXCLUDES);

		if (excludesElement.length == 1) {

			if (isContent)
				contentBinding.consumeExcludes(excludesElement[0]);
			else
				actionBinding.consumeExcludes(excludesElement[0]);
		} else if (excludesElement.length >= 1) {
			NavigatorPlugin.logError(0, NLS.bind(
					CommonNavigatorMessages.Too_many_elements_Warning,
					new Object[] {
							TAG_EXCLUDES,
							element.getDeclaringExtension()
									.getUniqueIdentifier(),
							element.getDeclaringExtension().getNamespace() }),
					null);
		}
	}

	public InsertionPoint[] getCustomInsertionPoints() {
		return customInsertionPoints;
	}

	/**
	 * 
	 * @param newCustomInsertionPoints
	 *            The set of custom insertion points, if any. A null list
	 *            indicates the default set (as defined by
	 *            {@link NavigatorActionService}) should be used. An empty list
	 *            indicates there are no declarative insertion points.
	 */
	public void setCustomInsertionPoints(
			InsertionPoint[] newCustomInsertionPoints) {
		if (customInsertionPoints != null) {
			NavigatorPlugin
					.logError(
							0,
							"Attempt to override custom insertion points denied. Verify there are no colliding org.eclipse.ui.navigator.viewer extension points.", null); //$NON-NLS-1$
			return; // do not let them override the insertion points.
		}
		customInsertionPoints = newCustomInsertionPoints;
	}

	/**
	 * 
	 * @param toAllowPlatformContributions
	 *            A value of 'true' enables object/viewer contributions. 'false'
	 *            will only allow programmatic contributions from
	 *            {@link CommonActionProvider}s.
	 */
	public void setAllowsPlatformContributions(
			boolean toAllowPlatformContributions) {
		allowsPlatformContributions = toAllowPlatformContributions;
	}

}
