//------------------------------------------------------------------------------ // Copyright (c) 2005, 2006 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 implementation //------------------------------------------------------------------------------ package org.eclipse.epf.diagram.model.impl; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import org.eclipse.draw2d.geometry.Point; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.common.notify.NotificationChain; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.InternalEObject; import org.eclipse.emf.ecore.util.InternalEList; import org.eclipse.epf.diagram.model.Link; import org.eclipse.epf.diagram.model.ModelPackage; import org.eclipse.epf.diagram.model.Node; import org.eclipse.epf.diagram.model.TypedNode; import org.eclipse.epf.diagram.model.WorkBreakdownElementNode; import org.eclipse.epf.diagram.model.util.GraphicalDataHelper; import org.eclipse.epf.uma.MethodElement; import org.eclipse.epf.uma.UmaPackage; import org.eclipse.epf.uma.WorkBreakdownElement; import org.eclipse.epf.uma.WorkOrder; import org.eclipse.epf.uma.util.UmaUtil; /** * <!-- begin-user-doc --> An implementation of the model object '<em><b>Work Breakdown Element Node</b></em>'. * <!-- end-user-doc --> * <p> * </p> * * @generated */ public class WorkBreakdownElementNodeImpl extends NamedNodeImpl implements WorkBreakdownElementNode { /** * <!-- begin-user-doc --> <!-- end-user-doc --> */ protected WorkBreakdownElementNodeImpl() { super(); methodElementAdapter = new WorkBreakdownElementAdapter(); } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * @generated */ @Override protected EClass eStaticClass() { return ModelPackage.Literals.WORK_BREAKDOWN_ELEMENT_NODE; } private class WorkBreakdownElementAdapter extends MethodElementAdapter { /* * (non-Javadoc) * * @see org.eclipse.emf.common.notify.impl.AdapterImpl#notifyChanged(org.eclipse.emf.common.notify.Notification) */ public void notifyChanged(Notification msg) { if (!notificationEnabled) return; notificationEnabled = false; try { WorkOrder obj; switch (msg.getFeatureID(WorkBreakdownElement.class)) { case UmaPackage.WORK_BREAKDOWN_ELEMENT__LINK_TO_PREDECESSOR: switch (msg.getEventType()) { case Notification.ADD: obj = (WorkOrder) msg.getNewValue(); addIncomingConnection(obj.getPred()); return; case Notification.REMOVE: obj = (WorkOrder) msg.getOldValue(); removeIncomingConnection(obj.getPred()); return; case Notification.ADD_MANY: Collection collection = (Collection) msg.getNewValue(); for (Iterator iter = collection.iterator(); iter .hasNext();) { obj = (WorkOrder) iter.next(); addIncomingConnection(obj.getPred()); } return; case Notification.REMOVE_MANY: collection = (Collection) msg.getOldValue(); for (Iterator iter = collection.iterator(); iter .hasNext();) { obj = (WorkOrder) iter.next(); removeIncomingConnection(obj.getPred()); } return; } break; } } finally { notificationEnabled = true; } super.notifyChanged(msg); } } protected void removeFromUMA(Link link, Node oldSource, Node oldTarget) { if (oldTarget instanceof WorkBreakdownElementNode) { // this is a direct link // remove WorkOrder // // GraphEdge edge = (GraphEdge) link.getObject(); // WorkOrder order = (WorkOrder) // ((UMASemanticModelBridge)edge.getSemanticModel()).getElement(); // WorkBreakdownElement be = UmaUtil.getOwner(order); // if(be != null) { NamedNodeImpl target = (NamedNodeImpl) oldTarget; boolean notify = target.notificationEnabled; try { target.notificationEnabled = false; // be.getLinkToPredecessor().remove(order); if (GraphicalDataHelper.canRemoveAllPreds(link, oldSource, oldTarget)) { while (UmaUtil.findWorkOrder((WorkBreakdownElement) target .getObject(), oldSource.getObject()) != null) { UmaUtil.removeWorkOrder((WorkBreakdownElement) target .getObject(), oldSource.getObject()); } } } finally { target.notificationEnabled = notify; } // } } else if (oldTarget instanceof TypedNode) { // get all the WorkBreakdownElementNodes that this TypedNode are // coming to and // remove the WorkOrders with this WorkBreakdownElementNode's // activity as predecessor from them // Collection actNodes = GraphicalDataHelper.getTargetNodes( (TypedNode) oldTarget, WorkBreakdownElementNode.class); for (Iterator iter = actNodes.iterator(); iter.hasNext();) { NamedNodeImpl node = (NamedNodeImpl) iter.next(); WorkBreakdownElement e = (WorkBreakdownElement) node .getObject(); boolean notify = node.notificationEnabled; try { node.notificationEnabled = false; if (GraphicalDataHelper.canRemoveAllPreds(link, oldSource, node)) { while (UmaUtil.findWorkOrder(e, oldSource.getObject()) != null) { UmaUtil.removeWorkOrder(e, oldSource.getObject()); } } } finally { node.notificationEnabled = notify; } } } // remove graphical data from UMA model // super.removeFromUMA(link, oldSource, oldTarget); } /** * @param link */ protected boolean addToUMA(Link link) { if (!super.addToUMA(link)) return false; Node src = link.getSource(); if (src instanceof WorkBreakdownElementNode) { // this is a direct link // add new WorkOrder object to UMA // WorkOrder order = null; WorkBreakdownElement succ = (WorkBreakdownElement) link.getTarget() .getObject(); WorkBreakdownElement pred = (WorkBreakdownElement) src.getObject(); if (UmaUtil.findWorkOrder(succ, pred) == null) { NodeImpl sourceNode = ((NodeImpl) src); boolean sourceNotify = sourceNode.notificationEnabled; try { sourceNode.notificationEnabled = false; //UmaUtil.createDefaultWorkOrder(succ, pred); //Create a workorder and disable notification flag. addDefaultWorkOrder((NamedNodeImpl)link.getTarget(), pred); } finally { sourceNode.notificationEnabled = sourceNotify; } } // set the WorkOrder as the element of the SemanticModel of the // link's GraphEdge // GraphicalDataHelper.setSemanticModel(link, order); } else if (src instanceof TypedNode) { // get all WorkBreakdownElementNodes that are comming to this // TypedNode, both directly and indirectly // and create work orders with their activity as predecessor // // Predecessor should be created only in case of // Syncronization Bar, not for DecisionPoint. if (((TypedNode) src).getType() == TypedNode.SYNCH_BAR) { Collection actNodes = new ArrayList(); // Get the collection incoming connection of syncbar // excluding decisionpoint incoming connection GraphicalDataHelper.getSyncBarSourceNodes((TypedNode)src, actNodes); WorkBreakdownElement succ = (WorkBreakdownElement) link .getTarget().getObject(); for (Iterator iter = actNodes.iterator(); iter.hasNext();) { Node node = (Node) iter.next(); WorkBreakdownElement pred = (WorkBreakdownElement) node .getObject(); if (UmaUtil.findWorkOrder(succ, pred) == null) { NodeImpl sourceNode = ((NodeImpl) node); boolean sourceNotify = sourceNode.notificationEnabled; try { sourceNode.notificationEnabled = false; //UmaUtil.createDefaultWorkOrder(succ, pred); // Create a workorder and disable notification flag. addDefaultWorkOrder((NamedNodeImpl)link.getTarget(),pred); } finally { sourceNode.notificationEnabled = sourceNotify; } } } } } return true; } protected Link addIncomingConnection(MethodElement source) { Link link = super.addIncomingConnection(source); if (link == null) return link; WorkOrder workOrder = UmaUtil.findWorkOrder( (WorkBreakdownElement) getObject(), source); GraphicalDataHelper.setSemanticModel(link, workOrder); return link; } protected Link addOutgoingConnection(MethodElement target) { Link link = super.addOutgoingConnection(target); WorkOrder workOrder = UmaUtil.findWorkOrder( (WorkBreakdownElement) target, getObject()); GraphicalDataHelper.setSemanticModel(link, workOrder); return link; } } // WorkBreakdownElementNodeImpl