/****************************************************************************** * 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(); } }