/// *****************************************************************************
// * Copyright (c) 2013 Cedric Dumoulin.
// *
// *
// * 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 - Initial API and implementation
// *
// *****************************************************************************/
//
// package org.eclipse.papyrus.internal.infra.gmfdiag.layers.runtime.notifier;
//
// import java.util.ArrayList;
// import java.util.List;
//
// import org.eclipse.papyrus.internal.infra.gmfdiag.layers.model.layers.RegExpLayer;
//
/// **
// * Common ancestor of DerivedViewLayerNotifier.
// * This class maintains a list of listeners. It allows to add and remove listeners.
// * If there is no more listener, stop listening on external events.
// * Start listening on external events as soon as there is a listener.
// *
// * @author cedric dumoulin
// *
// */
// public abstract class AbstractDerivedViewLayerNotifier {
//
// /**
// * List of listeners that should be notified.
// */
// protected List<RegExpLayer> listeners = new ArrayList<RegExpLayer>();
//
// /**
// * Indicate if this Notifier is listening on externals events
// */
// private boolean isListening = false;
//
// /**
// * Attach the listener to this notifier.
// *
// * @param layer
// */
// public void addListener(RegExpLayer listener) {
// if (!listeners.contains(listener)) {
// listeners.add(listener);
// checkStartListening();
// }
// }
//
// /**
// * Attach the listener to this notifier.
// *
// * @param layer
// */
// public void removeListener(RegExpLayer listener) {
// listeners.remove(listener);
// checkStopListening();
//
// }
//
// /**
// * Attach the listener to this notifier.
// *
// * @param layer
// */
// public void removeAllListeners() {
// isListening = false;
// listeners.clear();
// stopListening();
// }
//
// /**
// * Check if we should start listening.
// * If the class is not listening on externals events, and there is some listeners, then
// * start listening (call {@link #startListening()} and set {@link #isListening()} to true.
// */
// private void checkStartListening() {
// if (!isListening() && listeners.size() > 0) {
// isListening = true;
// startListening();
// }
// }
//
// /**
// * Check if we should stop listening.
// * If the class is listening on externals events, and there is no more listeners, then
// * stop listening (call {@link #stopListening()} and set {@link #isListening()} to false.
// */
// private void checkStopListening() {
// if (isListening() && listeners.size() == 0) {
// isListening = false;
// stopListening();
// }
// }
//
// /**
// * fire the event to all registered listeners.
// */
// public void fireEvent() {
// for (RegExpLayer listener : listeners) {
// // listener.evaluateExpr();
// }
// }
//
// /**
// * Start listening on external events.
// * Should be implemented by subclass
// */
// abstract protected void startListening();
//
// /**
// * Stop listening on external events.
// * Should be implemented by subclass
// */
// abstract protected void stopListening();
//
// /**
// * Return true if this Notifier is listening on externals events.
// *
// * @return
// */
// public boolean isListening() {
// // This notifier is listening if there is some listener in the list
// return isListening;
// }
//
//
//
// }
