diff options
Diffstat (limited to 'extraplugins/layers/org.eclipse.papyrus.layers.runtime/src/org/eclipse/papyrus/layers/runtime/LayersModelEventNotifier.java')
-rw-r--r-- | extraplugins/layers/org.eclipse.papyrus.layers.runtime/src/org/eclipse/papyrus/layers/runtime/LayersModelEventNotifier.java | 447 |
1 files changed, 447 insertions, 0 deletions
diff --git a/extraplugins/layers/org.eclipse.papyrus.layers.runtime/src/org/eclipse/papyrus/layers/runtime/LayersModelEventNotifier.java b/extraplugins/layers/org.eclipse.papyrus.layers.runtime/src/org/eclipse/papyrus/layers/runtime/LayersModelEventNotifier.java new file mode 100644 index 00000000000..4c15cb07aab --- /dev/null +++ b/extraplugins/layers/org.eclipse.papyrus.layers.runtime/src/org/eclipse/papyrus/layers/runtime/LayersModelEventNotifier.java @@ -0,0 +1,447 @@ +/******************************************************************************* + * Copyright (c) 2013 CEA LIST. + * 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: + * Cedric Dumoulin - cedric.dumoulin@lifl.fr + ******************************************************************************/ +package org.eclipse.papyrus.layers.runtime; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.emf.common.notify.Adapter; +import org.eclipse.emf.common.notify.Notification; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.util.EContentAdapter; +import org.eclipse.papyrus.layers.stackmodel.NotFoundException; +import org.eclipse.papyrus.layers.stackmodel.layers.AbstractLayer; +import org.eclipse.papyrus.layers.stackmodel.layers.LayersPackage; +import org.eclipse.papyrus.layers.stackmodel.layers.LayersStack; +import org.eclipse.papyrus.layers.stackmodel.layers.TypeInstance; +import org.eclipse.papyrus.layers.stackmodel.layers.impl.StringToTypeInstanceMapImpl; +import org.eclipse.papyrus.layers.stackmodel.layers.util.ECoreUtils; +import static org.eclipse.papyrus.layers.runtime.Activator.log; + +/** + * This class listen to a {@link LayersStack} and send event to listeners. + * + * @author cedric dumoulin + * + */ +public class LayersModelEventNotifier { + + /** + * The observed {@link LayersStack}. + */ + protected LayersStack layersStack; + + /** + * List of listener to notify. + */ + protected List<ILayersModelEventListener> listeners = new ArrayList<ILayersModelEventListener>(); + + /** + * listener on layers changes. + * + */ + protected Adapter layersListener = new EContentAdapter() { + + @Override + public void notifyChanged(Notification notification) { + if(log.isDebugEnabled() ) { + log.debug( this.getClass().getSimpleName() + ".event received " + notification.getFeature()); + } + + // Self atttach + super.notifyChanged(notification); + + // Check layers modification + // There is two sources: LayerOperator::layers and LayersStack::layers + if( notification.getFeature() == LayersPackage.eINSTANCE.getLayerOperator_Layers() + || notification.getFeature() == LayersPackage.eINSTANCE.getLayersStack_Layers() ) { + // LayerOperator::layers || LayersStack::layers + // check the event type. + switch(notification.getEventType()) { + case Notification.SET: + fireLayerSet(notification); + break; + case Notification.ADD: + // A layer is added + fireLayerAdded(notification); + break; + case Notification.REMOVE: + // A layer is removed + fireLayerRemoved(notification); + break; + case Notification.MOVE: + // A layer is moved + fireLayerMoved(notification); + break; + } + } + // Check view event + // View event can by fired by: AbstractLayer::views + else if (notification.getFeature() == LayersPackage.eINSTANCE.getAbstractLayer_Views() ) { + + // check the event type. + switch(notification.getEventType()) { + case Notification.ADD: + // A layer is added + // the concerned view +// View view = (View)notification.getNewValue(); +// AbstractLayer layer = (AbstractLayer)notification.getNotifier() + + fireViewAddedToLayer(notification); + break; + case Notification.ADD_MANY: + // A layer is added + // the concerned view +// View view = (View)notification.getNewValue(); +// AbstractLayer layer = (AbstractLayer)notification.getNotifier() + + fireMultiViewsAddedToLayer(notification); + break; + case Notification.REMOVE: + // A layer is removed + // the concerned view +// View view = (View)notification.getOldValue(); +// AbstractLayer layer = (AbstractLayer)notification.getNotifier() + + fireViewRemovedFromLayer(notification); + break; + case Notification.REMOVE_MANY: + // A layer is removed + // the concerned view +// View view = (View)notification.getOldValue(); +// AbstractLayer layer = (AbstractLayer)notification.getNotifier() + + fireMultiViewsRemovedFromLayer(notification); + break; + } + + } + // Check instance addition/deletion + // instance event can by fired by: AbstractLayer::propertyValuesMap + else if (notification.getFeature() == LayersPackage.eINSTANCE.getAbstractLayer_PropertyValueMap() ) { + // check the event type. + switch(notification.getEventType()) { +// case Notification.SET: +// { +// // A key is added +// break; +// } +// case Notification.UNSET: +// // A key is added +// break; + case Notification.ADD: + { + // An entry is added + StringToTypeInstanceMapImpl entry = (StringToTypeInstanceMapImpl)notification.getNewValue(); +// System.out.println("ADD" + entry.getValue() +// + ", key=" + entry.getKey()); + // Add the corresponding instance to propertyValues + //Layer layer = (Layer)notification.getNotifier(); + //String propertyName = entry.getKey(); + //TypeInstance propertyValue = (TypeInstance)entry.getValue(); + firePropertyValueAddedEvent(notification); + break; + } + case Notification.REMOVE: + { + // An entry is removed + StringToTypeInstanceMapImpl entry = (StringToTypeInstanceMapImpl)notification.getOldValue(); +// System.out.println("REMOVE" + entry.getValue() +// + ", key=" + entry.getKey()); + // Add the corresponding instance to propertyValues + //Layer layer = (Layer)notification.getNotifier(); + //String propertyName = entry.getKey(); + //TypeInstance propertyValue = (TypeInstance)entry.getValue(); + firePropertyValueRemoved(notification); + break; + } + default: + break; + } + + } + // Check if the isLayerEnabled is modified + // sources: LayerExpression::IsLayerEnabled + else if(notification.getFeature() == LayersPackage.eINSTANCE.getLayerExpression_IsLayerEnabled() ) { + firePropertyValueChanged(notification); + } + + // Check property instance modification event + // instance change event can by fired by: any modification in a subclass of TypeInstance + else { + try { + // Lookup if the event comes from a type instance + TypeInstance ancestor = (TypeInstance)ECoreUtils.lookupAncestorOfType((EObject)notification.getNotifier(), LayersPackage.eINSTANCE.getTypeInstance()); + // originating layer + AbstractLayer layer = (AbstractLayer)ECoreUtils.lookupAncestorOfType((EObject)notification.getNotifier(), LayersPackage.eINSTANCE.getAbstractLayer()); + // or: layer = (AbstractLayer)ancestor.eContainer().eContainer().eContainer(); + // StringToTypeInstanceMapImpl entry = (StringToTypeInstanceMapImpl)ancestor.eContainer(); + //String propertyName = entry.getKey(); + //TypeInstance propertyValue = (TypeInstance)entry.getValue(); + // +// String propertyName + // check the event type. + switch(notification.getEventType()) { + case Notification.SET: + // An instance value is set + firePropertyValueChanged(notification); + break; + case Notification.ADD: + // An instance value is set + firePropertyValueChanged(notification); + break; + case Notification.REMOVE: + // An instance value is set + firePropertyValueChanged(notification); + break; + } + } catch (NotFoundException e) { + // lookupAncestorOfType() found nothing + // silently fail + } + + + + } + + } + }; + + /** + * Constructor. + * + * @param layersStack The observed {@link LayersStack}. + */ + public LayersModelEventNotifier(LayersStack layersStack) { + this.layersStack = layersStack; + activate(); + } + + /** + * setup the listeners. + */ + protected void activate() { + layersStack.eAdapters().add(layersListener); + + } + + /** + * remove the listeners. + */ + protected void deactivate() { + layersStack.eAdapters().remove(layersListener); + + } + + /** + * Dispose this object. + */ + public void dispose() { + + deactivate(); + listeners.clear(); + layersListener = null; + } + + /** + * Return true if the object is disposed. + * @return + */ + public boolean isDisposed() { + return layersListener==null; + } + + /** + * Add the specified listener to the list of listener. + * Do not add it if the listener is already in the list. + * + * @param listener + */ + public void addLayersModelEventListener(ILayersModelEventListener listener) { + + if(listener == null ) { + return; + } + + // Check if exist + if( listeners.contains(listener)) { + return; + } + + listeners.add(listener); + } + + /** + * Remove the specified listener from the list of listeners. + * @param listener + */ + public void removeLayersModelEventListener(ILayersModelEventListener listener) { + + listeners.remove(listener); + } + /** + * Method called when a value is added to one layer. + * The vent contains: the layer, the property name, the new value. + * + * @param notification + */ + public void firePropertyValueAddedEvent( Notification notification ) { + + for(ILayersModelEventListener listener : listeners) { + listener.propertyValueAdded(notification); + } + } + + /** + * Method called when a value is removed from one layer. + * The vent contains: the layer, the property name, the new value. + * + * @param notification + */ + public void firePropertyValueRemoved( Notification notification ) { + + for(ILayersModelEventListener listener : listeners) { + listener.propertyValueRemoved(notification); + } + } + + /** + * Method called when a value is changed in one layer. + * The vent contains: the layer, the property name, the new value. + * + * @param notification + */ + public void firePropertyValueChanged( Notification notification ) { + + for(ILayersModelEventListener listener : listeners) { + listener.propertyValueChanged(notification); + } + } + + /** + * Method called when a layer is added to one layer. + * The event contains: the layer. + * + * @param notification + */ + public void fireLayerSet( Notification notification ) { + + for(ILayersModelEventListener listener : listeners) { + listener.layerSet(notification); + } + } + + /** + * Method called when a layer is added to one layer. + * The event contains: the layer. + * + * @param notification + */ + public void fireLayerAdded( Notification notification ) { + + for(ILayersModelEventListener listener : listeners) { + listener.layerAdded(notification); + } + } + + /** + * Method called when a layer is removed from one layer. + * The event contains: the layer. + * + * @param notification + */ + public void fireLayerRemoved( Notification notification ) { + + for(ILayersModelEventListener listener : listeners) { + listener.layerRemoved(notification); + } + } + + /** + * Method called when a layer is moved in LayerStack. + * The event contains: the layer. + * + * @param notification + */ + public void fireLayerMoved( Notification notification ) { + + for(ILayersModelEventListener listener : listeners) { + listener.layerMoved(notification); + } + } + + + /** + * Method called when a view is added to one layer. + * The event contains: the layer, the view. + * + * @param notification + */ + public void fireViewAddedToLayer( Notification notification ) { + + for(ILayersModelEventListener listener : listeners) { + listener.viewAddedToLayer(notification); + } + } + + /** + * Method called when a view is added to one layer. + * The event contains: the layer, the view. + * + * @param notification + */ + public void fireMultiViewsAddedToLayer( Notification notification ) { + + for(ILayersModelEventListener listener : listeners) { + listener.multiViewsAddedToLayer(notification); + } + } + + /** + * Method called when a view is removed from one layer. + * The event contains: the layer, the view. + * + * @param notification + */ + public void fireViewRemovedFromLayer( Notification notification ) { + + for(ILayersModelEventListener listener : listeners) { + listener.viewRemovedFromLayer(notification); + } + } + + /** + * Method called when a view is removed from one layer. + * The event contains: the layer, the view. + * + * @param notification + */ + public void fireMultiViewsRemovedFromLayer( Notification notification ) { + + for(ILayersModelEventListener listener : listeners) { + listener.multiViewsRemovedFromLayer(notification); + } + } + + /** + * Method called when a view is moved from one layer to another layer. + * The event contains: the layer, the view. + * + * @param notification + */ + public void fireViewMovedBetweenLayer( Notification notification ) { + + for(ILayersModelEventListener listener : listeners) { + listener.viewMovedBetweenLayer(notification); + } + } + +} |