/*******************************************************************************
 * 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 {
	// TODO: I think there's a pattern emerging...
    private final static Action action = new Action() {
        // create an empty no-op
	};

	/*
	 * (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 action1 = SelectEditPartAction.create(
				PDPlugin
						.getResourceString("TableActionGroup.Submenu.SelectTable"), tablePart);//$NON-NLS-1$
		tableMenu.add(action1);

		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: what's the point of this method?
        // it's only used in one place and always resolves to the same value..
		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();
				}
                return position.getSiblingEditPart(true);
			}
            return RangeUtil.findCommonAncestor(range);
		} else {
			return null;
		}
	}

}
