/** * 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: * Naama Ben-David - Implementation. * Alessio Di Sandro - Implementation. */ package edu.toronto.cs.se.mmint.mavo.diagram.context; import java.util.ArrayList; import java.util.List; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.gef.GraphicalEditPart; import org.eclipse.gmf.runtime.notation.View; import org.eclipse.jdt.annotation.NonNull; 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.mavo.MAVOCollection; import edu.toronto.cs.se.mavo.MAVODecision; import edu.toronto.cs.se.mavo.MAVOElement; import edu.toronto.cs.se.mavo.MAVORoot; import edu.toronto.cs.se.mavo.MayDecision; import edu.toronto.cs.se.mavo.SetDecision; import edu.toronto.cs.se.mavo.VarDecision; import edu.toronto.cs.se.mmint.mid.diagram.library.MIDContextMenuListener; /** * The handler for the dynamic construction of a context menu for all * MAVO operations. * * @author Alessio Di Sandro * */ public class MAVODiagramContextMenu extends ContributionItem { private static final @NonNull String MAVO_CONTEXT_MENU_LABEL = "MAVO"; private static final @NonNull String MAVO_CONTEXT_MENU_REFINEONE_LABEL = "Choose this element and refine"; private static final @NonNull String MAVO_CONTEXT_MENU_REFINEMULTI_LABEL = "Choose these elements and refine"; private static final @NonNull String MAVO_CONTEXT_MENU_MAYDECISION_LABEL = "May decision"; private static final @NonNull String MAVO_CONTEXT_MENU_VARDECISION_LABEL = "Var decision"; private static final @NonNull String MAVO_CONTEXT_MENU_SETDECISION_LABEL = "Set decision"; private static final @NonNull String MAVO_CONTEXT_MENU_MAYDECISION_SUBMENU_ADDTOALTERNATIVE_LABEL = "Add to alternative"; private static final @NonNull String MAVO_CONTEXT_MENU_VARDECISION_SUBMENU_ADDTODOMAIN_LABEL = "Add to domain"; private static final @NonNull String MAVO_CONTEXT_MENU_SETDECISION_SUBMENU_ADDTOENTITY_LABEL = "Add to entity"; private static final @NonNull String MAVO_CONTEXT_MENU_MAYDECISION_SUBMENU_REMOVEFROMALTERNATIVE_LABEL = "Remove from alternative"; private static final @NonNull String MAVO_CONTEXT_MENU_VARDECISION_SUBMENU_REMOVEFROMDOMAIN_LABEL = "Remove from domain"; private static final @NonNull String MAVO_CONTEXT_MENU_SETDECISION_SUBMENU_REMOVEFROMENTITY_LABEL = "Remove from entity"; @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(); // get selection List<MAVOElement> mavoModelObjs = new ArrayList<>(); for (Object object : objects) { GraphicalEditPart editPart = (GraphicalEditPart) object; EObject editPartElement = ((View) editPart.getModel()).getElement(); if (!(editPartElement instanceof MAVOElement)) { continue; } mavoModelObjs.add((MAVOElement) editPartElement); } if (mavoModelObjs.isEmpty()) { return; } MAVORoot mavoRootModelObj = (MAVORoot) EcoreUtil.getRootContainer(mavoModelObjs.get(0), true); if (mavoRootModelObj.getDecisions().size() == 0) { return; } // create menus MenuItem mavoItem = new MenuItem(menu, SWT.CASCADE, index); mavoItem.setText(MAVO_CONTEXT_MENU_LABEL); Menu mavoMenu = new Menu(menu); mavoItem.setMenu(mavoMenu); // refine if (mavoModelObjs.stream().anyMatch(mavoModelObj -> mavoModelObj.isMay())) { MenuItem refineItem = new MenuItem(mavoMenu, SWT.NONE); String refineText = (mavoModelObjs.size() == 1) ? MAVO_CONTEXT_MENU_REFINEONE_LABEL : MAVO_CONTEXT_MENU_REFINEMULTI_LABEL; refineItem.setText(refineText); refineItem.addSelectionListener( new MAVODiagramContextRefineListener(refineText, mavoModelObjs) ); } // add/remove for (MAVODecision mavoDecision : mavoRootModelObj.getDecisions()) { MenuItem decisionItem = new MenuItem(mavoMenu, SWT.CASCADE); Menu decisionMenu = new Menu(mavoMenu); decisionItem.setMenu(decisionMenu); String decisionText = "", addLabel = "", removeLabel = ""; List<MAVOCollection> mavoCollections = null; if (mavoDecision instanceof MayDecision) { decisionText = MAVO_CONTEXT_MENU_MAYDECISION_LABEL; addLabel = MAVO_CONTEXT_MENU_MAYDECISION_SUBMENU_ADDTOALTERNATIVE_LABEL; removeLabel = MAVO_CONTEXT_MENU_MAYDECISION_SUBMENU_REMOVEFROMALTERNATIVE_LABEL; mavoCollections = ((MayDecision) mavoDecision).getAlternatives(); } else if (mavoDecision instanceof VarDecision) { decisionText = MAVO_CONTEXT_MENU_VARDECISION_LABEL; addLabel = MAVO_CONTEXT_MENU_VARDECISION_SUBMENU_ADDTODOMAIN_LABEL; removeLabel = MAVO_CONTEXT_MENU_VARDECISION_SUBMENU_REMOVEFROMDOMAIN_LABEL; mavoCollections = new ArrayList<MAVOCollection>(); mavoCollections.add(((VarDecision) mavoDecision).getDomain()); } else if (mavoDecision instanceof SetDecision) { decisionText = MAVO_CONTEXT_MENU_SETDECISION_LABEL; addLabel = MAVO_CONTEXT_MENU_SETDECISION_SUBMENU_ADDTOENTITY_LABEL; removeLabel = MAVO_CONTEXT_MENU_SETDECISION_SUBMENU_REMOVEFROMENTITY_LABEL; mavoCollections = new ArrayList<MAVOCollection>(); mavoCollections.add(((SetDecision) mavoDecision).getEntity()); } decisionText += " " + mavoDecision.getFormulaVariable(); decisionItem.setText(decisionText); for (MAVOCollection mavoCollection : mavoCollections) { boolean add = mavoModelObjs.stream().allMatch(mavoModelObj -> !mavoModelObj.getCollections().contains(mavoCollection)); boolean remove = false; if (!add) { remove = mavoModelObjs.stream().allMatch(mavoModelObj -> mavoModelObj.getCollections().contains(mavoCollection)); } if (!add && !remove) { continue; } String addremoveText = ""; MIDContextMenuListener addremoveListener = null; if (add) { addremoveText = addLabel + " " + mavoCollection.getFormulaVariable(); addremoveListener = new MAVODiagramContextAddListener(addremoveText, mavoCollection, mavoModelObjs); } if (remove) { addremoveText = removeLabel + " " + mavoCollection.getFormulaVariable(); addremoveListener = new MAVODiagramContextRemoveListener(addremoveText, mavoCollection, mavoModelObjs); } MenuItem addremoveItem = new MenuItem(decisionMenu, SWT.NONE); addremoveItem.setText(addremoveText); addremoveItem.addSelectionListener(addremoveListener); } } } }