/*****************************************************************************
 * Copyright (c) 2004 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.css.ui.views.contentoutline;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.wst.css.core.document.ICSSNode;
import org.eclipse.wst.css.core.document.ICSSStyleDeclItem;
import org.eclipse.wst.css.core.document.ICSSValue;
import org.eclipse.wst.css.ui.internal.CSSUIPlugin;
import org.eclipse.wst.sse.core.AdapterFactory;
import org.eclipse.wst.sse.ui.preferences.PreferenceKeyGenerator;
import org.eclipse.wst.sse.ui.view.events.NodeSelectionChangedEvent;
import org.eclipse.wst.sse.ui.views.contentoutline.PropertyChangeUpdateActionContributionItem;
import org.eclipse.wst.sse.ui.views.contentoutline.StructuredContentOutlineConfiguration;

public class CSSContentOutlineConfiguration extends StructuredContentOutlineConfiguration {
	private final String OUTLINE_SORT_PREF = "outline-sort"; //$NON-NLS-1$

	public CSSContentOutlineConfiguration() {
		super();
	}

	public IContributionItem[] createToolbarContributions(TreeViewer viewer) {
		IContributionItem[] items = super.createToolbarContributions(viewer);

		SortAction sortAction = new SortAction(viewer, CSSUIPlugin.getDefault().getPreferenceStore(), getSortPreferenceKey());
		IContributionItem sortItem = new PropertyChangeUpdateActionContributionItem(sortAction);

		if (items == null) {
			items = new IContributionItem[1];
			items[0] = sortItem;
		} else {
			IContributionItem[] combinedItems = new IContributionItem[items.length + 1];
			combinedItems[0] = sortItem;
			System.arraycopy(items, 0, combinedItems, 1, items.length);
			items = combinedItems;
		}
		return items;
	}

	/**
	 * @see com.ibm.sse.editor.views.contentoutline.ContentOutlineConfiguration#getContentProvider(org.eclipse.jface.viewers.TreeViewer)
	 */
	public IContentProvider getContentProvider(TreeViewer viewer) {
		if (fContentProvider == null && getFactory() != null)
			fContentProvider = new JFaceNodeContentProviderCSS((AdapterFactory) getFactory());
		return fContentProvider;
	}

	/**
	 * @see com.ibm.sse.editor.views.contentoutline.ContentOutlineConfiguration#getLabelProvider(org.eclipse.jface.viewers.TreeViewer)
	 */
	public ILabelProvider getLabelProvider(TreeViewer viewer) {
		if (fLabelProvider == null && getFactory() != null)
			fLabelProvider = new JFaceNodeLabelProviderCSS((AdapterFactory) getFactory());
		return fLabelProvider;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.ibm.sse.editor.views.contentoutline.ContentOutlineConfiguration#getNodes(java.util.List)
	 */
	public List getNodes(List nodes) {
		List filteredNodes = new ArrayList(nodes);

		List targetNodes = new ArrayList();
		Iterator i = filteredNodes.iterator();
		while (i.hasNext()) {
			Object obj = i.next();
			if (obj instanceof ICSSNode) {
				ICSSNode node = (ICSSNode) obj;
				short nodeType = node.getNodeType();
				if (node instanceof ICSSValue) {
					while (node != null && !(node instanceof ICSSStyleDeclItem)) {
						node = node.getParentNode();
					}
				} else if (nodeType == ICSSNode.STYLEDECLARATION_NODE) {
					node = node.getParentNode();
				} else if (nodeType == ICSSNode.MEDIALIST_NODE) {
					node = node.getParentNode();
				}
				if (node != null) {
					obj = node;
				}
			}
			targetNodes.add(obj);
		}

		return targetNodes;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.ibm.sse.editor.views.contentoutline.ContentOutlineConfiguration#getSelectedNodes(com.ibm.sse.editor.view.events.NodeSelectionChangedEvent)
	 */
	public List getSelectedNodes(NodeSelectionChangedEvent event) {
		return getNodes(event.getSelectedNodes());
	}

	public String getSortPreferenceKey() {
		return PreferenceKeyGenerator.generateKey(OUTLINE_SORT_PREF, getDeclaringID());
	}
}