/*******************************************************************************
* Copyright (c) 2008 itemis AG (http://www.itemis.eu) and others.
* 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
*******************************************************************************/
package de.itemis.gmf.runtime.edit.policy;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalConnectionEditPolicy;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.gmf.runtime.notation.Edge;
import org.eclipse.gmf.runtime.notation.View;
/**
* A new superclass for the canonical diagram edit policy generated by GMF.
* Allows to manually add edges.
*
* @author koehnlein
*/
public abstract class SemiCanonicalDiagramEditPolicy extends
CanonicalConnectionEditPolicy {
/*
* Additional public API
*/
public static final String SEMI_CANONICAL_ROLE = "SemiCanonicalRole";
@SuppressWarnings("unchecked")
public void addConnections(Collection<EObject> connectableSemanticElements) {
Diagram diagram = ((View) getHost().getModel()).getDiagram();
HashMap domain2NotationMap = new HashMap();
Collection allLinks = collectAllLinks(diagram, domain2NotationMap);
removeExistingAndIrrelevantLinks(allLinks, connectableSemanticElements,
diagram);
createConnections(allLinks, domain2NotationMap);
}
/*
* Methods generated by GMF. Change visibility in template
*/
@SuppressWarnings("unchecked")
protected abstract Collection collectAllLinks(View view,
Map domain2NotationMap);
@SuppressWarnings("unchecked")
protected abstract Collection createConnections(Collection linkDescriptors,
Map domain2NotationMap);
/*
* Methods to be implemented in generated code as they refer to the
* statically typed classes XXXLinkDescriptor and XXXVisualIDRegistry.
*/
protected abstract boolean isLinkSourceInList(Object linkDescriptor,
Collection<EObject> connectableElements);
protected abstract boolean isLinkTargetInList(Object linkDescriptor,
Collection<EObject> connectableElements);
protected abstract boolean isDescriptorMatchesEdge(Object linkDescriptor,
Edge edge);
/*
* Internal stuff
*/
@SuppressWarnings("unchecked")
private Collection removeExistingAndIrrelevantLinks(Collection allLinks,
Collection<EObject> selectedSemanticElements, Diagram diagram) {
EList existingConnections = diagram.getEdges();
ALL_LINKS: for (Iterator iterator = allLinks.iterator(); iterator
.hasNext();) {
Object linkDescriptor = iterator.next();
if (!isLinkSourceInList(linkDescriptor, selectedSemanticElements)
&& !isLinkTargetInList(linkDescriptor,
selectedSemanticElements)) {
iterator.remove();
continue ALL_LINKS;
}
for (Object existingConnection : existingConnections) {
if (isDescriptorMatchesEdge(linkDescriptor,
(Edge) existingConnection)) {
iterator.remove();
continue ALL_LINKS;
}
}
}
return allLinks;
}
}