| /******************************************************************************* |
| * 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.jsf.ui.elementedit.jsfhtml; |
| |
| import org.eclipse.draw2d.IFigure; |
| import org.eclipse.draw2d.geometry.Point; |
| import org.eclipse.gef.EditPart; |
| import org.eclipse.gef.EditPolicy; |
| import org.eclipse.gef.GraphicalEditPart; |
| import org.eclipse.gef.Request; |
| import org.eclipse.gef.SharedCursors; |
| import org.eclipse.gef.commands.Command; |
| 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.jst.jsf.core.internal.tld.IJSFConstants; |
| import org.eclipse.jst.pagedesigner.actions.single.SelectEditPartAction; |
| import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants; |
| import org.eclipse.jst.pagedesigner.editpolicies.ElementResizableEditPolicy; |
| import org.eclipse.jst.pagedesigner.jsf.ui.JSFUIPlugin; |
| import org.eclipse.jst.pagedesigner.jsf.ui.actions.DeleteHeaderFooterAction; |
| import org.eclipse.jst.pagedesigner.jsf.ui.actions.InsertHeaderFooterAction; |
| import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.DataTableDeleteHeaderCommand; |
| import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.PanelGridDeleteColumnCommand; |
| import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.PanelGridDeleteRowCommand; |
| import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.PanelGridInsertColumnCommand; |
| import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.PanelGridInsertFooterCommand; |
| import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.PanelGridInsertHeaderCommand; |
| import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.PanelGridInsertRowCommand; |
| import org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request.DeleteHeaderFooterRequest; |
| import org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request.InsertHeaderFooterRequest; |
| import org.eclipse.jst.pagedesigner.jsf.ui.elementedit.util.PanelGridUtil; |
| import org.eclipse.jst.pagedesigner.parts.ElementEditPart; |
| import org.eclipse.jst.pagedesigner.parts.NodeEditPart; |
| import org.eclipse.jst.pagedesigner.tableedit.DeleteRowColumnAction; |
| import org.eclipse.jst.pagedesigner.tableedit.InsertRowColumnAction; |
| import org.eclipse.jst.pagedesigner.tableedit.TableInsertRequest; |
| import org.eclipse.jst.pagedesigner.tableedit.TableResizeRequest; |
| import org.eclipse.jst.pagedesigner.tableedit.TableRowColumnDeleteRequest; |
| import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer; |
| import org.eclipse.swt.graphics.Cursor; |
| import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement; |
| import org.w3c.dom.Element; |
| import org.w3c.dom.Node; |
| |
| /** |
| * @author mengbo |
| * @version 1.5 |
| */ |
| public class PanelGridElementEdit extends DefaultJSFHTMLElementEdit |
| { |
| private final static Action EMPTY_ACTION = new Action() |
| { |
| // TODO: why? |
| }; |
| private final static int FAKE_INDEX = -10; |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#fillContextMenu(org.eclipse.jface.action.IMenuManager, org.w3c.dom.Element) |
| */ |
| public void fillContextMenu(IMenuManager contextMenu, Element ele) |
| { |
| super.fillContextMenu(contextMenu, ele); |
| |
| final IMenuManager tableMenu = new MenuManager(JSFUIPlugin.getResourceString("ElementEdit.Submenu.PanelGrid"));//$NON-NLS-1$ |
| tableMenu.add(EMPTY_ACTION); |
| final ElementEditPart gridEditPart = (ElementEditPart) ((IDOMElement) ele).getAdapterFor(EditPart.class); |
| |
| // ok, we passed the checking, now let's create the actions. |
| tableMenu.addMenuListener(new IMenuListener() |
| { |
| public void menuAboutToShow(IMenuManager manager) |
| { |
| tableMenu.removeAll(); |
| fillPanelGridMenu(gridEditPart, FAKE_INDEX, FAKE_INDEX, tableMenu); |
| } |
| }); |
| |
| contextMenu.appendToGroup(PageDesignerActionConstants.GROUP_CONTAINER, tableMenu); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#fillContainerContextMenu(org.eclipse.jface.action.IMenuManager, org.eclipse.jst.pagedesigner.parts.ElementEditPart, org.eclipse.jst.pagedesigner.parts.NodeEditPart, org.eclipse.jface.viewers.ISelection) |
| */ |
| public boolean fillContainerContextMenu(IMenuManager contextMenu, final ElementEditPart elePart, |
| NodeEditPart nodePart, ISelection innerSelection) |
| { |
| Element table = (Element) elePart.getModel(); |
| Node node = (Node) nodePart.getModel(); |
| |
| Element childEle = null; |
| if (node instanceof Element) |
| { |
| childEle = (Element) node; |
| } |
| else |
| { |
| boolean hasElementParent = false; |
| Node nodeBackup = node; |
| while (!IJSFConstants.TAG_PANELGRID.equalsIgnoreCase(nodeBackup.getParentNode().getLocalName())) |
| { |
| nodeBackup = nodeBackup.getParentNode(); |
| if (nodeBackup instanceof Element) |
| { |
| hasElementParent = true; |
| break; |
| } |
| } |
| if (!hasElementParent) |
| { |
| return false; |
| } |
| childEle = (Element) nodeBackup; |
| } |
| |
| PanelGridUtil util = new PanelGridUtil(table); |
| final int cellRow = util.convertRowIndexFromDomToView(util.getDomRowIndex(childEle)); |
| final int cellColumn = util.getDomColumnIndex(childEle); |
| |
| final IMenuManager tableMenu = new MenuManager(JSFUIPlugin.getResourceString("ElementEdit.Submenu.PanelGrid"));//$NON-NLS-1$ |
| tableMenu.add(EMPTY_ACTION); |
| |
| // ok, we passed the checking, now let's create the actions. |
| tableMenu.addMenuListener(new IMenuListener() |
| { |
| public void menuAboutToShow(IMenuManager manager) |
| { |
| tableMenu.removeAll(); |
| fillPanelGridMenu(elePart, cellRow, cellColumn, tableMenu); |
| } |
| }); |
| |
| contextMenu.appendToGroup(PageDesignerActionConstants.GROUP_CONTAINER, tableMenu); |
| return true; |
| |
| } |
| |
| /** |
| * @param elePart |
| * @param cellRow |
| * @param cellColumn |
| * @param tableMenu |
| */ |
| private void fillPanelGridMenu(ElementEditPart elePart, int cellRow, int cellColumn, IMenuManager tableMenu) |
| { |
| SelectEditPartAction action = SelectEditPartAction.create(JSFUIPlugin |
| .getResourceString("ElementEdit.Submenu.PanelGrid.SelectTable"), elePart);//$NON-NLS-1$ |
| tableMenu.add(action); |
| |
| tableMenu.add(new Separator()); |
| |
| { |
| InsertRowColumnAction insertRowBeforeAction = new InsertRowColumnAction(JSFUIPlugin |
| .getResourceString("ElementEdit.Submenu.PanelGrid.InsertRowBefore"), //$NON-NLS-1$ |
| elePart, cellRow, true, true); |
| tableMenu.add(insertRowBeforeAction); |
| |
| InsertRowColumnAction insertRowAfterAction = new InsertRowColumnAction(JSFUIPlugin |
| .getResourceString("ElementEdit.Submenu.PanelGrid.InsertRowAfter"), //$NON-NLS-1$ |
| elePart, cellRow, true, false); |
| tableMenu.add(insertRowAfterAction); |
| |
| tableMenu.add(new Separator()); |
| } |
| |
| { |
| InsertRowColumnAction insertColumnBeforeAction = new InsertRowColumnAction(JSFUIPlugin |
| .getResourceString("ElementEdit.Submenu.PanelGrid.InsertColumnBefore"), //$NON-NLS-1$ |
| elePart, cellColumn, false, true); |
| tableMenu.add(insertColumnBeforeAction); |
| |
| InsertRowColumnAction insertColumnAfterAction = new InsertRowColumnAction(JSFUIPlugin |
| .getResourceString("ElementEdit.Submenu.PanelGrid.InsertColumnAfter"), //$NON-NLS-1$ |
| elePart, cellColumn, false, false); |
| tableMenu.add(insertColumnAfterAction); |
| |
| tableMenu.add(new Separator()); |
| } |
| |
| { |
| DeleteRowColumnAction deleteRowAction = new DeleteRowColumnAction(JSFUIPlugin |
| .getResourceString("ElementEdit.Submenu.PanelGrid.DeleteRow"), //$NON-NLS-1$ |
| elePart, cellRow, true); |
| tableMenu.add(deleteRowAction); |
| |
| DeleteRowColumnAction deleteColumnAction = new DeleteRowColumnAction(JSFUIPlugin |
| .getResourceString("ElementEdit.Submenu.PanelGrid.DeleteColumn"), //$NON-NLS-1$ |
| elePart, cellColumn, false); |
| tableMenu.add(deleteColumnAction); |
| tableMenu.add(new Separator()); |
| } |
| |
| { |
| InsertHeaderFooterAction headerAction = new InsertHeaderFooterAction(JSFUIPlugin |
| .getResourceString("ElementEdit.Submenu.PanelGrid.InsertHeader"), //$NON-NLS-1$ |
| elePart, true); |
| tableMenu.add(headerAction); |
| |
| InsertHeaderFooterAction footerAction = new InsertHeaderFooterAction(JSFUIPlugin |
| .getResourceString("ElementEdit.Submenu.PanelGrid.InsertFooter"), //$NON-NLS-1$ |
| elePart, false); |
| tableMenu.add(footerAction); |
| |
| DeleteHeaderFooterAction delHeaderAction = new DeleteHeaderFooterAction(JSFUIPlugin |
| .getResourceString("ElementEdit.Submenu.PanelGird.DeleteHeader"), elePart, true);//$NON-NLS-1$ |
| tableMenu.add(delHeaderAction); |
| |
| DeleteHeaderFooterAction delFooterAction = new DeleteHeaderFooterAction(JSFUIPlugin |
| .getResourceString("ElementEdit.Submenu.PanelGrid.DeleteFooter"), elePart, false);//$NON-NLS-1$ |
| tableMenu.add(delFooterAction); |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#createEditPolicies(org.eclipse.jst.pagedesigner.parts.ElementEditPart) |
| */ |
| public void createEditPolicies(ElementEditPart part) |
| { |
| part.installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new PanelGridResizePolicy(part)); |
| } |
| |
| static class PanelGridResizePolicy extends ElementResizableEditPolicy |
| { |
| ElementEditPart _part; |
| |
| /** |
| * @param part |
| */ |
| public PanelGridResizePolicy(ElementEditPart part) |
| { |
| _part = part; |
| } |
| |
| public Cursor getSelectionToolCursor(Point mouseLocation) |
| { |
| final GraphicalEditPart part = (GraphicalEditPart) getHost(); |
| final IFigure panelFigure = part.getFigure(); |
| |
| Point relativeLocation = mouseLocation.getCopy(); |
| panelFigure.translateToRelative(relativeLocation); |
| |
| // row cursor if we are within +/- 2 pixels of the left side |
| final int xoffsetAbs = Math.abs(panelFigure.getBounds().x - relativeLocation.x); |
| |
| if (xoffsetAbs <= 2) |
| { |
| return SharedCursors.SIZEE; |
| } |
| |
| final int yoffsetAbs = Math.abs(panelFigure.getBounds().y - relativeLocation.y); |
| |
| if (yoffsetAbs <= 2) |
| { |
| return SharedCursors.SIZEW; |
| } |
| |
| return null; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.gef.editpolicies.ResizableEditPolicy#getCommand(org.eclipse.gef.Request) |
| */ |
| public Command getCommand(Request request) |
| { |
| IHTMLGraphicalViewer viewer = (IHTMLGraphicalViewer) _part.getViewer(); |
| Element panelGrid = (Element) _part.getIDOMNode(); |
| if (request instanceof TableResizeRequest) |
| { |
| return super.getCommand(request); |
| } |
| else if (request instanceof TableInsertRequest) |
| { |
| TableInsertRequest tableInsertRequest = (TableInsertRequest) request; |
| if (tableInsertRequest.isRow()) |
| { |
| int index = tableInsertRequest.getIndex() + (tableInsertRequest.isBefore() ? 0 : 1); |
| return new PanelGridInsertRowCommand(viewer, panelGrid, index); |
| } |
| int index = tableInsertRequest.getIndex() + (tableInsertRequest.isBefore() ? 0 : 1); |
| return new PanelGridInsertColumnCommand(viewer, panelGrid, index); |
| } |
| else if (request instanceof InsertHeaderFooterRequest) |
| { |
| InsertHeaderFooterRequest req = (InsertHeaderFooterRequest) request; |
| boolean isHeader = req.isHeader(); |
| if (isHeader) |
| { |
| return new PanelGridInsertHeaderCommand(viewer, panelGrid); |
| } |
| return new PanelGridInsertFooterCommand(viewer, panelGrid); |
| } |
| else if (request instanceof DeleteHeaderFooterRequest) |
| { |
| DeleteHeaderFooterRequest req = (DeleteHeaderFooterRequest) request; |
| boolean isHeader = req.isHeader(); |
| return new DataTableDeleteHeaderCommand(viewer, panelGrid, isHeader); |
| } |
| else if (request instanceof TableRowColumnDeleteRequest) |
| { |
| TableRowColumnDeleteRequest deleteReq = (TableRowColumnDeleteRequest) request; |
| if (deleteReq.isRow()) |
| { |
| return new PanelGridDeleteRowCommand(viewer, panelGrid, deleteReq.getIndex()); |
| } |
| return new PanelGridDeleteColumnCommand(viewer, panelGrid, deleteReq.getIndex()); |
| } |
| return super.getCommand(request); |
| } |
| } |
| } |