/**
 * <copyright>
 * </copyright>
 *
 * $Id: PredecessorLinkImpl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
 */
package org.eclipse.epf.msproject.impl;

import java.math.BigInteger;

import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.impl.ENotificationImpl;
import org.eclipse.emf.ecore.impl.EObjectImpl;
import org.eclipse.epf.msproject.MsprojectPackage;
import org.eclipse.epf.msproject.PredecessorLink;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model object '<em><b>Predecessor Link</b></em>'.
 * <!-- end-user-doc -->
 * <p>
 * The following features are implemented:
 * <ul>
 *   <li>{@link org.eclipse.epf.msproject.impl.PredecessorLinkImpl#getPredecessorUID <em>Predecessor UID</em>}</li>
 *   <li>{@link org.eclipse.epf.msproject.impl.PredecessorLinkImpl#getType <em>Type</em>}</li>
 *   <li>{@link org.eclipse.epf.msproject.impl.PredecessorLinkImpl#isCrossProject <em>Cross Project</em>}</li>
 *   <li>{@link org.eclipse.epf.msproject.impl.PredecessorLinkImpl#getCrossProjectName <em>Cross Project Name</em>}</li>
 *   <li>{@link org.eclipse.epf.msproject.impl.PredecessorLinkImpl#getLinkLag <em>Link Lag</em>}</li>
 *   <li>{@link org.eclipse.epf.msproject.impl.PredecessorLinkImpl#getLagFormat <em>Lag Format</em>}</li>
 * </ul>
 * </p>
 *
 * @generated
 */
public class PredecessorLinkImpl extends EObjectImpl implements PredecessorLink {
	/**
	 * The default value of the '{@link #getPredecessorUID() <em>Predecessor UID</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getPredecessorUID()
	 * @generated
	 * @ordered
	 */
	protected static final BigInteger PREDECESSOR_UID_EDEFAULT = null;

	/**
	 * The cached value of the '{@link #getPredecessorUID() <em>Predecessor UID</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getPredecessorUID()
	 * @generated
	 * @ordered
	 */
	protected BigInteger predecessorUID = PREDECESSOR_UID_EDEFAULT;

	/**
	 * The default value of the '{@link #getType() <em>Type</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getType()
	 * @generated
	 * @ordered
	 */
	protected static final BigInteger TYPE_EDEFAULT = null;

	/**
	 * The cached value of the '{@link #getType() <em>Type</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getType()
	 * @generated
	 * @ordered
	 */
	protected BigInteger type = TYPE_EDEFAULT;

	/**
	 * The default value of the '{@link #isCrossProject() <em>Cross Project</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isCrossProject()
	 * @generated
	 * @ordered
	 */
	protected static final boolean CROSS_PROJECT_EDEFAULT = false;

	/**
	 * The cached value of the '{@link #isCrossProject() <em>Cross Project</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isCrossProject()
	 * @generated
	 * @ordered
	 */
	protected boolean crossProject = CROSS_PROJECT_EDEFAULT;

	/**
	 * This is true if the Cross Project attribute has been set.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	protected boolean crossProjectESet = false;

	/**
	 * The default value of the '{@link #getCrossProjectName() <em>Cross Project Name</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getCrossProjectName()
	 * @generated
	 * @ordered
	 */
	protected static final String CROSS_PROJECT_NAME_EDEFAULT = null;

	/**
	 * The cached value of the '{@link #getCrossProjectName() <em>Cross Project Name</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getCrossProjectName()
	 * @generated
	 * @ordered
	 */
	protected String crossProjectName = CROSS_PROJECT_NAME_EDEFAULT;

	/**
	 * The default value of the '{@link #getLinkLag() <em>Link Lag</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getLinkLag()
	 * @generated
	 * @ordered
	 */
	protected static final BigInteger LINK_LAG_EDEFAULT = null;

	/**
	 * The cached value of the '{@link #getLinkLag() <em>Link Lag</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getLinkLag()
	 * @generated
	 * @ordered
	 */
	protected BigInteger linkLag = LINK_LAG_EDEFAULT;

	/**
	 * The default value of the '{@link #getLagFormat() <em>Lag Format</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getLagFormat()
	 * @generated
	 * @ordered
	 */
	protected static final BigInteger LAG_FORMAT_EDEFAULT = null;

	/**
	 * The cached value of the '{@link #getLagFormat() <em>Lag Format</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getLagFormat()
	 * @generated
	 * @ordered
	 */
	protected BigInteger lagFormat = LAG_FORMAT_EDEFAULT;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected PredecessorLinkImpl() {
		super();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected EClass eStaticClass() {
		return MsprojectPackage.eINSTANCE.getPredecessorLink();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public BigInteger getPredecessorUID() {
		return predecessorUID;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setPredecessorUID(BigInteger newPredecessorUID) {
		BigInteger oldPredecessorUID = predecessorUID;
		predecessorUID = newPredecessorUID;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PREDECESSOR_LINK__PREDECESSOR_UID, oldPredecessorUID, predecessorUID));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public BigInteger getType() {
		return type;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setType(BigInteger newType) {
		BigInteger oldType = type;
		type = newType;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PREDECESSOR_LINK__TYPE, oldType, type));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public boolean isCrossProject() {
		return crossProject;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setCrossProject(boolean newCrossProject) {
		boolean oldCrossProject = crossProject;
		crossProject = newCrossProject;
		boolean oldCrossProjectESet = crossProjectESet;
		crossProjectESet = true;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PREDECESSOR_LINK__CROSS_PROJECT, oldCrossProject, crossProject, !oldCrossProjectESet));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void unsetCrossProject() {
		boolean oldCrossProject = crossProject;
		boolean oldCrossProjectESet = crossProjectESet;
		crossProject = CROSS_PROJECT_EDEFAULT;
		crossProjectESet = false;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.PREDECESSOR_LINK__CROSS_PROJECT, oldCrossProject, CROSS_PROJECT_EDEFAULT, oldCrossProjectESet));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public boolean isSetCrossProject() {
		return crossProjectESet;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String getCrossProjectName() {
		return crossProjectName;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setCrossProjectName(String newCrossProjectName) {
		String oldCrossProjectName = crossProjectName;
		crossProjectName = newCrossProjectName;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PREDECESSOR_LINK__CROSS_PROJECT_NAME, oldCrossProjectName, crossProjectName));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public BigInteger getLinkLag() {
		return linkLag;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setLinkLag(BigInteger newLinkLag) {
		BigInteger oldLinkLag = linkLag;
		linkLag = newLinkLag;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PREDECESSOR_LINK__LINK_LAG, oldLinkLag, linkLag));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public BigInteger getLagFormat() {
		return lagFormat;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setLagFormat(BigInteger newLagFormat) {
		BigInteger oldLagFormat = lagFormat;
		lagFormat = newLagFormat;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PREDECESSOR_LINK__LAG_FORMAT, oldLagFormat, lagFormat));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
		switch (eDerivedStructuralFeatureID(eFeature)) {
			case MsprojectPackage.PREDECESSOR_LINK__PREDECESSOR_UID:
				return getPredecessorUID();
			case MsprojectPackage.PREDECESSOR_LINK__TYPE:
				return getType();
			case MsprojectPackage.PREDECESSOR_LINK__CROSS_PROJECT:
				return isCrossProject() ? Boolean.TRUE : Boolean.FALSE;
			case MsprojectPackage.PREDECESSOR_LINK__CROSS_PROJECT_NAME:
				return getCrossProjectName();
			case MsprojectPackage.PREDECESSOR_LINK__LINK_LAG:
				return getLinkLag();
			case MsprojectPackage.PREDECESSOR_LINK__LAG_FORMAT:
				return getLagFormat();
		}
		return eDynamicGet(eFeature, resolve);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void eSet(EStructuralFeature eFeature, Object newValue) {
		switch (eDerivedStructuralFeatureID(eFeature)) {
			case MsprojectPackage.PREDECESSOR_LINK__PREDECESSOR_UID:
				setPredecessorUID((BigInteger)newValue);
				return;
			case MsprojectPackage.PREDECESSOR_LINK__TYPE:
				setType((BigInteger)newValue);
				return;
			case MsprojectPackage.PREDECESSOR_LINK__CROSS_PROJECT:
				setCrossProject(((Boolean)newValue).booleanValue());
				return;
			case MsprojectPackage.PREDECESSOR_LINK__CROSS_PROJECT_NAME:
				setCrossProjectName((String)newValue);
				return;
			case MsprojectPackage.PREDECESSOR_LINK__LINK_LAG:
				setLinkLag((BigInteger)newValue);
				return;
			case MsprojectPackage.PREDECESSOR_LINK__LAG_FORMAT:
				setLagFormat((BigInteger)newValue);
				return;
		}
		eDynamicSet(eFeature, newValue);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void eUnset(EStructuralFeature eFeature) {
		switch (eDerivedStructuralFeatureID(eFeature)) {
			case MsprojectPackage.PREDECESSOR_LINK__PREDECESSOR_UID:
				setPredecessorUID(PREDECESSOR_UID_EDEFAULT);
				return;
			case MsprojectPackage.PREDECESSOR_LINK__TYPE:
				setType(TYPE_EDEFAULT);
				return;
			case MsprojectPackage.PREDECESSOR_LINK__CROSS_PROJECT:
				unsetCrossProject();
				return;
			case MsprojectPackage.PREDECESSOR_LINK__CROSS_PROJECT_NAME:
				setCrossProjectName(CROSS_PROJECT_NAME_EDEFAULT);
				return;
			case MsprojectPackage.PREDECESSOR_LINK__LINK_LAG:
				setLinkLag(LINK_LAG_EDEFAULT);
				return;
			case MsprojectPackage.PREDECESSOR_LINK__LAG_FORMAT:
				setLagFormat(LAG_FORMAT_EDEFAULT);
				return;
		}
		eDynamicUnset(eFeature);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public boolean eIsSet(EStructuralFeature eFeature) {
		switch (eDerivedStructuralFeatureID(eFeature)) {
			case MsprojectPackage.PREDECESSOR_LINK__PREDECESSOR_UID:
				return PREDECESSOR_UID_EDEFAULT == null ? predecessorUID != null : !PREDECESSOR_UID_EDEFAULT.equals(predecessorUID);
			case MsprojectPackage.PREDECESSOR_LINK__TYPE:
				return TYPE_EDEFAULT == null ? type != null : !TYPE_EDEFAULT.equals(type);
			case MsprojectPackage.PREDECESSOR_LINK__CROSS_PROJECT:
				return isSetCrossProject();
			case MsprojectPackage.PREDECESSOR_LINK__CROSS_PROJECT_NAME:
				return CROSS_PROJECT_NAME_EDEFAULT == null ? crossProjectName != null : !CROSS_PROJECT_NAME_EDEFAULT.equals(crossProjectName);
			case MsprojectPackage.PREDECESSOR_LINK__LINK_LAG:
				return LINK_LAG_EDEFAULT == null ? linkLag != null : !LINK_LAG_EDEFAULT.equals(linkLag);
			case MsprojectPackage.PREDECESSOR_LINK__LAG_FORMAT:
				return LAG_FORMAT_EDEFAULT == null ? lagFormat != null : !LAG_FORMAT_EDEFAULT.equals(lagFormat);
		}
		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(" (predecessorUID: ");
		result.append(predecessorUID);
		result.append(", type: ");
		result.append(type);
		result.append(", crossProject: ");
		if (crossProjectESet) result.append(crossProject); else result.append("<unset>");
		result.append(", crossProjectName: ");
		result.append(crossProjectName);
		result.append(", linkLag: ");
		result.append(linkLag);
		result.append(", lagFormat: ");
		result.append(lagFormat);
		result.append(')');
		return result.toString();
	}

} //PredecessorLinkImpl
