This commit was manufactured by cvs2svn to create tag
'R1_0_M4_N20060726-1915'.
diff --git a/plugins/org.eclipse.epf.diagram/src/org/eclipse/epf/diagram/model/impl/NodeImpl.java b/plugins/org.eclipse.epf.diagram/src/org/eclipse/epf/diagram/model/impl/NodeImpl.java
new file mode 100755
index 0000000..a08652c
--- /dev/null
+++ b/plugins/org.eclipse.epf.diagram/src/org/eclipse/epf/diagram/model/impl/NodeImpl.java
@@ -0,0 +1,851 @@
+//------------------------------------------------------------------------------
+// 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.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.common.notify.impl.AdapterImpl;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
+import org.eclipse.emf.ecore.util.EObjectWithInverseResolvingEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+import org.eclipse.epf.diagram.model.Diagram;
+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.impl.NamedNodeImpl.MethodElementAdapter;
+import org.eclipse.epf.diagram.model.util.GraphicalDataHelper;
+import org.eclipse.epf.diagram.model.util.GraphicalDataManager;
+import org.eclipse.epf.diagram.model.util.INodeChangeListener;
+import org.eclipse.epf.uma.GraphNode;
+import org.eclipse.epf.uma.MethodElement;
+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>Node</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ * <li>{@link org.eclipse.epf.diagram.model.impl.NodeImpl#getLocation <em>Location</em>}</li>
+ * <li>{@link org.eclipse.epf.diagram.model.impl.NodeImpl#getWidth <em>Width</em>}</li>
+ * <li>{@link org.eclipse.epf.diagram.model.impl.NodeImpl#getHeight <em>Height</em>}</li>
+ * <li>{@link org.eclipse.epf.diagram.model.impl.NodeImpl#getIncomingConnections <em>Incoming Connections</em>}</li>
+ * <li>{@link org.eclipse.epf.diagram.model.impl.NodeImpl#getOutgoingConnections <em>Outgoing Connections</em>}</li>
+ * <li>{@link org.eclipse.epf.diagram.model.impl.NodeImpl#isReadOnly <em>Read Only</em>}</li>
+ * </ul>
+ * </p>
+ * 
+ * @generated
+ */
+public abstract class NodeImpl extends LinkedObjectImpl implements Node {
+	/**
+	 * The default value of the '{@link #getLocation() <em>Location</em>}'
+	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @see #getLocation()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final Point LOCATION_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getLocation() <em>Location</em>}'
+	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @see #getLocation()
+	 * @generated
+	 * @ordered
+	 */
+	protected Point location = LOCATION_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getWidth() <em>Width</em>}'
+	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @see #getWidth()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final int WIDTH_EDEFAULT = -1;
+
+	/**
+	 * The cached value of the '{@link #getWidth() <em>Width</em>}' attribute.
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @see #getWidth()
+	 * @generated
+	 * @ordered
+	 */
+	protected int width = WIDTH_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getHeight() <em>Height</em>}'
+	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @see #getHeight()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final int HEIGHT_EDEFAULT = -1;
+
+	/**
+	 * The cached value of the '{@link #getHeight() <em>Height</em>}'
+	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @see #getHeight()
+	 * @generated
+	 * @ordered
+	 */
+	protected int height = HEIGHT_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getIncomingConnections() <em>Incoming Connections</em>}'
+	 * reference list. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @see #getIncomingConnections()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList incomingConnections = null;
+
+	/**
+	 * The cached value of the '{@link #getOutgoingConnections() <em>Outgoing Connections</em>}'
+	 * containment reference list. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @see #getOutgoingConnections()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList outgoingConnections = null;
+
+	/**
+	 * The default value of the '{@link #isReadOnly() <em>Read Only</em>}'
+	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @see #isReadOnly()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean READ_ONLY_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isReadOnly() <em>Read Only</em>}'
+	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @see #isReadOnly()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean readOnly = READ_ONLY_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected NodeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected EClass eStaticClass() {
+		return ModelPackage.eINSTANCE.getNode();
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public Point getLocation() {
+		return location;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public void setLocation(Point newLocation) {
+		Point oldLocation = location;
+		location = newLocation;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+					ModelPackage.NODE__LOCATION, oldLocation, location));
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public int getWidth() {
+		return width;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public void setWidth(int newWidth) {
+		int oldWidth = width;
+		width = newWidth;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+					ModelPackage.NODE__WIDTH, oldWidth, width));
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public int getHeight() {
+		return height;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public void setHeight(int newHeight) {
+		int oldHeight = height;
+		height = newHeight;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+					ModelPackage.NODE__HEIGHT, oldHeight, height));
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public EList getIncomingConnections() {
+		if (incomingConnections == null) {
+			incomingConnections = new EObjectWithInverseResolvingEList(
+					Link.class, this, ModelPackage.NODE__INCOMING_CONNECTIONS,
+					ModelPackage.LINK__TARGET);
+		}
+		return incomingConnections;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public EList getOutgoingConnections() {
+		if (outgoingConnections == null) {
+			outgoingConnections = new EObjectContainmentWithInverseEList(
+					Link.class, this, ModelPackage.NODE__OUTGOING_CONNECTIONS,
+					ModelPackage.LINK__SOURCE);
+		}
+		return outgoingConnections;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public boolean isReadOnly() {
+		return readOnly;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public NotificationChain eInverseAdd(InternalEObject otherEnd,
+			int featureID, Class baseClass, NotificationChain msgs) {
+		if (featureID >= 0) {
+			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
+			case ModelPackage.NODE__INCOMING_CONNECTIONS:
+				return ((InternalEList) getIncomingConnections()).basicAdd(
+						otherEnd, msgs);
+			case ModelPackage.NODE__OUTGOING_CONNECTIONS:
+				return ((InternalEList) getOutgoingConnections()).basicAdd(
+						otherEnd, msgs);
+			default:
+				return eDynamicInverseAdd(otherEnd, featureID, baseClass, msgs);
+			}
+		}
+		if (eContainer != null)
+			msgs = eBasicRemoveFromContainer(msgs);
+		return eBasicSetContainer(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public NotificationChain eInverseRemove(InternalEObject otherEnd,
+			int featureID, Class baseClass, NotificationChain msgs) {
+		if (featureID >= 0) {
+			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
+			case ModelPackage.NODE__INCOMING_CONNECTIONS:
+				return ((InternalEList) getIncomingConnections()).basicRemove(
+						otherEnd, msgs);
+			case ModelPackage.NODE__OUTGOING_CONNECTIONS:
+				return ((InternalEList) getOutgoingConnections()).basicRemove(
+						otherEnd, msgs);
+			default:
+				return eDynamicInverseRemove(otherEnd, featureID, baseClass,
+						msgs);
+			}
+		}
+		return eBasicSetContainer(null, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
+		switch (eDerivedStructuralFeatureID(eFeature)) {
+		case ModelPackage.NODE__OBJECT:
+			return getObject();
+		case ModelPackage.NODE__LOCATION:
+			return getLocation();
+		case ModelPackage.NODE__WIDTH:
+			return new Integer(getWidth());
+		case ModelPackage.NODE__HEIGHT:
+			return new Integer(getHeight());
+		case ModelPackage.NODE__INCOMING_CONNECTIONS:
+			return getIncomingConnections();
+		case ModelPackage.NODE__OUTGOING_CONNECTIONS:
+			return getOutgoingConnections();
+		case ModelPackage.NODE__READ_ONLY:
+			return isReadOnly() ? Boolean.TRUE : Boolean.FALSE;
+		}
+		return eDynamicGet(eFeature, resolve);
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public void eSet(EStructuralFeature eFeature, Object newValue) {
+		switch (eDerivedStructuralFeatureID(eFeature)) {
+		case ModelPackage.NODE__OBJECT:
+			setObject((Object) newValue);
+			return;
+		case ModelPackage.NODE__LOCATION:
+			setLocation((Point) newValue);
+			return;
+		case ModelPackage.NODE__WIDTH:
+			setWidth(((Integer) newValue).intValue());
+			return;
+		case ModelPackage.NODE__HEIGHT:
+			setHeight(((Integer) newValue).intValue());
+			return;
+		case ModelPackage.NODE__INCOMING_CONNECTIONS:
+			getIncomingConnections().clear();
+			getIncomingConnections().addAll((Collection) newValue);
+			return;
+		case ModelPackage.NODE__OUTGOING_CONNECTIONS:
+			getOutgoingConnections().clear();
+			getOutgoingConnections().addAll((Collection) newValue);
+			return;
+		case ModelPackage.NODE__READ_ONLY:
+			setReadOnly(((Boolean) newValue).booleanValue());
+			return;
+		}
+		eDynamicSet(eFeature, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public void eUnset(EStructuralFeature eFeature) {
+		switch (eDerivedStructuralFeatureID(eFeature)) {
+		case ModelPackage.NODE__OBJECT:
+			setObject(OBJECT_EDEFAULT);
+			return;
+		case ModelPackage.NODE__LOCATION:
+			setLocation(LOCATION_EDEFAULT);
+			return;
+		case ModelPackage.NODE__WIDTH:
+			setWidth(WIDTH_EDEFAULT);
+			return;
+		case ModelPackage.NODE__HEIGHT:
+			setHeight(HEIGHT_EDEFAULT);
+			return;
+		case ModelPackage.NODE__INCOMING_CONNECTIONS:
+			getIncomingConnections().clear();
+			return;
+		case ModelPackage.NODE__OUTGOING_CONNECTIONS:
+			getOutgoingConnections().clear();
+			return;
+		case ModelPackage.NODE__READ_ONLY:
+			setReadOnly(READ_ONLY_EDEFAULT);
+			return;
+		}
+		eDynamicUnset(eFeature);
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public boolean eIsSet(EStructuralFeature eFeature) {
+		switch (eDerivedStructuralFeatureID(eFeature)) {
+		case ModelPackage.NODE__OBJECT:
+			return OBJECT_EDEFAULT == null ? object != null : !OBJECT_EDEFAULT
+					.equals(object);
+		case ModelPackage.NODE__LOCATION:
+			return LOCATION_EDEFAULT == null ? location != null
+					: !LOCATION_EDEFAULT.equals(location);
+		case ModelPackage.NODE__WIDTH:
+			return width != WIDTH_EDEFAULT;
+		case ModelPackage.NODE__HEIGHT:
+			return height != HEIGHT_EDEFAULT;
+		case ModelPackage.NODE__INCOMING_CONNECTIONS:
+			return incomingConnections != null
+					&& !incomingConnections.isEmpty();
+		case ModelPackage.NODE__OUTGOING_CONNECTIONS:
+			return outgoingConnections != null
+					&& !outgoingConnections.isEmpty();
+		case ModelPackage.NODE__READ_ONLY:
+			return readOnly != READ_ONLY_EDEFAULT;
+		}
+		return eDynamicIsSet(eFeature);
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public String toString() {
+		if (eIsProxy())
+			return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (location: "); //$NON-NLS-1$
+		result.append(location);
+		result.append(", width: "); //$NON-NLS-1$
+		result.append(width);
+		result.append(", height: "); //$NON-NLS-1$
+		result.append(height);
+		result.append(", readOnly: "); //$NON-NLS-1$
+		result.append(readOnly);
+		result.append(')');
+		return result.toString();
+	}
+
+	/**
+	 * Adds incoming connection
+	 * 
+	 * @param link
+	 * @return
+	 */
+	protected boolean addToUMA(Link link) {
+		if (link.getTarget() == null || link.getSource() == null)
+			return false;
+		GraphicalDataHelper.addGraphicalData(link);
+		return true;
+	}
+
+	/**
+	 * Removes outgoing connection
+	 * 
+	 * @param link
+	 * @param oldSource
+	 * @param oldTarget
+	 */
+	protected void removeFromUMA(Link link, Node oldSource, Node oldTarget) {
+		// GraphicalDataManager.getInstance().removeGraphConnectorPair(oldSource.getGraphNode(),
+		// oldTarget.getGraphNode());
+		GraphicalDataHelper.removeGraphicalData(link);
+	}
+
+	protected org.eclipse.epf.uma.Diagram getUMADiagram() {
+		if (getDiagram() == null)
+			return umaDiagram;
+		return getDiagram().getUMADiagram();
+	}
+
+	protected GraphNode getUMAContainer() {
+		Node container = (Node) eContainer();
+		if (container == null)
+			return umaContainer;
+		return container.getGraphNode();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.epf.diagram.model.Node#setUMAContainer(org.eclipse.epf.uma.GraphNode)
+	 */
+	public void setUMAContainer(GraphNode umaContainer) {
+		this.umaContainer = umaContainer;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.epf.diagram.model.ActivityNode#setUMADiagram(org.eclipse.epf.uma.Diagram)
+	 */
+	public void setUMADiagram(org.eclipse.epf.uma.Diagram umaDiagram) {
+		this.umaDiagram = umaDiagram;
+		umaContainer = umaDiagram;
+	}
+
+	protected class NodeAdapter extends AdapterImpl {
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.eclipse.emf.common.notify.impl.AdapterImpl#notifyChanged(org.eclipse.emf.common.notify.Notification)
+		 */
+		public void notifyChanged(Notification msg) {
+			switch (msg.getFeatureID(Node.class)) {
+			case ModelPackage.NODE__WIDTH:
+				getGraphNode().getSize().setWidth(
+						new Double(msg.getNewIntValue()));
+				return;
+
+			case ModelPackage.NODE__HEIGHT:
+				if (getGraphNode() != null) {
+					getGraphNode().getSize().setHeight(
+							new Double(msg.getNewIntValue()));
+				}
+				return;
+
+			case ModelPackage.NODE__LOCATION:
+				if (getGraphNode() != null && msg.getNewValue() != null) {
+					Point p = (Point) msg.getNewValue();
+					getGraphNode().getPosition().setX(new Double(p.x));
+					getGraphNode().getPosition().setY(new Double(p.y));
+				}
+				return;
+
+			case ModelPackage.NODE__INCOMING_CONNECTIONS:
+				Link link;
+				switch (msg.getEventType()) {
+				case Notification.ADD:
+					link = (Link) msg.getNewValue();
+					addToUMA(link);
+					return;
+				case Notification.ADD_MANY:
+					for (Iterator iter = ((Collection) msg.getNewValue())
+							.iterator(); iter.hasNext();) {
+						addToUMA((Link) iter.next());
+					}
+					break;
+				case Notification.REMOVE:
+					link = (Link) msg.getOldValue();
+					if (link.getSource() != null) {
+						((NodeImpl) link.getSource()).removeFromUMA(link, link
+								.getSource(), (Node) msg.getNotifier());
+					}
+					break;
+				case Notification.REMOVE_MANY:
+					for (Iterator iter = ((Collection) msg.getOldValue())
+							.iterator(); iter.hasNext();) {
+						link = (Link) iter.next();
+						if (link.getSource() != null) {
+							((NodeImpl) link.getSource()).removeFromUMA(link,
+									link.getSource(), (Node) msg.getNotifier());
+						}
+					}
+					break;
+				}
+				return;
+			case ModelPackage.NODE__OUTGOING_CONNECTIONS:
+				switch (msg.getEventType()) {
+				case Notification.ADD:
+					link = (Link) msg.getNewValue();
+					if (link.getTarget() != null) {
+						((NodeImpl) link.getTarget()).addToUMA(link);
+					}
+					break;
+				case Notification.ADD_MANY:
+					for (Iterator iter = ((Collection) msg.getNewValue())
+							.iterator(); iter.hasNext();) {
+						link = (Link) iter.next();
+						if (link.getTarget() != null) {
+							((NodeImpl) link.getTarget()).addToUMA(link);
+						}
+					}
+					break;
+				case Notification.REMOVE:
+					link = (Link) msg.getOldValue();
+					if (link.getTarget() != null) {
+						removeFromUMA(link, (Node) msg.getNotifier(), link
+								.getTarget());
+					}
+					break;
+				case Notification.REMOVE_MANY:
+					for (Iterator iter = ((Collection) msg.getOldValue())
+							.iterator(); iter.hasNext();) {
+						link = (Link) iter.next();
+						if (link.getTarget() != null) {
+							removeFromUMA(link, (Node) msg.getNotifier(), link
+									.getTarget());
+						}
+					}
+					break;
+				}
+				return;
+
+			}
+		}
+
+	}
+
+	protected void basicSetObject(Object newObject) {
+		if (newObject == null)
+			return;
+
+		this.object = newObject;
+		MethodElement element = (MethodElement) newObject;
+		graphNode = GraphicalDataManager.getInstance().getGraphNode(
+				getUMADiagram(), element);
+
+		// System.out.println("NodeImpl.setObject(): element: '" +
+		// element.getName() + "', graphNode: " + graphNode);
+
+		// populate/synch data
+		//
+		if (height == HEIGHT_EDEFAULT) {
+			setHeight(graphNode.getSize().getHeight().intValue());
+		} else {
+			graphNode.getSize().setHeight(new Double(height));
+		}
+
+		if (width == WIDTH_EDEFAULT) {
+			setWidth(graphNode.getSize().getWidth().intValue());
+		} else {
+			graphNode.getSize().setWidth(new Double(width));
+		}
+
+		if (location == LOCATION_EDEFAULT) {
+			setLocation(GraphicalDataHelper.toPoint(graphNode.getPosition()));
+		} else {
+			graphNode.getPosition().setX(new Double(location.x));
+			graphNode.getPosition().setY(new Double(location.y));
+		}
+
+		// add methodElementAdapter
+		//
+		if (methodElementAdapter != null) {
+			element.eAdapters().add(methodElementAdapter);
+		}
+
+		this.eAdapters().add(createNodeAdapter());
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.epf.diagram.model.impl.LinkedObjectImpl#setObject(java.lang.Object)
+	 */
+	public void setObject(Object newObject) {
+		super.setObject(newObject);
+		
+		//TODO: ??? why task descriptor is excluded if the diagram is an activity detail diagram
+		//
+//		if (!((newObject instanceof TaskDescriptor) && getDiagram() instanceof ActivityDetailDiagram))
+			basicSetObject(newObject);
+	}
+
+	/**
+	 * @return
+	 */
+	protected Adapter createNodeAdapter() {
+		return new NodeAdapter();
+	}
+
+	public GraphNode getGraphNode() {
+		return graphNode;
+	}
+
+	// TODO: force subclass to implement this method
+	public Class getMethodElementAdapterType() {
+		return INodeChangeListener.class;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.epf.diagram.model.Node#getDiagram()
+	 */
+	public Diagram getDiagram() {
+		EObject parent = eContainer;
+		for (; parent != null && !(parent instanceof Diagram); parent = parent
+				.eContainer())
+			;
+		if (parent instanceof Diagram) {
+			return (Diagram) parent;
+		}
+		return diagram;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.epf.diagram.model.Node#setDiagram(org.eclipse.epf.diagram.model.Diagram)
+	 */
+	public void setDiagram(Diagram diagram) {
+		this.diagram = diagram;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.epf.diagram.model.Node#addConsumer(java.lang.Object)
+	 */
+	public void addConsumer(Object consumer) {
+		if (!consumers.contains(consumer)) {
+			consumers.add(consumer);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.epf.diagram.model.Node#removeConsumer(java.lang.Object)
+	 */
+	public void removeConsumer(Object consumer) {
+		consumers.remove(consumer);
+		if (consumers.isEmpty()) {
+			// no more consumer of this node, it should be disposed
+			dispose();
+		}
+	}
+
+	protected void dispose() {
+		EObject obj = (EObject) getObject();
+		if (obj != null) {
+			if (methodElementAdapter != null) {
+				obj.eAdapters().remove(methodElementAdapter);
+			}
+		}
+
+		eAdapters().clear();
+
+		umaContainer = null;
+		umaDiagram = null;
+		graphNode = null;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public void setReadOnly(boolean newReadOnly) {
+		boolean oldReadOnly = readOnly;
+		readOnly = newReadOnly;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+					ModelPackage.NODE__READ_ONLY, oldReadOnly, readOnly));
+	}
+
+	private Collection consumers = new ArrayList();
+
+	private GraphNode umaContainer;
+
+	private org.eclipse.epf.uma.Diagram umaDiagram;
+
+	private Diagram diagram;
+
+	protected GraphNode graphNode;
+
+	protected boolean notificationEnabled = true;
+
+	protected INodeChangeListener methodElementAdapter;
+	/**
+	 * addDefaultWorkOrder is moved from
+	 * GraphicalDataHelper.addDefaultWorkOrder(NamedNodeImpl,
+	 * WorkbreakdownElement) Method will set notificationEnabled flag to false
+	 * of all adapters of type MethodElementAdapter of Successor object before
+	 * creating a WorkOrder object. After creation of WorkOrder (Predecessor
+	 * link) restores the notificationEnabled flag of Successor's adapters of
+	 * type MethodElementAdapter.
+	 * 
+	 * eg: If an Activity "actA" is extended in another CP. Base "actA" AD
+	 * diagram is opened, and Extended "actA" AD Diagram is opened. On creating
+	 * predecessor link between any two child activities, creates a extra link
+	 * in Extended "actA" AD diagram, because creating workorder will notify the
+	 * extended "actA" diagram to draw a link. To avoid duplicate links in the
+	 * extended activity diagram, we have to set notificationEnabled flag to
+	 * false, before creating a WorkOrder object.
+	 * 
+	 */
+	public WorkOrder addDefaultWorkOrder(NamedNodeImpl node,
+			WorkBreakdownElement predBreakdownElement) {
+		boolean notify = node.isNotificationEnabled();
+		Map map = new HashMap();
+		List list = ((WorkBreakdownElement) node.getObject()).eAdapters();
+		for (Iterator iterator = list.iterator(); iterator.hasNext();) {
+			Object obj = iterator.next();
+			if (obj instanceof MethodElementAdapter) {
+				NodeImpl nodeobj = (NodeImpl) ((MethodElementAdapter) obj)
+						.getNode();
+				boolean predNotification = node.notificationEnabled;
+				((NodeImpl) (((MethodElementAdapter) obj).getNode())).notificationEnabled = false;
+				map.put(nodeobj, new Boolean(predNotification));
+			}
+		}
+		try {
+			node.setNotificationEnabled(false);
+			return UmaUtil.createDefaultWorkOrder((WorkBreakdownElement) node
+					.getObject(), predBreakdownElement);
+		} finally {
+			node.setNotificationEnabled(notify);
+			Set set = map.keySet();
+			for (Iterator iter = set.iterator(); iter.hasNext();) {
+				Object object = iter.next();
+				Object obj = map.get(object);
+				if (obj instanceof Boolean) {
+					boolean prednot = ((Boolean) obj).booleanValue();
+					((NodeImpl) object).notificationEnabled = prednot;
+				}
+			}
+		}
+	}
+
+} // NodeImpl