blob: 20629a0cadaa4d77598f2c40243b460f0cae8e9b [file] [log] [blame]
/***************************************************************************************************
* Copyright (c) 2003, 2004 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.jst.j2ee.internal.webservice.adapter;
import java.util.ArrayList;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.jface.viewers.Viewer;
public class AdapterViewer extends AdapterImpl {
private EObject eObject_;
private Viewer viewer_;
private ArrayList features_;
public AdapterViewer(Viewer viewer) {
super();
eObject_ = null;
viewer_ = viewer;
features_ = new ArrayList();
}
public AdapterViewer(EObject eObject, Viewer viewer) {
this(viewer);
adapt(eObject);
}
public void notifyChanged(Notification msg) {
int type = msg.getEventType();
if (type == Notification.SET || type == Notification.UNSET || type == Notification.ADD || type == Notification.REMOVE || type == Notification.ADD_MANY || type == Notification.REMOVE_MANY) {
Object notifier = msg.getNotifier();
if (notifier == eObject_) {
if (type == Notification.SET || type == Notification.ADD || type == Notification.ADD_MANY)
internalAdaptFeature((EStructuralFeature) msg.getFeature());
else if (type == Notification.UNSET || type == Notification.REMOVE || type == Notification.REMOVE_MANY) {
Object object = msg.getOldValue();
if (object instanceof EObject)
((EObject) object).eAdapters().remove(this);
else if (object instanceof EList) {
EList eList = (EList) object;
for (int i = 0; i < eList.size(); i++) {
Object item = eList.get(i);
if (item instanceof EObject)
((EObject) item).eAdapters().remove(this);
}
}
}
}
viewer_.refresh();
}
}
public void adapt(EObject eObject) {
if (eObject_ != null) {
eObject_.eAdapters().remove(this);
unadaptAllCachedFeature();
}
eObject_ = eObject;
if (eObject_ != null) {
eObject_.eAdapters().add(this);
readaptAllCachedFeature();
}
viewer_.refresh();
}
public void adaptFeature(EStructuralFeature feature) {
if (!features_.contains(feature)) {
features_.add(feature);
internalAdaptFeature(feature);
}
}
private void internalAdaptFeature(EStructuralFeature feature) {
if (eObject_ != null) {
Object featureObject = eObject_.eGet(feature);
if (featureObject instanceof EObject) {
EList eAdapters = ((EObject) featureObject).eAdapters();
if (!eAdapters.contains(this))
eAdapters.add(this);
} else if (featureObject instanceof EList) {
EList eList = (EList) featureObject;
for (int i = 0; i < eList.size(); i++) {
Object object = eList.get(i);
if (object instanceof EObject) {
EList eAdapters = ((EObject) object).eAdapters();
if (!eAdapters.contains(this))
eAdapters.add(this);
}
}
}
}
}
private void readaptAllCachedFeature() {
EStructuralFeature[] features = new EStructuralFeature[features_.size()];
for (int i = 0; i < features.length; i++)
features[i] = (EStructuralFeature) features_.get(i);
for (int i = 0; i < features.length; i++)
internalAdaptFeature(features[i]);
}
public void unadaptFeature(EStructuralFeature feature) {
features_.remove(feature);
internalUnadaptFeature(feature);
}
private void internalUnadaptFeature(EStructuralFeature feature) {
if (eObject_ != null) {
Object featureObject = eObject_.eGet(feature);
if (featureObject instanceof EObject)
((EObject) featureObject).eAdapters().remove(this);
else if (featureObject instanceof EList) {
EList eList = (EList) featureObject;
for (int i = 0; i < eList.size(); i++) {
Object object = eList.get(i);
if (object instanceof EObject)
((EObject) object).eAdapters().remove(this);
}
}
}
}
private void unadaptAllCachedFeature() {
EStructuralFeature[] features = new EStructuralFeature[features_.size()];
for (int i = 0; i < features.length; i++)
features[i] = (EStructuralFeature) features_.get(i);
for (int i = 0; i < features.length; i++)
internalUnadaptFeature(features[i]);
}
public void dispose() {
if (eObject_ != null)
eObject_.eAdapters().remove(this);
unadaptAllCachedFeature();
features_ = null;
}
}