/** * Copyright (c) 2012-2016 Marsha Chechik, Alessio Di Sandro, Michalis Famelis, * Rick Salay. * 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: * Alessio Di Sandro - Implementation. */ package edu.toronto.cs.se.modelepedia.kleisli.contextmenu; import org.eclipse.gef.GraphicalEditPart; import org.eclipse.gmf.runtime.notation.View; import org.eclipse.jface.action.ContributionItem; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.ui.PlatformUI; import edu.toronto.cs.se.mmint.MMINT; import edu.toronto.cs.se.mmint.mid.EMFInfo; import edu.toronto.cs.se.mmint.mid.diagram.context.MIDContextMenu; import edu.toronto.cs.se.mmint.mid.relationship.ModelElementReference; import edu.toronto.cs.se.mmint.mid.relationship.ModelEndpointReference; import edu.toronto.cs.se.mmint.mid.relationship.diagram.edit.parts.ModelElementReference2EditPart; import edu.toronto.cs.se.mmint.mid.relationship.diagram.edit.parts.ModelElementReferenceEditPart; import edu.toronto.cs.se.modelepedia.kleisli.KleisliModelEndpoint; public class KleisliRelationshipDiagramContextMenu extends ContributionItem { private static final String MMINT_MENU_KLEISLI_LABEL = "Add/Modify Kleisli Query"; @Override public boolean isDynamic() { return true; } @Override public void fill(Menu menu, int index) { // check selection ISelection selection = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getSelection(); if (selection == null || selection.isEmpty() || !(selection instanceof StructuredSelection)) { return; } Object[] objects = ((StructuredSelection) selection).toArray(); boolean doDerivation = true; if (objects.length > 1) { doDerivation = false; } // get selection ModelElementReference modelElemRef = null; for (Object object : objects) { if ( object instanceof ModelElementReferenceEditPart || object instanceof ModelElementReference2EditPart ) { GraphicalEditPart editPart = (GraphicalEditPart) object; modelElemRef = (ModelElementReference) ((View) editPart.getModel()).getElement(); //TODO MMINT[KLEISLI] replace with KleisliModelElement EMFInfo eInfo = modelElemRef.getObject().getEInfo(); if ( !(((ModelEndpointReference) modelElemRef.eContainer()).getObject() instanceof KleisliModelEndpoint) || !modelElemRef.isTypesLevel() || ( // only types !eInfo.getClassName().startsWith("_") && ( // only derived classes eInfo.getFeatureName() == null || !eInfo.getFeatureName().startsWith("_") ) ) || ( eInfo.getClassName().startsWith("_") && // only derived features eInfo.getFeatureName() != null && !eInfo.getFeatureName().startsWith("_") ) ) { doDerivation = false; } } if (!doDerivation) { return; } } if (modelElemRef == null) { // no relevant edit parts selected return; } // create dynamic menus MenuItem mmintItem = new MenuItem(menu, SWT.CASCADE, index); mmintItem.setText(MIDContextMenu.MMINT_MENU_LABEL); Menu mmintMenu = new Menu(menu); mmintItem.setMenu(mmintMenu); MMINT.storeActiveInstanceMIDFile(); // derivation if (doDerivation) { MenuItem derivationItem = new MenuItem(mmintMenu, SWT.NONE); derivationItem.setText(MMINT_MENU_KLEISLI_LABEL); derivationItem.addSelectionListener( new KleisliAddModifyQueryListener(MMINT_MENU_KLEISLI_LABEL, modelElemRef.getObject()) ); } } }