/** * Copyright (c) 2012-2016 Marsha Chechik, Alessio Di Sandro, Michalis Famelis, * Rick Salay, Naama Ben-David. * 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 - Initial implementation. * Alessio Di Sandro - Refactoring and fixes. */ package edu.toronto.cs.se.mmint.mavo.diagram.context; import java.util.List; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.transaction.TransactionalEditingDomain; import org.eclipse.emf.transaction.util.TransactionUtil; import org.eclipse.gmf.runtime.common.core.command.CommandResult; import org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.swt.events.SelectionEvent; 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.MAVOFactory; 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.mavo.diagram.MAVODiagramEditor; import edu.toronto.cs.se.mmint.mavo.library.MAVOUtils; import edu.toronto.cs.se.mmint.mid.diagram.library.MIDContextMenuListener; import edu.toronto.cs.se.mmint.mid.diagram.library.MIDDiagramUtils; public class MAVODiagramContextAddListener extends MIDContextMenuListener { private static final String MAVO_DECISION_FORMULA_PREFIX = "d"; private static final String MAY_ALTERNATIVE_FORMULA_PREFIX = "a"; private static final String VAR_DOMAIN_FORMULA_PREFIX = "d"; private static final String SET_ENTITY_FORMULA_PREFIX = "e"; private EObject mavoContainer; private EClass mavoDecisionType; private List<MAVOElement> mavoModelObjs; public MAVODiagramContextAddListener(@NonNull String menuLabel, @NonNull MAVORoot mavoRootModelObj, @NonNull EClass mavoDecisionType) { super(menuLabel); mavoContainer = mavoRootModelObj; this.mavoDecisionType = mavoDecisionType; mavoModelObjs = null; } public MAVODiagramContextAddListener(@NonNull String menuLabel, @NonNull MAVODecision mavoDecision) { super(menuLabel); mavoContainer = mavoDecision; mavoDecisionType = null; mavoModelObjs = null; } public MAVODiagramContextAddListener(@NonNull String menuLabel, @NonNull MAVOCollection mavoCollection, @NonNull List<MAVOElement> mavoModelObjs) { super(menuLabel); mavoContainer = mavoCollection; mavoDecisionType = null; this.mavoModelObjs = mavoModelObjs; } @Override public void widgetSelected(SelectionEvent e) { AbstractTransactionalCommand command = new MAVODiagramContextAddCommand( TransactionUtil.getEditingDomain(mavoContainer), menuLabel, MIDDiagramUtils.getActiveInstanceMIDFiles() ); runListenerCommand(command); } protected class MAVODiagramContextAddCommand extends AbstractTransactionalCommand { public MAVODiagramContextAddCommand(@NonNull TransactionalEditingDomain domain, @NonNull String label, @NonNull List<IFile> affectedFiles) { super(domain, label, affectedFiles); } @Override protected IStatus doUndo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException { IStatus status = super.doUndo(monitor, info); // refresh MAVODiagramEditor mavoDiagram = (MAVODiagramEditor) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor(); mavoDiagram.getOutlinePage().refresh(); return status; } @Override protected IStatus doRedo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException { IStatus status = super.doRedo(monitor, info); // refresh MAVODiagramEditor mavoDiagram = (MAVODiagramEditor) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor(); mavoDiagram.getOutlinePage().refresh(); return status; } @Override protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info) throws ExecutionException { if (mavoContainer instanceof MAVORoot) { MAVORoot mavoRootModelObj = (MAVORoot) mavoContainer; MAVODecision mavoDecision = (MAVODecision) MAVOFactory.eINSTANCE.create(mavoDecisionType); mavoRootModelObj.getDecisions().add(mavoDecision); mavoDecision.setFormulaVariable(MAVO_DECISION_FORMULA_PREFIX + mavoRootModelObj.getDecisions().size()); } else if (mavoContainer instanceof MAVODecision) { MAVODecision mavoDecision = (MAVODecision) mavoContainer; MAVOCollection mavoCollection = MAVOFactory.eINSTANCE.createMAVOCollection(); String suffix = ""; if (mavoContainer instanceof MayDecision) { MayDecision mayDecision = (MayDecision) mavoDecision; mayDecision.getAlternatives().add(mavoCollection); suffix = MAY_ALTERNATIVE_FORMULA_PREFIX + mayDecision.getAlternatives().size(); } else if (mavoContainer instanceof VarDecision) { VarDecision varDecision = (VarDecision) mavoDecision; varDecision.setDomain(mavoCollection); suffix = VAR_DOMAIN_FORMULA_PREFIX; } else if (mavoContainer instanceof SetDecision) { SetDecision setDecision = (SetDecision) mavoDecision; setDecision.setEntity(mavoCollection); suffix = SET_ENTITY_FORMULA_PREFIX; } mavoCollection.setFormulaVariable(mavoDecision.getFormulaVariable() + suffix); } else if (mavoContainer instanceof MAVOCollection) { ((MAVOCollection) mavoContainer).getMavoElements().addAll(mavoModelObjs); if (mavoContainer.eContainer() instanceof MayDecision) { mavoModelObjs.forEach(mavoModelObj -> MAVOUtils.setMay(mavoModelObj, true)); } else if (mavoContainer.eContainer() instanceof VarDecision) { mavoModelObjs.forEach(mavoModelObj -> MAVOUtils.setVar(mavoModelObj, true)); } else if (mavoContainer.eContainer() instanceof SetDecision) { mavoModelObjs.forEach(mavoModelObj -> MAVOUtils.setSet(mavoModelObj, true)); } } // refresh MAVODiagramEditor mavoDiagram = (MAVODiagramEditor) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor(); mavoDiagram.getOutlinePage().refresh(); return CommandResult.newOKCommandResult(); } } }