blob: c4b63d8097f5d59d2312cfd4c1c3001d3f1e0ea7 [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2005, 2007 IBM Corporation 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
*
* Contributors:
* IBM Corporation - initial API and implementation
****************************************************************************/
package org.eclipse.gmf.examples.runtime.diagram.logic.internal.editpolicies;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.ListIterator;
import org.eclipse.emf.common.util.UniqueEList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.gmf.examples.runtime.diagram.logic.semantic.Circuit;
import org.eclipse.gmf.examples.runtime.diagram.logic.semantic.Element;
import org.eclipse.gmf.examples.runtime.diagram.logic.semantic.Wire;
import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalConnectionEditPolicy;
import org.eclipse.gmf.runtime.notation.View;
/**
* CanonicalConnectionEditPolic implementation that synchronizes with the semantic
* contents of the Circuit element.
*
* @author sshaw
*
*/
public class CircuitCompartmentCanonicalEditPolicy extends CanonicalConnectionEditPolicy {
/*
* (non-Javadoc)
* @see org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy#getSemanticChildrenList()
*/
protected List getSemanticChildrenList() {
EObject modelRef = resolveSemanticElement();
Circuit circuitElement = (Circuit) modelRef;
if (circuitElement==null)
return Collections.EMPTY_LIST;
List allChildren = circuitElement.getChildren();
List ledElements = new ArrayList();
ListIterator li = allChildren.listIterator();
while (li.hasNext()) {
Object obj = li.next();
if (obj instanceof Element && !(obj instanceof Wire))
ledElements.add(obj);
}
return ledElements;
}
/* (non-Javadoc)
* @see org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalConnectionEditPolicy#getSemanticConnectionsList()
*/
protected List getSemanticConnectionsList() {
EObject modelRef = resolveSemanticElement();
Circuit circuitElement = (Circuit) modelRef;
if (circuitElement==null)
return Collections.EMPTY_LIST;
List allChildren = circuitElement.getChildren();
ListIterator li = allChildren.listIterator();
UniqueEList wires = new UniqueEList();
while (li.hasNext()) {
Object obj = li.next();
if (obj instanceof Wire) {
Wire wire = (Wire)obj;
if (isWirePartOfContainer(circuitElement, wire))
//checks if the wire maps to the same circuit
if (! (wire.getSource().eContainer().equals(circuitElement)
&& (wire.getTarget().eContainer().equals(circuitElement)))){
wires.add(wire);
}
}
}
return wires;
}
private boolean isWirePartOfContainer(Circuit circuitElement, Wire wire) {
if (EcoreUtil.isAncestor(circuitElement, wire.getSource()) &&
EcoreUtil.isAncestor(circuitElement, wire.getTarget())) {
return true;
}
else {
if ((!wire.getSource().eContainer().equals(circuitElement) &&
EcoreUtil.isAncestor(circuitElement, wire.getSource().eContainer())) ||
(!wire.getTarget().eContainer().equals(circuitElement) &&
EcoreUtil.isAncestor(circuitElement, wire.getTarget().eContainer()))) {
return true;
}
}
return false;
}
/*
* (non-Javadoc)
* @see org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy#shouldDeleteView(org.eclipse.gmf.runtime.notation.View)
*/
protected boolean shouldDeleteView(View view) {
EObject modelRef = resolveSemanticElement();
Circuit circuitElement = (Circuit) modelRef;
EObject semEl = ViewUtil.resolveSemanticElement(view);
if (semEl != null) {
if (semEl instanceof Wire) {
Wire wire = (Wire)semEl;
if (wire.eContainer().equals(circuitElement) &&
isWirePartOfContainer(circuitElement, wire))
return true;
}
else if (semEl instanceof Element) {
return true;
}
}
return false;
}
/*
* (non-Javadoc)
* @see org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalConnectionEditPolicy#getSourceElement(org.eclipse.emf.ecore.EObject)
*/
protected EObject getSourceElement(EObject relationship) {
Wire wire = (Wire)relationship;
return wire.getSource();
}
/*
* (non-Javadoc)
* @see org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalConnectionEditPolicy#getTargetElement(org.eclipse.emf.ecore.EObject)
*/
protected EObject getTargetElement(EObject relationship) {
Wire wire = (Wire)relationship;
return wire.getTarget();
}
}