| /******************************************************************************* |
| * 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; |
| } |
| } |
| |
| } |