blob: 69bc12ac9d8a174a67f37450203604508f0e5674 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 Obeo.
* 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:
* Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.emf.eef.runtime.api.notify;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.util.EContentAdapter;
/**
* @author <a href="mailto:goulwen.lefur@obeo.fr">Goulwen Le Fur</a>
*/
public class ResourceSetAdapter extends EContentAdapter {
/**
* The eClassifiers listeners.
*/
private Map<EClassifier, List<PropertiesEditingSemanticListener>> eClassifierListeners;
/**
* The features listeners.
*/
private Map<EStructuralFeature, List<PropertiesEditingSemanticListener>> eStructuralFeatureListeners;
/**
* The resource set we listen to.
*/
private ResourceSet resourceSet;
/**
* Constructor.
*/
public ResourceSetAdapter(ResourceSet resourceSet) {
super();
this.resourceSet = resourceSet;
eClassifierListeners = new HashMap<EClassifier, List<PropertiesEditingSemanticListener>>();
eStructuralFeatureListeners = new HashMap<EStructuralFeature, List<PropertiesEditingSemanticListener>>();
}
@Override
public boolean isAdapterForType(Object type) {
return type == ResourceSetAdapter.class || ResourceSetAdapter.class.getName().equals(type);
}
/**
* Activates the resource set adapter.
*/
public void activate() {
resourceSet.eAdapters().add(this);
}
/**
* Removes the current adapter from the resource set adapters.
*/
public void deactivate() {
resourceSet.eAdapters().remove(this);
}
/**
* Adds the given listener to the registered listeners.
*
* @param listener
* the listener to remove
*/
public void addEditingSemanticListener(PropertiesEditingSemanticListener listener) {
for (NotificationFilter filter : listener.getFilters()) {
if (filter instanceof EStructuralFeatureNotificationFilter) {
for (EStructuralFeature feature : ((EStructuralFeatureNotificationFilter)filter)
.getFeatures()) {
addEditingSemanticListener(feature, listener);
}
} else if (filter instanceof EClassifierNotificationFilter) {
for (EClassifier eClassifier : ((EClassifierNotificationFilter)filter).getEClassifiers()) {
addEditingSemanticListener(eClassifier, listener);
}
}
}
}
/**
* Adds the given listener to the registered listeners.
*
* @param feature
* the feature key
* @param listener
* the listener to remove
*/
private void addEditingSemanticListener(EStructuralFeature feature,
PropertiesEditingSemanticListener listener) {
List<PropertiesEditingSemanticListener> listeners = eStructuralFeatureListeners.get(feature);
if (listeners == null) {
listeners = new ArrayList<PropertiesEditingSemanticListener>();
eStructuralFeatureListeners.put(feature, listeners);
}
listeners.add(listener);
}
/**
* Adds the given listener to the registered listeners.
*
* @param eClassifier
* the eClassifier key
* @param listener
* the listener to remove
*/
private void addEditingSemanticListener(EClassifier eClassifier,
PropertiesEditingSemanticListener listener) {
List<PropertiesEditingSemanticListener> listeners = eClassifierListeners.get(eClassifier);
if (listeners == null) {
listeners = new ArrayList<PropertiesEditingSemanticListener>();
eClassifierListeners.put(eClassifier, listeners);
}
listeners.add(listener);
}
/**
* Removes the given listener from the registered listeners.
*
* @param listener
* the listener to remove
*/
public void removeEditingSemanticListener(PropertiesEditingSemanticListener listener) {
unregisterEditingSemanticListener(listener);
// if there are no listeners left we remove the adapter
if (eClassifierListeners.size() + eStructuralFeatureListeners.size() == 0)
deactivate();
}
/**
* Unregisters the given listener
* @param listener {@link PropertiesEditingSemanticListener} to unregister.
*/
public void unregisterEditingSemanticListener(PropertiesEditingSemanticListener listener) {
for (NotificationFilter filter : listener.getFilters()) {
if (filter instanceof EStructuralFeatureNotificationFilter) {
for (EStructuralFeature feature : ((EStructuralFeatureNotificationFilter)filter).getFeatures()) {
removeEditingSemanticListener(feature, listener);
}
} else if (filter instanceof EClassifierNotificationFilter) {
for (EClassifier eClassifier : ((EClassifierNotificationFilter)filter).getEClassifiers()) {
removeEditingSemanticListener(eClassifier, listener);
}
}
}
}
/**
* Removes the given listener from the registered listeners.
*
* @param feature
* the feature key
* @param listener
* the listener to remove
*/
private void removeEditingSemanticListener(EStructuralFeature feature,
PropertiesEditingSemanticListener listener) {
List<PropertiesEditingSemanticListener> listeners = eStructuralFeatureListeners.get(feature);
if (listeners != null) {
listeners.remove(listener);
if (listeners.isEmpty()) {
eStructuralFeatureListeners.remove(feature);
}
}
}
/**
* Removes the given listener from the registered listeners.
*
* @param eClassifier
* the classifier key
* @param listener
* the listener to remove
*/
private void removeEditingSemanticListener(EClassifier eClassifier,
PropertiesEditingSemanticListener listener) {
List<PropertiesEditingSemanticListener> listeners = eClassifierListeners.get(eClassifier);
if (listeners != null) {
listeners.remove(listener);
if (listeners.isEmpty()) {
eClassifierListeners.remove(eClassifier);
}
}
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.ecore.util.EContentAdapter#notifyChanged(org.eclipse.emf.common.notify.Notification)
*/
public void notifyChanged(Notification notification) {
super.notifyChanged(notification);
if (notification.getNotifier() instanceof EObject) {
EObject notifier = (EObject)notification.getNotifier();
EClass eClass = notifier.eClass();
if (eClassifierListeners.get(eClass) != null) {
List<PropertiesEditingSemanticListener> listeners = eClassifierListeners.get(eClass);
for (PropertiesEditingSemanticListener listener : new ArrayList<PropertiesEditingSemanticListener>(listeners)) {
listener.notifyChanged(notification);
}
}
}
if (notification.getFeature() instanceof EStructuralFeature) {
EStructuralFeature feature = (EStructuralFeature)notification.getFeature();
if (eStructuralFeatureListeners.get(feature) != null) {
List<PropertiesEditingSemanticListener> listeners = eStructuralFeatureListeners.get(feature);
for (PropertiesEditingSemanticListener listener : new ArrayList<PropertiesEditingSemanticListener>(listeners)) {
listener.notifyChanged(notification);
}
}
}
}
}