diff options
author | Martin Fluegge | 2010-06-05 19:28:18 +0000 |
---|---|---|
committer | Martin Fluegge | 2010-06-05 19:28:18 +0000 |
commit | 7693663e85bf22ae381526853648358bedb87a13 (patch) | |
tree | 41772694f69a483500ee8693b96e322ca566e4f9 /plugins/org.eclipse.emf.cdo.dawn.examples.acore.diagram/src/org/eclipse/emf/cdo/dawn/examples/acore/diagram/edit/policies/ACoreRootCanonicalEditPolicy.java | |
parent | 2ef4689f1ced4900910e87eadfb6b5049de29a50 (diff) | |
download | cdo-7693663e85bf22ae381526853648358bedb87a13.tar.gz cdo-7693663e85bf22ae381526853648358bedb87a13.tar.xz cdo-7693663e85bf22ae381526853648358bedb87a13.zip |
[308232] [Dawn] Develop collaborative support for GMF on CDO
https://bugs.eclipse.org/bugs/show_bug.cgi?id=308232
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.dawn.examples.acore.diagram/src/org/eclipse/emf/cdo/dawn/examples/acore/diagram/edit/policies/ACoreRootCanonicalEditPolicy.java')
-rw-r--r-- | plugins/org.eclipse.emf.cdo.dawn.examples.acore.diagram/src/org/eclipse/emf/cdo/dawn/examples/acore/diagram/edit/policies/ACoreRootCanonicalEditPolicy.java | 345 |
1 files changed, 345 insertions, 0 deletions
diff --git a/plugins/org.eclipse.emf.cdo.dawn.examples.acore.diagram/src/org/eclipse/emf/cdo/dawn/examples/acore/diagram/edit/policies/ACoreRootCanonicalEditPolicy.java b/plugins/org.eclipse.emf.cdo.dawn.examples.acore.diagram/src/org/eclipse/emf/cdo/dawn/examples/acore/diagram/edit/policies/ACoreRootCanonicalEditPolicy.java new file mode 100644 index 0000000000..fa983769ad --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.dawn.examples.acore.diagram/src/org/eclipse/emf/cdo/dawn/examples/acore/diagram/edit/policies/ACoreRootCanonicalEditPolicy.java @@ -0,0 +1,345 @@ +/* + * Copyright (c) 2004 - 2010 Eike Stepper (Berlin, Germany). + * 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: + * Martin Fluegge - initial API and implementation + * + */ +package org.eclipse.emf.cdo.dawn.examples.acore.diagram.edit.policies; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.eclipse.core.runtime.IAdaptable; +import org.eclipse.emf.cdo.dawn.examples.acore.AcorePackage; +import org.eclipse.emf.cdo.dawn.examples.acore.diagram.edit.parts.AClassEditPart; +import org.eclipse.emf.cdo.dawn.examples.acore.diagram.edit.parts.ACoreRootEditPart; +import org.eclipse.emf.cdo.dawn.examples.acore.diagram.edit.parts.AInterfaceEditPart; +import org.eclipse.emf.cdo.dawn.examples.acore.diagram.part.AcoreDiagramUpdater; +import org.eclipse.emf.cdo.dawn.examples.acore.diagram.part.AcoreLinkDescriptor; +import org.eclipse.emf.cdo.dawn.examples.acore.diagram.part.AcoreNodeDescriptor; +import org.eclipse.emf.cdo.dawn.examples.acore.diagram.part.AcoreVisualIDRegistry; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EStructuralFeature; +import org.eclipse.gef.EditPart; +import org.eclipse.gef.commands.Command; +import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil; +import org.eclipse.gmf.runtime.diagram.ui.commands.DeferredLayoutCommand; +import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy; +import org.eclipse.gmf.runtime.diagram.ui.commands.SetViewMutabilityCommand; +import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart; +import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy; +import org.eclipse.gmf.runtime.diagram.ui.requests.CreateConnectionViewRequest; +import org.eclipse.gmf.runtime.diagram.ui.requests.CreateViewRequest; +import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants; +import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter; +import org.eclipse.gmf.runtime.notation.Diagram; +import org.eclipse.gmf.runtime.notation.Edge; +import org.eclipse.gmf.runtime.notation.Node; +import org.eclipse.gmf.runtime.notation.View; + +/** + * @generated + */ +public class ACoreRootCanonicalEditPolicy extends CanonicalEditPolicy +{ + + /** + * @generated + */ + Set<EStructuralFeature> myFeaturesToSynchronize; + + /** + * @generated + */ + protected List getSemanticChildrenList() + { + View viewObject = (View)getHost().getModel(); + LinkedList<EObject> result = new LinkedList<EObject>(); + List<AcoreNodeDescriptor> childDescriptors = AcoreDiagramUpdater.getACoreRoot_1000SemanticChildren(viewObject); + for (Iterator<AcoreNodeDescriptor> it = childDescriptors.iterator(); it.hasNext();) + { + AcoreNodeDescriptor d = it.next(); + result.add(d.getModelElement()); + } + return result; + } + + /** + * @generated + */ + protected boolean shouldDeleteView(View view) + { + return true; + } + + /** + * @generated + */ + protected boolean isOrphaned(Collection semanticChildren, final View view) + { + int visualID = AcoreVisualIDRegistry.getVisualID(view); + switch (visualID) + { + case AInterfaceEditPart.VISUAL_ID: + case AClassEditPart.VISUAL_ID: + if (!semanticChildren.contains(view.getElement())) + { + return true; + } + } + return false; + } + + /** + * @generated + */ + protected Set getFeaturesToSynchronize() + { + if (myFeaturesToSynchronize == null) + { + myFeaturesToSynchronize = new HashSet<EStructuralFeature>(); + myFeaturesToSynchronize.add(AcorePackage.eINSTANCE.getACoreRoot_Interfaces()); + myFeaturesToSynchronize.add(AcorePackage.eINSTANCE.getACoreRoot_Classes()); + } + return myFeaturesToSynchronize; + } + + /** + * @generated + */ + protected void refreshSemantic() + { + if (resolveSemanticElement() == null) + { + return; + } + LinkedList<IAdaptable> createdViews = new LinkedList<IAdaptable>(); + // refreshSemanticChildren() alternative + List<AcoreNodeDescriptor> childDescriptors = AcoreDiagramUpdater.getACoreRoot_1000SemanticChildren((View)getHost() + .getModel()); + ArrayList<EObject> semanticChildren = new ArrayList<EObject>(childDescriptors.size()); + for (Iterator<AcoreNodeDescriptor> it = childDescriptors.iterator(); it.hasNext();) + { + AcoreNodeDescriptor next = it.next(); + semanticChildren.add(next.getModelElement()); + } + List<View> orphaned = cleanCanonicalSemanticChildren(getViewChildren(), semanticChildren); + boolean changed = deleteViews(orphaned.iterator()); + // leave descriptors that reference survived semanticChildren. + // NOTE, we may want to stop using cleanCanonicalSemanticChildren() here, replacing with own code, that respects NodeDescriptors + for (Iterator<AcoreNodeDescriptor> it = childDescriptors.iterator(); it.hasNext();) + { + AcoreNodeDescriptor next = it.next(); + if (!semanticChildren.contains(next.getModelElement())) + { + it.remove(); + } + } + ArrayList<CreateViewRequest.ViewDescriptor> viewDescriptors = new ArrayList<CreateViewRequest.ViewDescriptor>( + childDescriptors.size()); + for (Iterator<AcoreNodeDescriptor> it = childDescriptors.iterator(); it.hasNext();) + { + AcoreNodeDescriptor next = it.next(); + String hint = AcoreVisualIDRegistry.getType(next.getVisualID()); + IAdaptable elementAdapter = new CanonicalElementAdapter(next.getModelElement(), hint); + viewDescriptors.add(new CreateViewRequest.ViewDescriptor(elementAdapter, Node.class, hint, ViewUtil.APPEND, + false, host().getDiagramPreferencesHint())); + } + // + CreateViewRequest request = getCreateViewRequest(viewDescriptors); + Command cmd = getCreateViewCommand(request); + if (cmd != null && cmd.canExecute()) + { + SetViewMutabilityCommand.makeMutable(new EObjectAdapter(host().getNotationView())).execute(); + executeCommand(cmd); + createdViews.addAll((List<IAdaptable>)request.getNewObject()); + } + if (changed || createdViews.size() > 0) + { + postProcessRefreshSemantic(createdViews); + } + Collection<IAdaptable> createdConnectionViews = refreshConnections(); + + if (createdViews.size() > 1) + { + // perform a layout of the container + DeferredLayoutCommand layoutCmd = new DeferredLayoutCommand(host().getEditingDomain(), createdViews, host()); + executeCommand(new ICommandProxy(layoutCmd)); + } + + createdViews.addAll(createdConnectionViews); + makeViewsImmutable(createdViews); + } + + /** + * @generated + */ + private Diagram getDiagram() + { + return ((View)getHost().getModel()).getDiagram(); + } + + /** + * @generated + */ + private Collection<IAdaptable> refreshConnections() + { + Map<EObject, View> domain2NotationMap = new HashMap<EObject, View>(); + Collection<AcoreLinkDescriptor> linkDescriptors = collectAllLinks(getDiagram(), domain2NotationMap); + Collection existingLinks = new LinkedList(getDiagram().getEdges()); + for (Iterator linksIterator = existingLinks.iterator(); linksIterator.hasNext();) + { + Edge nextDiagramLink = (Edge)linksIterator.next(); + int diagramLinkVisualID = AcoreVisualIDRegistry.getVisualID(nextDiagramLink); + if (diagramLinkVisualID == -1) + { + if (nextDiagramLink.getSource() != null && nextDiagramLink.getTarget() != null) + { + linksIterator.remove(); + } + continue; + } + EObject diagramLinkObject = nextDiagramLink.getElement(); + EObject diagramLinkSrc = nextDiagramLink.getSource().getElement(); + EObject diagramLinkDst = nextDiagramLink.getTarget().getElement(); + for (Iterator<AcoreLinkDescriptor> linkDescriptorsIterator = linkDescriptors.iterator(); linkDescriptorsIterator + .hasNext();) + { + AcoreLinkDescriptor nextLinkDescriptor = linkDescriptorsIterator.next(); + if (diagramLinkObject == nextLinkDescriptor.getModelElement() + && diagramLinkSrc == nextLinkDescriptor.getSource() + && diagramLinkDst == nextLinkDescriptor.getDestination() + && diagramLinkVisualID == nextLinkDescriptor.getVisualID()) + { + linksIterator.remove(); + linkDescriptorsIterator.remove(); + break; + } + } + } + deleteViews(existingLinks.iterator()); + return createConnections(linkDescriptors, domain2NotationMap); + } + + /** + * @generated + */ + private Collection<AcoreLinkDescriptor> collectAllLinks(View view, Map<EObject, View> domain2NotationMap) + { + if (!ACoreRootEditPart.MODEL_ID.equals(AcoreVisualIDRegistry.getModelID(view))) + { + return Collections.emptyList(); + } + LinkedList<AcoreLinkDescriptor> result = new LinkedList<AcoreLinkDescriptor>(); + switch (AcoreVisualIDRegistry.getVisualID(view)) + { + case ACoreRootEditPart.VISUAL_ID: + { + if (!domain2NotationMap.containsKey(view.getElement())) + { + result.addAll(AcoreDiagramUpdater.getACoreRoot_1000ContainedLinks(view)); + } + if (!domain2NotationMap.containsKey(view.getElement()) || view.getEAnnotation("Shortcut") == null) { //$NON-NLS-1$ + domain2NotationMap.put(view.getElement(), view); + } + break; + } + case AInterfaceEditPart.VISUAL_ID: + { + if (!domain2NotationMap.containsKey(view.getElement())) + { + result.addAll(AcoreDiagramUpdater.getAInterface_2001ContainedLinks(view)); + } + if (!domain2NotationMap.containsKey(view.getElement()) || view.getEAnnotation("Shortcut") == null) { //$NON-NLS-1$ + domain2NotationMap.put(view.getElement(), view); + } + break; + } + case AClassEditPart.VISUAL_ID: + { + if (!domain2NotationMap.containsKey(view.getElement())) + { + result.addAll(AcoreDiagramUpdater.getAClass_2002ContainedLinks(view)); + } + if (!domain2NotationMap.containsKey(view.getElement()) || view.getEAnnotation("Shortcut") == null) { //$NON-NLS-1$ + domain2NotationMap.put(view.getElement(), view); + } + break; + } + } + for (Iterator children = view.getChildren().iterator(); children.hasNext();) + { + result.addAll(collectAllLinks((View)children.next(), domain2NotationMap)); + } + for (Iterator edges = view.getSourceEdges().iterator(); edges.hasNext();) + { + result.addAll(collectAllLinks((View)edges.next(), domain2NotationMap)); + } + return result; + } + + /** + * @generated + */ + private Collection<IAdaptable> createConnections(Collection<AcoreLinkDescriptor> linkDescriptors, + Map<EObject, View> domain2NotationMap) + { + LinkedList<IAdaptable> adapters = new LinkedList<IAdaptable>(); + for (Iterator<AcoreLinkDescriptor> it = linkDescriptors.iterator(); it.hasNext();) + { + AcoreLinkDescriptor nextLinkDescriptor = it.next(); + EditPart sourceEditPart = getEditPart(nextLinkDescriptor.getSource(), domain2NotationMap); + EditPart targetEditPart = getEditPart(nextLinkDescriptor.getDestination(), domain2NotationMap); + if (sourceEditPart == null || targetEditPart == null) + { + continue; + } + CreateConnectionViewRequest.ConnectionViewDescriptor descriptor = new CreateConnectionViewRequest.ConnectionViewDescriptor( + nextLinkDescriptor.getSemanticAdapter(), String.valueOf(nextLinkDescriptor.getVisualID()), ViewUtil.APPEND, + false, ((IGraphicalEditPart)getHost()).getDiagramPreferencesHint()); + CreateConnectionViewRequest ccr = new CreateConnectionViewRequest(descriptor); + ccr.setType(RequestConstants.REQ_CONNECTION_START); + ccr.setSourceEditPart(sourceEditPart); + sourceEditPart.getCommand(ccr); + ccr.setTargetEditPart(targetEditPart); + ccr.setType(RequestConstants.REQ_CONNECTION_END); + Command cmd = targetEditPart.getCommand(ccr); + if (cmd != null && cmd.canExecute()) + { + executeCommand(cmd); + IAdaptable viewAdapter = (IAdaptable)ccr.getNewObject(); + if (viewAdapter != null) + { + adapters.add(viewAdapter); + } + } + } + return adapters; + } + + /** + * @generated + */ + private EditPart getEditPart(EObject domainModelElement, Map<EObject, View> domain2NotationMap) + { + View view = (View)domain2NotationMap.get(domainModelElement); + if (view != null) + { + return (EditPart)getHost().getViewer().getEditPartRegistry().get(view); + } + return null; + } +} |