/***************************************************************************** * Copyright (c) 2012 CEA LIST. * * * 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: * CEA LIST - Initial API and implementation * *****************************************************************************/ package org.eclipse.papyrus.uml.oclconstraintevaluation; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.emf.ecore.EObject; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.handlers.HandlerUtil; import org.eclipse.uml2.uml.Constraint; import org.eclipse.uml2.uml.Element; import org.eclipse.uml2.uml.OpaqueExpression; import org.eclipse.uml2.uml.Profile; /** * this class is an handler that has in charge to launch an evaluation of the constraint contained in the body of the constraint * */ public class ComputeConstraintHandler extends AbstractHandler { /** * <pre> * Get the selected element, the first selected element if several are selected or null * if no selection or the selection is not an {@link EObject}. * * @return selected {@link EObject} or null * </pre> * */ protected EObject getSelectedElement() { EObject eObject = null; Object selection = null; // Get current selection selection = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService().getSelection(); // Get first element if the selection is an IStructuredSelection if(selection instanceof IStructuredSelection) { IStructuredSelection structuredSelection = (IStructuredSelection)selection; selection = structuredSelection.getFirstElement(); } // Treat non-null selected object (try to adapt and return EObject) if(selection != null) { if(selection instanceof IAdaptable) { selection = ((IAdaptable)selection).getAdapter(EObject.class); } if(selection instanceof EObject) { eObject = (EObject)selection; } } return eObject; } /** * * @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent) * * @param event * @return null * @throws ExecutionException */ public Object execute(ExecutionEvent event) throws ExecutionException { EObject selectedObject=getSelectedElement(); //test if this is a constraint if( selectedObject instanceof Constraint){ Constraint constraint= (Constraint)selectedObject; //test if this is an opaqueExpression if( constraint.getSpecification() instanceof OpaqueExpression){ OpaqueExpression opaqueExpression= ((OpaqueExpression)constraint.getSpecification()); //look for the good body named OCL int indexOfOCLBody=-1; for (int i = 0 ; i < opaqueExpression.getLanguages().size() && indexOfOCLBody == -1 ; i++) { if (opaqueExpression.getLanguages().get(i).equals("OCL")) { indexOfOCLBody = i ; } } if( indexOfOCLBody!=-1){ try { OCLEvaluationView view=(OCLEvaluationView)HandlerUtil.getActiveWorkbenchWindow(event).getActivePage().showView(OCLEvaluationView.ID); view.compute(constraint.getContext(), opaqueExpression.getBodies().get(indexOfOCLBody)); } catch (PartInitException e) { e.printStackTrace(); } } } } return null; } /** * return the root package from an element * @param elem the element * @return the root package */ protected org.eclipse.uml2.uml.Package getToPackage(Element elem){ org.eclipse.uml2.uml.Package tmp= elem.getNearestPackage(); while(tmp.getOwner()!=null && (tmp.getOwner()instanceof Package)){ tmp= (org.eclipse.uml2.uml.Package)tmp.getOwner(); } return tmp; } @Override public boolean isEnabled() { EObject eObject=getSelectedElement(); if( eObject instanceof Constraint){ if( !(getToPackage((Element)eObject) instanceof Profile)){ return true; } } return false; } }