/*******************************************************************************
 * Copyright (c) 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
 ******************************************************************************/

package org.eclipse.ui.internal.navigator.filters;

import org.eclipse.core.expressions.Expression;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.ui.internal.navigator.CustomAndExpression;
import org.eclipse.ui.internal.navigator.NavigatorPlugin;
import org.eclipse.ui.internal.navigator.extensions.INavigatorContentExtPtConstants;
import org.eclipse.ui.navigator.ICommonFilterDescriptor;

/**
 * 
 * Describes a <b>commonFilter</b> element under a
 * <b>org.eclipse.ui.navigator.navigatorContent</b> extension.
 * 
 * @since 3.2
 * 
 */
public class CommonFilterDescriptor implements ICommonFilterDescriptor,
		INavigatorContentExtPtConstants {

	private IConfigurationElement element;

	private Expression filterExpression;

	private String id;

	protected CommonFilterDescriptor(IConfigurationElement anElement) {

		element = anElement;
		init();
	}

	private void init() {
		id = element.getAttribute(ATT_ID);
		if (id == null) {
			id = ""; //$NON-NLS-1$
		}
		IConfigurationElement[] children = element
				.getChildren(TAG_FILTER_EXPRESSION);
		if (children.length == 1) {
			filterExpression = new CustomAndExpression(children[0]);
		}
	}

	/**
	 * 
	 * @return An identifier used to determine whether the filter is visible.
	 *         May not be unique.
	 */
	public String getId() {
		return id;
	}

	/**
	 * 
	 * @return A translated name to identify the filter
	 */
	public String getName() {
		return element.getAttribute(ATT_NAME);
	}

	/**
	 * 
	 * @return A translated description to explain to the user what the defined
	 *         filter will hide from the view.
	 */
	public String getDescription() {
		return element.getAttribute(ATT_DESCRIPTION);
	}

	/**
	 * 
	 * @return Indicates the filter should be in an "Active" state by default.
	 */
	public boolean isActiveByDefault() {
		return Boolean.valueOf(element.getAttribute(ATT_ACTIVE_BY_DEFAULT))
				.booleanValue();
	}

	/**
	 * 
	 * @return An instance of the ViewerFilter defined by the extension. Callers
	 *         of this method are responsible for managing the instantiated
	 *         filter.
	 */
	public ViewerFilter createFilter() {
		try {

			if (filterExpression != null) {

				if (element.getAttribute(ATT_CLASS) != null) {
					NavigatorPlugin
							.log(
									IStatus.WARNING,
									0,
									"A \"commonFilter\" was specified in " + //$NON-NLS-1$
											element.getDeclaringExtension().getNamespaceIdentifier()
											+ " which specifies a \"class\" attribute and an Core Expression.\n" + //$NON-NLS-1$
											"Only the Core Expression will be respected.", //$NON-NLS-1$
									null);
				} 

				return new CoreExpressionFilter(filterExpression);
			}

			return (ViewerFilter) element.createExecutableExtension(ATT_CLASS);
		} catch (RuntimeException re) {
			NavigatorPlugin.logError(0, re.getMessage(), re);
		} catch (CoreException e) {
			NavigatorPlugin.logError(0, e.getMessage(), e);
		}

		return SkeletonViewerFilter.INSTANCE;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#toString()
	 */
	public String toString() {
		return "CommonFilterDescriptor[" + getName() + " (" + getId() + ")]"; //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
	}
}
