/***************************************************************************** * Copyright (c) 2011 Atos. * * * 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: * Arthur Daussy (Atos) - Initial API and implementation * Arthur Daussy - 371712 : [Activitydiagram] Papyrus should provide a way to manually resynchronize pins and parameters on Call Actions * *****************************************************************************/ package org.eclipse.papyrus.uml.diagram.activity.handlers; import java.util.ArrayList; import java.util.Collection; import java.util.List; 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.emf.edit.domain.AdapterFactoryEditingDomain; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.gmf.runtime.notation.View; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.papyrus.infra.core.modelsetquery.ModelSetQuery; import org.eclipse.papyrus.infra.widgets.toolbox.notification.NotificationRunnable; import org.eclipse.papyrus.infra.widgets.toolbox.notification.Type; import org.eclipse.papyrus.infra.widgets.toolbox.notification.builders.IContext; import org.eclipse.papyrus.infra.widgets.toolbox.notification.builders.NotificationBuilder; import org.eclipse.ui.handlers.HandlerUtil; import org.eclipse.uml2.uml.InvocationAction; import org.eclipse.uml2.uml.NamedElement; import org.eclipse.uml2.uml.Package; import org.eclipse.uml2.uml.UMLPackage; /** * Handler to synchronize all call Action of the model * * @author adaussy * */ public class GlobalSynchronizePinsParametersHandler extends AbstractSynchronizePinsAndParameters { public Object execute(ExecutionEvent event) throws ExecutionException { ISelection selection = HandlerUtil.getActiveMenuSelection(event); if(selection instanceof StructuredSelection) { StructuredSelection structuredSelection = (StructuredSelection)selection; Object obj = structuredSelection.getFirstElement(); EObject element = null; if(obj instanceof IAdaptable) { element = (EObject)((IAdaptable)obj).getAdapter(EObject.class); if(element instanceof View) { element = ((View)element).getElement(); } if(element instanceof Package) { Package pack = (Package)element; final Collection<EObject> objectsOfType = ModelSetQuery.getObjectsOfType(pack, UMLPackage.Literals.INVOCATION_ACTION); new NotificationBuilder().setAsynchronous(false).setType(Type.WARNING).setHTML(true).setMessage(getCallActionToSync(objectsOfType)).addAction(new NotificationRunnable() { public void run(IContext context) { for(EObject ca : objectsOfType) { if(ca instanceof InvocationAction) { EditingDomain editingDomain = AdapterFactoryEditingDomain.getEditingDomainFor(ca); if(!editingDomain.isReadOnly(ca.eResource())) { SynchronizePinsParametersHandler.syncInvocationAction((InvocationAction)ca); } } } } public String getLabel() { return "Synchronize"; } }).addAction(new NotificationRunnable() { public void run(IContext context) { // Do Nothing } public String getLabel() { return "Cancel"; } }).run(); } } } return null; } protected String getCallActionToSync(Collection<EObject> objectsOfType) { StringBuilder builder = new StringBuilder("<form><p>The following Call Actions will be synchronized : </p>");////$NON-NLS-1$ List<EObject> readOnlyresource = new ArrayList<EObject>(); for(EObject e : objectsOfType) { EditingDomain editingDomain = AdapterFactoryEditingDomain.getEditingDomainFor(e); boolean isReadOnly = editingDomain.isReadOnly(e.eResource()); if(!isReadOnly) { if(e instanceof NamedElement) { builder.append("<li>"); builder.append(((NamedElement)e).getQualifiedName()); builder.append("</li>"); } } else { readOnlyresource.add(e); } } if(!readOnlyresource.isEmpty()) { builder.append("<p> </p><p>The following Call Actions will not be synchronized because the are is read only mode :</p>"); for(EObject e : readOnlyresource) { if(e instanceof NamedElement) { builder.append("<li>").append(((NamedElement)e).getQualifiedName()).append("</li>"); } } } builder.append("</form>"); return builder.toString(); } }