blob: e76410e934611d918b4f4c5faef6e04115692e94 [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2004, 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.runtime.notation.impl;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.NotificationChain;
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.EContentsEList;
import org.eclipse.emf.ecore.util.EObjectContainmentEList;
import org.eclipse.emf.ecore.util.InternalEList;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.gmf.runtime.notation.Edge;
import org.eclipse.gmf.runtime.notation.MeasurementUnit;
import org.eclipse.gmf.runtime.notation.NotationPackage;
import org.eclipse.gmf.runtime.notation.View;
/**
* <!-- begin-user-doc --> An implementation of the model object '<em><b>Diagram</b></em>'.
* <!-- end-user-doc -->
* <p>
* The following features are implemented:
* <ul>
* <li>{@link org.eclipse.gmf.runtime.notation.impl.DiagramImpl#getName <em>Name</em>}</li>
* <li>{@link org.eclipse.gmf.runtime.notation.impl.DiagramImpl#getMeasurementUnit <em>Measurement Unit</em>}</li>
* <li>{@link org.eclipse.gmf.runtime.notation.impl.DiagramImpl#getPersistedEdges <em>Persisted Edges</em>}</li>
* <li>{@link org.eclipse.gmf.runtime.notation.impl.DiagramImpl#getTransientEdges <em>Transient Edges</em>}</li>
* </ul>
* </p>
*
* @generated
*/
/*
* @canBeSeenBy %partners
*/
public class DiagramImpl
extends ViewImpl
implements Diagram {
/**
* The default value of the '{@link #getName() <em>Name</em>}' attribute.
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @see #getName()
* @generated
* @ordered
*/
protected static final String NAME_EDEFAULT = ""; //$NON-NLS-1$
/**
* The cached value of the '{@link #getName() <em>Name</em>}' attribute.
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @see #getName()
* @generated
* @ordered
*/
protected String name = NAME_EDEFAULT;
/**
* The default value of the '{@link #getMeasurementUnit() <em>Measurement Unit</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getMeasurementUnit()
* @generated
* @ordered
*/
protected static final MeasurementUnit MEASUREMENT_UNIT_EDEFAULT = MeasurementUnit.HIMETRIC_LITERAL;
/**
* The offset of the flags representing the value of the '{@link #getMeasurementUnit() <em>Measurement Unit</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
* @ordered
* @since 1.2
*/
protected static final int MEASUREMENT_UNIT_EFLAG_OFFSET = 11;
/**
* The flags representing the default value of the '{@link #getMeasurementUnit() <em>Measurement Unit</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
* @ordered
* @since 1.2
*/
protected static final int MEASUREMENT_UNIT_EFLAG_DEFAULT = MeasurementUnit.VALUES.indexOf(MEASUREMENT_UNIT_EDEFAULT) << MEASUREMENT_UNIT_EFLAG_OFFSET;
/**
* The array of enumeration values for '{@link MeasurementUnit Measurement Unit}'
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
* @ordered
*/
private static final MeasurementUnit[] MEASUREMENT_UNIT_EFLAG_VALUES = (MeasurementUnit[])MeasurementUnit.VALUES.toArray(new MeasurementUnit[MeasurementUnit.VALUES.size()]);
/**
* The flag representing the value of the '{@link #getMeasurementUnit() <em>Measurement Unit</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getMeasurementUnit()
* @generated
* @ordered
* @since 1.2
*/
protected static final int MEASUREMENT_UNIT_EFLAG = 1 << MEASUREMENT_UNIT_EFLAG_OFFSET;
/**
* The flag representing whether the Measurement Unit attribute has been set.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
* @ordered
*/
protected static final int MEASUREMENT_UNIT_ESETFLAG = 1 << 12;
/**
* The cached value of the '{@link #getPersistedEdges() <em>Persisted Edges</em>}' containment reference list.
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @see #getPersistedEdges()
* @generated
* @ordered
*/
protected EList persistedEdges;
/**
* The cached value of the '{@link #getTransientEdges() <em>Transient Edges</em>}' containment reference list.
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @see #getTransientEdges()
* @generated
* @ordered
*/
protected EList transientEdges;
private EContentsEList allEdges = null;
protected static final EStructuralFeature[] edgesFeatures = new EStructuralFeature[] {
NotationPackage.Literals.DIAGRAM__PERSISTED_EDGES,
NotationPackage.Literals.DIAGRAM__TRANSIENT_EDGES};
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
protected DiagramImpl() {
super();
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
protected EClass eStaticClass() {
return NotationPackage.Literals.DIAGRAM;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public String getName() {
return name;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public void setName(String newName) {
String oldName = name;
name = newName;
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, NotationPackage.DIAGRAM__NAME, oldName, name));
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public MeasurementUnit getMeasurementUnit() {
return MEASUREMENT_UNIT_EFLAG_VALUES[(eFlags & MEASUREMENT_UNIT_EFLAG) >>> MEASUREMENT_UNIT_EFLAG_OFFSET];
}
/**
* <!-- begin-user-doc --> Set the Measurement Unit for this Diagram, the
* Measure ment unit can be set only once, the set method will not set the
* value if it was already set <!-- end-user-doc -->
* @generated NOT
*/
public void setMeasurementUnit(MeasurementUnit newMeasurementUnit) {
if (!isSetMeasurementUnit()) {
MeasurementUnit oldMeasurementUnit = MEASUREMENT_UNIT_EFLAG_VALUES[(eFlags & MEASUREMENT_UNIT_EFLAG) >>> MEASUREMENT_UNIT_EFLAG_OFFSET];
if (newMeasurementUnit == null) newMeasurementUnit = MEASUREMENT_UNIT_EDEFAULT;
eFlags = eFlags & ~MEASUREMENT_UNIT_EFLAG | MeasurementUnit.VALUES.indexOf(newMeasurementUnit) << MEASUREMENT_UNIT_EFLAG_OFFSET;
boolean oldMeasurementUnitESet = (eFlags & MEASUREMENT_UNIT_ESETFLAG) != 0;
eFlags |= MEASUREMENT_UNIT_ESETFLAG;
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, NotationPackage.DIAGRAM__MEASUREMENT_UNIT, oldMeasurementUnit, newMeasurementUnit, !oldMeasurementUnitESet));
} /*else {
throw new UnsupportedOperationException();
}*/
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*/
public void unsetMeasurementUnit() {
/*throw new UnsupportedOperationException();*/
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean isSetMeasurementUnit() {
return (eFlags & MEASUREMENT_UNIT_ESETFLAG) != 0;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*/
public EList getEdges() {
if (allEdges == null) {
allEdges = new EContentsEList(this, edgesFeatures);
}
return allEdges;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public EList getPersistedEdges() {
if (persistedEdges == null) {
persistedEdges = new EObjectContainmentEList(Edge.class, this, NotationPackage.DIAGRAM__PERSISTED_EDGES);
}
return persistedEdges;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public EList getTransientEdges() {
if (transientEdges == null) {
transientEdges = new EObjectContainmentEList(Edge.class, this, NotationPackage.DIAGRAM__TRANSIENT_EDGES);
}
return transientEdges;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*/
public Edge createEdge(EClass eClass) {
Edge newEdge = (Edge) eClass.getEPackage().getEFactoryInstance()
.create(eClass);
getPersistedEdges().add(newEdge);
return newEdge;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
switch (featureID) {
case NotationPackage.DIAGRAM__EANNOTATIONS:
return ((InternalEList)getEAnnotations()).basicRemove(otherEnd, msgs);
case NotationPackage.DIAGRAM__SOURCE_EDGES:
return ((InternalEList)getSourceEdges()).basicRemove(otherEnd, msgs);
case NotationPackage.DIAGRAM__TARGET_EDGES:
return ((InternalEList)getTargetEdges()).basicRemove(otherEnd, msgs);
case NotationPackage.DIAGRAM__PERSISTED_CHILDREN:
return ((InternalEList)getPersistedChildren()).basicRemove(otherEnd, msgs);
case NotationPackage.DIAGRAM__STYLES:
return ((InternalEList)getStyles()).basicRemove(otherEnd, msgs);
case NotationPackage.DIAGRAM__TRANSIENT_CHILDREN:
return ((InternalEList)getTransientChildren()).basicRemove(otherEnd, msgs);
case NotationPackage.DIAGRAM__PERSISTED_EDGES:
return ((InternalEList)getPersistedEdges()).basicRemove(otherEnd, msgs);
case NotationPackage.DIAGRAM__TRANSIENT_EDGES:
return ((InternalEList)getTransientEdges()).basicRemove(otherEnd, msgs);
}
return eDynamicInverseRemove(otherEnd, featureID, msgs);
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public Object eGet(int featureID, boolean resolve, boolean coreType) {
switch (featureID) {
case NotationPackage.DIAGRAM__EANNOTATIONS:
return getEAnnotations();
case NotationPackage.DIAGRAM__VISIBLE:
return isVisible() ? Boolean.TRUE : Boolean.FALSE;
case NotationPackage.DIAGRAM__TYPE:
return getType();
case NotationPackage.DIAGRAM__MUTABLE:
return isMutable() ? Boolean.TRUE : Boolean.FALSE;
case NotationPackage.DIAGRAM__SOURCE_EDGES:
return getSourceEdges();
case NotationPackage.DIAGRAM__TARGET_EDGES:
return getTargetEdges();
case NotationPackage.DIAGRAM__PERSISTED_CHILDREN:
return getPersistedChildren();
case NotationPackage.DIAGRAM__STYLES:
return getStyles();
case NotationPackage.DIAGRAM__ELEMENT:
if (resolve) return getElement();
return basicGetElement();
case NotationPackage.DIAGRAM__DIAGRAM:
if (resolve) return getDiagram();
return basicGetDiagram();
case NotationPackage.DIAGRAM__TRANSIENT_CHILDREN:
return getTransientChildren();
case NotationPackage.DIAGRAM__NAME:
return getName();
case NotationPackage.DIAGRAM__MEASUREMENT_UNIT:
return getMeasurementUnit();
case NotationPackage.DIAGRAM__PERSISTED_EDGES:
return getPersistedEdges();
case NotationPackage.DIAGRAM__TRANSIENT_EDGES:
return getTransientEdges();
}
return eDynamicGet(featureID, resolve, coreType);
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public void eSet(int featureID, Object newValue) {
switch (featureID) {
case NotationPackage.DIAGRAM__EANNOTATIONS:
getEAnnotations().clear();
getEAnnotations().addAll((Collection)newValue);
return;
case NotationPackage.DIAGRAM__VISIBLE:
setVisible(((Boolean)newValue).booleanValue());
return;
case NotationPackage.DIAGRAM__TYPE:
setType((String)newValue);
return;
case NotationPackage.DIAGRAM__MUTABLE:
setMutable(((Boolean)newValue).booleanValue());
return;
case NotationPackage.DIAGRAM__SOURCE_EDGES:
getSourceEdges().clear();
getSourceEdges().addAll((Collection)newValue);
return;
case NotationPackage.DIAGRAM__TARGET_EDGES:
getTargetEdges().clear();
getTargetEdges().addAll((Collection)newValue);
return;
case NotationPackage.DIAGRAM__PERSISTED_CHILDREN:
getPersistedChildren().clear();
getPersistedChildren().addAll((Collection)newValue);
return;
case NotationPackage.DIAGRAM__STYLES:
getStyles().clear();
getStyles().addAll((Collection)newValue);
return;
case NotationPackage.DIAGRAM__ELEMENT:
setElement((EObject)newValue);
return;
case NotationPackage.DIAGRAM__TRANSIENT_CHILDREN:
getTransientChildren().clear();
getTransientChildren().addAll((Collection)newValue);
return;
case NotationPackage.DIAGRAM__NAME:
setName((String)newValue);
return;
case NotationPackage.DIAGRAM__MEASUREMENT_UNIT:
setMeasurementUnit((MeasurementUnit)newValue);
return;
case NotationPackage.DIAGRAM__PERSISTED_EDGES:
getPersistedEdges().clear();
getPersistedEdges().addAll((Collection)newValue);
return;
case NotationPackage.DIAGRAM__TRANSIENT_EDGES:
getTransientEdges().clear();
getTransientEdges().addAll((Collection)newValue);
return;
}
eDynamicSet(featureID, newValue);
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public void eUnset(int featureID) {
switch (featureID) {
case NotationPackage.DIAGRAM__EANNOTATIONS:
getEAnnotations().clear();
return;
case NotationPackage.DIAGRAM__VISIBLE:
setVisible(VISIBLE_EDEFAULT);
return;
case NotationPackage.DIAGRAM__TYPE:
setType(TYPE_EDEFAULT);
return;
case NotationPackage.DIAGRAM__MUTABLE:
setMutable(MUTABLE_EDEFAULT);
return;
case NotationPackage.DIAGRAM__SOURCE_EDGES:
getSourceEdges().clear();
return;
case NotationPackage.DIAGRAM__TARGET_EDGES:
getTargetEdges().clear();
return;
case NotationPackage.DIAGRAM__PERSISTED_CHILDREN:
getPersistedChildren().clear();
return;
case NotationPackage.DIAGRAM__STYLES:
getStyles().clear();
return;
case NotationPackage.DIAGRAM__ELEMENT:
unsetElement();
return;
case NotationPackage.DIAGRAM__TRANSIENT_CHILDREN:
getTransientChildren().clear();
return;
case NotationPackage.DIAGRAM__NAME:
setName(NAME_EDEFAULT);
return;
case NotationPackage.DIAGRAM__MEASUREMENT_UNIT:
unsetMeasurementUnit();
return;
case NotationPackage.DIAGRAM__PERSISTED_EDGES:
getPersistedEdges().clear();
return;
case NotationPackage.DIAGRAM__TRANSIENT_EDGES:
getTransientEdges().clear();
return;
}
eDynamicUnset(featureID);
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public boolean eIsSet(int featureID) {
switch (featureID) {
case NotationPackage.DIAGRAM__EANNOTATIONS:
return eAnnotations != null && !eAnnotations.isEmpty();
case NotationPackage.DIAGRAM__VISIBLE:
return ((eFlags & VISIBLE_EFLAG) != 0) != VISIBLE_EDEFAULT;
case NotationPackage.DIAGRAM__TYPE:
return TYPE_EDEFAULT == null ? type != null : !TYPE_EDEFAULT.equals(type);
case NotationPackage.DIAGRAM__MUTABLE:
return ((eFlags & MUTABLE_EFLAG) != 0) != MUTABLE_EDEFAULT;
case NotationPackage.DIAGRAM__SOURCE_EDGES:
return sourceEdges != null && !sourceEdges.isEmpty();
case NotationPackage.DIAGRAM__TARGET_EDGES:
return targetEdges != null && !targetEdges.isEmpty();
case NotationPackage.DIAGRAM__PERSISTED_CHILDREN:
return persistedChildren != null && !persistedChildren.isEmpty();
case NotationPackage.DIAGRAM__STYLES:
return styles != null && !styles.isEmpty();
case NotationPackage.DIAGRAM__ELEMENT:
return isSetElement();
case NotationPackage.DIAGRAM__DIAGRAM:
return basicGetDiagram() != null;
case NotationPackage.DIAGRAM__TRANSIENT_CHILDREN:
return transientChildren != null && !transientChildren.isEmpty();
case NotationPackage.DIAGRAM__NAME:
return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
case NotationPackage.DIAGRAM__MEASUREMENT_UNIT:
return isSetMeasurementUnit();
case NotationPackage.DIAGRAM__PERSISTED_EDGES:
return persistedEdges != null && !persistedEdges.isEmpty();
case NotationPackage.DIAGRAM__TRANSIENT_EDGES:
return transientEdges != null && !transientEdges.isEmpty();
}
return eDynamicIsSet(featureID);
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public String toString() {
if (eIsProxy()) return super.toString();
StringBuffer result = new StringBuffer(super.toString());
result.append(" (name: "); //$NON-NLS-1$
result.append(name);
result.append(", measurementUnit: "); //$NON-NLS-1$
if ((eFlags & MEASUREMENT_UNIT_ESETFLAG) != 0) result.append(MEASUREMENT_UNIT_EFLAG_VALUES[(eFlags & MEASUREMENT_UNIT_EFLAG) >>> MEASUREMENT_UNIT_EFLAG_OFFSET]); else result.append("<unset>"); //$NON-NLS-1$
result.append(')');
return result.toString();
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*/
public void insertEdge(Edge edge) {
persistEdges();
getPersistedEdges().add(edge);
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*/
public void insertEdgeAt(Edge edge, int index) {
persistEdges();
if (getPersistedEdges().size() >= index) {
getPersistedEdges().add(index, edge);
}
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*/
public void insertEdge(Edge edge, boolean persisted) {
List edges = null;
if (persisted)
edges = getPersistedEdges();
else
edges = getTransientEdges();
edges.add(edge);
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*/
public void persistEdges() {
if (transientEdges != null && transientEdges.size() > 0) {
List edges = new ArrayList(transientEdges);
getPersistedEdges().addAll(transientEdges);
for (Iterator iterator = edges.iterator(); iterator.hasNext();) {
Edge edge = (Edge) iterator.next();
View sourceView = edge.getSource();
View targetView = edge.getTarget();
if (sourceView != null)
persistCompleteHierarchy(sourceView);
if (targetView != null)
persistCompleteHierarchy(targetView);
}
}
}
/**
* Persist the view passed in and all its parent views if they are
* transient.
*
* @param view
* the view to persist
*/
private void persistCompleteHierarchy(View view) {
view.persist();
EObject container = view.eContainer();
while (container instanceof View) {
// if already persisted, quit
EStructuralFeature sFeature = container.eContainingFeature();
if (sFeature != null && !sFeature.isTransient()) {
break;
}
((View) container).persist();
container = container.eContainer();
}
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*/
public void removeEdge(Edge edge) {
if (edge.eContainingFeature() == NotationPackage.Literals
.DIAGRAM__TRANSIENT_EDGES) {
if (transientEdges != null && transientEdges.size() > 0) {
transientEdges.remove(edge);
}
} else if (edge.eContainingFeature() == NotationPackage.Literals
.DIAGRAM__PERSISTED_EDGES) {
if (persistedEdges != null && persistedEdges.size() > 0) {
persistedEdges.remove(edge);
}
}
}
} // DiagramImpl