/******************************************************************************* * Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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: * Exadel, Inc. and Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.seam.ui.pages.editor; import java.util.*; import org.eclipse.jface.action.*; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.events.*; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.draw2d.geometry.Point; import org.jboss.tools.common.meta.XModelEntity; import org.jboss.tools.common.model.ui.action.XModelObjectActionList; import org.eclipse.gef.EditPartViewer; import org.eclipse.gef.ui.actions.ActionRegistry; import org.eclipse.gef.ui.actions.GEFActionConstants; import org.jboss.tools.common.model.XModelObject; import org.jboss.tools.jst.web.model.ReferenceObject; import org.jboss.tools.seam.pages.xml.model.SeamPagesConstants; import org.jboss.tools.seam.ui.pages.editor.edit.PagesDiagramEditPart; import org.jboss.tools.seam.ui.pages.editor.edit.SelectionUtil; public class PagesContextMenuProvider extends org.eclipse.gef.ContextMenuProvider { private ActionRegistry actionRegistry; private MouseEvent lastDownEvent = null; private Point lastPoint = null; public PagesContextMenuProvider(EditPartViewer viewer, ActionRegistry registry) { super(viewer); viewer.getControl().addMouseListener(new MouseAdapter() { public void mouseDown(MouseEvent e) { lastDownEvent = e; } }); setActionRegistry(registry); } public void buildContextMenu(IMenuManager manager) { GEFActionConstants.addStandardActionGroups(manager); } //never used ActionRegistry getActionRegistry() { return actionRegistry; } private void setActionRegistry(ActionRegistry registry) { actionRegistry = registry; } protected void update(boolean force, boolean recursive) { if(!isDirty() && !force) return; if(!menuExist()) return; MenuItem[] is = getMenu().getItems(); for (int i = 0; i < is.length; i++) { if(!is[i].isDisposed()) is[i].dispose(); } ISelection s = getViewer().getSelection(); if(s.isEmpty() || !(s instanceof IStructuredSelection)) return; IStructuredSelection ss = (IStructuredSelection)s; XModelObject object = SelectionUtil.getTarget(ss.getFirstElement()); if(object != null) { String entityName = object.getModelEntity().getName(); if(entityName.equals(SeamPagesConstants.ENT_DIAGRAM_ITEM_OUTPUT) && object instanceof ReferenceObject && ((ReferenceObject)object).getReference() == null) { entityName = "SeamPagesDiagramItemOutputVirtual_ActionList"; } else if(entityName.equals(SeamPagesConstants.ENT_DIAGRAM_ITEM) && object instanceof ReferenceObject && ((ReferenceObject)object).getReference() == null) { entityName = "SeamPagesDiagramItemVirtual_ActionList"; } PagesDiagramEditPart part = (PagesDiagramEditPart)getViewer().getRootEditPart().getChildren().get(0); Properties p = new Properties(); if(lastDownEvent != null) { lastPoint = new Point(lastDownEvent.x, lastDownEvent.y); part.getFigure().translateToRelative(lastPoint); lastDownEvent = null; } if(lastPoint != null) { p.setProperty("mouse.x", "" + lastPoint.x); //$NON-NLS-1$ //$NON-NLS-2$ p.setProperty("mouse.y", "" + lastPoint.y); //$NON-NLS-1$ //$NON-NLS-2$ } p.put("diagramEditPart", part); XModelEntity entity = object.getModel().getMetaData().getEntity(entityName); if(entity == null) return; XModelObjectActionList list = new XModelObjectActionList(entity.getActionList(), object, SelectionUtil.getTargets(ss), new Object[]{object, p}); Menu menu = getMenu(); list.createMenu(menu); list.removeLastSeparator(menu); } } }