/*******************************************************************************
 * 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.actions.table;

import org.eclipse.gef.EditPart;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jst.pagedesigner.PDPlugin;
import org.eclipse.jst.pagedesigner.actions.single.SelectEditPartAction;
import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
import org.eclipse.jst.pagedesigner.range.RangeUtil;
import org.eclipse.jst.pagedesigner.tableedit.DeleteRowColumnAction;
import org.eclipse.jst.pagedesigner.tableedit.InsertRowColumnAction;
import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
import org.eclipse.jst.pagedesigner.viewer.DesignRange;
import org.eclipse.ui.actions.ActionGroup;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;

/**
 * 
 * @author mengbo
 * @version 1.5
 */
public class TableActionGroup extends ActionGroup {
	public static Action action = new Action() {
	};

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.actions.ActionGroup#fillContextMenu(org.eclipse.jface.action.IMenuManager)
	 */
	public void fillContextMenu(IMenuManager menu) {
		ISelection selection = this.getContext().getSelection();

		EditPart part = findCommonAncesterPart(selection);
		if (part == null) {
			return;
		}

		TableOperationContext context = TableOperationContext
				.getTableOperationContext(part);
		if (context == null) {
			return;
		}

		final ElementEditPart tablePart = context._tablePart;

		if (tablePart == null || !supportTableActions(tablePart)) {
			return;
		}

		final int cellRow = context._rowIndex;
		final int cellColumn = context._columnIndex;

		String tag = ((IDOMElement) tablePart.getIDOMNode()).getLocalName();
		final IMenuManager tableMenu = new MenuManager(tag);

		// ok, we passed the checking, now let's create the actions.
		tableMenu.add(action);
		tableMenu.addMenuListener(new IMenuListener() {

			public void menuAboutToShow(IMenuManager manager) {
				tableMenu.removeAll();
				fillTableMenu(tablePart, cellRow, cellColumn, tableMenu);
			}
		});
		menu.appendToGroup(PageDesignerActionConstants.GROUP_CONTAINER,
				tableMenu);
	}

	/**
	 * @param tablePart
	 * @param cellRow
	 * @param cellColumn
	 * @param tableMenu
	 */
	private void fillTableMenu(ElementEditPart tablePart, int cellRow,
			int cellColumn, IMenuManager tableMenu) {
		SelectEditPartAction action = new SelectEditPartAction(
				PDPlugin
						.getResourceString("TableActionGroup.Submenu.SelectTable"), tablePart);//$NON-NLS-1$
		tableMenu.add(action);

		tableMenu.add(new Separator());

		{
			InsertRowColumnAction insertRowBeforeAction = new InsertRowColumnAction(
					PDPlugin
							.getResourceString("TableActionGroup.Submenu.InsertRowBefore"),//$NON-NLS-1$
					tablePart, cellRow, true, true);
			tableMenu.add(insertRowBeforeAction);

			InsertRowColumnAction insertRowAfterAction = new InsertRowColumnAction(
					PDPlugin
							.getResourceString("TableActionGroup.Submenu.InsertRowAfter"),//$NON-NLS-1$
					tablePart, cellRow, true, false);
			tableMenu.add(insertRowAfterAction);

			tableMenu.add(new Separator());
		}

		{
			InsertRowColumnAction insertColumnBeforeAction = new InsertRowColumnAction(
					PDPlugin
							.getResourceString("TableActionGroup.Submenu.InsertColumnBefore"),//$NON-NLS-1$
					tablePart, cellColumn, true, true);
			tableMenu.add(insertColumnBeforeAction);

			InsertRowColumnAction insertColumnAfterAction = new InsertRowColumnAction(
					PDPlugin
							.getResourceString("TableActionGroup.Submenu.InsertColumnAfter"),//$NON-NLS-1$
					tablePart, cellColumn, true, false);
			tableMenu.add(insertColumnAfterAction);

			tableMenu.add(new Separator());
		}

		{
			DeleteRowColumnAction deleteRowAction = new DeleteRowColumnAction(
					PDPlugin
							.getResourceString("TableActionGroup.Submenu.DeleteRow"),//$NON-NLS-1$
					tablePart, cellRow, true);
			tableMenu.add(deleteRowAction);

			DeleteRowColumnAction deleteColumnAction = new DeleteRowColumnAction(
					PDPlugin
							.getResourceString("TableActionGroup.Submenu.DeleteColumn"),//$NON-NLS-1$
					tablePart, cellColumn, false);
			tableMenu.add(deleteColumnAction);
		}
	}

	/**
	 * @param tablePart
	 * @return
	 */
	private boolean supportTableActions(ElementEditPart tablePart) {
		// TODO Auto-generated method stub
		return true;
	}

	/**
	 * Give a selection, find a single common container node as start for table
	 * related operations.
	 * 
	 * @param selection
	 * @return
	 */
	private EditPart findCommonAncesterPart(ISelection selection) {
		if (selection instanceof IStructuredSelection) {
			IStructuredSelection structsel = (IStructuredSelection) selection;
			if (structsel.size() != 1) {
				return null;
			} else if (structsel.getFirstElement() instanceof EditPart) {
				return (EditPart) structsel.getFirstElement();
			} else {
				return null;
			}
		} else if (selection instanceof DesignRange) {
			DesignRange range = (DesignRange) selection;
			if (!range.isValid()) {
				return null;
			}
			if (range.isEmpty()) {
				DesignPosition position = range.getStartPosition();
				if (position.getOffset() == 0) {
					return position.getContainerPart();
				} else {
					return position.getSiblingEditPart(true);
				}
			} else {
				return RangeUtil.findCommonAncestor(range);
			}
		} else {
			return null;
		}
	}

}
