/*******************************************************************************
 * Copyright (c) 2006 Sybase, Inc. 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:
 *     Sybase, Inc. - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.pagedesigner.properties;

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

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuCreator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.w3c.dom.Document;
import org.w3c.dom.DocumentFragment;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.Text;

/**
 * @author mengbo
 * @version 1.5
 */
public class NavigationHiearchyAction extends Action {
	private Menu _hiearchyMenu;

	private Node _startNode;

	private Node _currentNode;

	private WPETabbedPropertySheetPage _propertyPage;

	private class MenuCreator implements IMenuCreator {
		public void dispose() {
			if (_hiearchyMenu != null) {
				for (int i = 0, n = _hiearchyMenu.getItemCount(); i < n; i++) {
					MenuItem menuItem = _hiearchyMenu.getItem(i);
					menuItem.setData(null);
				}
				_hiearchyMenu.dispose();
				_hiearchyMenu = null;
			}
		}

		public Menu getMenu(Menu parent) {
			return null;
		}

		public Menu getMenu(Control parent) {
			dispose();
			_hiearchyMenu = new Menu(parent);

			// next we need to add the list of parents node into the menu.
			Node node = _startNode;
			List list = new ArrayList();
			while (node != null && !(node instanceof Document)
					&& !(node instanceof DocumentFragment)) {
				list.add(node);
				node = node.getParentNode();
			}

			// adding ancesters reverse order.
			for (int i = list.size() - 1; i >= 0; i--) {
				Node thenode = (Node) list.get(i);
				MenuItem item = new MenuItem(_hiearchyMenu, SWT.CHECK);
				item.setSelection(thenode == _currentNode ? true : false);
				String text = thenode.getNodeName();
				item.setText(text);
				item.setData(thenode);
				item.addSelectionListener(new SelectionAdapter() {
					public void widgetSelected(SelectionEvent e) {
						Node selectedNode = (Node) e.widget.getData();
						_propertyPage.internalChangeSelection(selectedNode,
								_startNode);
					}
				});
			}

			return _hiearchyMenu;
		}
	}

	/**
	 * @param propertyPage
	 */
	public NavigationHiearchyAction(WPETabbedPropertySheetPage propertyPage) {
		super(""); //$NON-NLS-1$
		setEnabled(true);
		setMenuCreator(new MenuCreator());
		this._propertyPage = propertyPage;
	}

	/**
	 * @param selectedNode
	 * @param startNode
	 */
	protected void changeSelection(Node selectedNode, Node startNode) {
		this._propertyPage.internalChangeSelection(selectedNode, startNode);
		this._currentNode = selectedNode;
		this._startNode = startNode;
		this.setText(this._currentNode.getNodeName());
	}

	/**
	 * @param currentNode
	 * @param startNode
	 */
	protected void refresh(Node currentNode, Node startNode) {
		this._currentNode = currentNode;
		this._startNode = startNode;
		if (!(_currentNode instanceof Text)
				&& !(_currentNode instanceof Element)) {
			this.setText("---"); //$NON-NLS-1$
			this.setEnabled(false);
		} else {
			this.setText(_currentNode.getNodeName());
			this.setEnabled(true);
		}
	}

	@Override
	public void run() {
		this._propertyPage.internalChangeSelection(_currentNode, _startNode);
	}
}
