/**
*
*/
package org.eclipse.papyrus.infra.core.lifecycleevents;
import java.util.ArrayList;
import java.util.List;
/**
* This class provides events about the life cycle of a MultiEditor. Not all
* life cycle events are available. Available events:
* <ul>
* <li>aboutToDoSave, aboutToDoSaveAs - SaveEventListener</li>
* <li>doSave, doSaveAs - SaveEventListener</li>
* <li>afterDoSave, afterDoSaveAs - SaveEventListener</li>
* <li></li>
* <li></li>
* </ul>
*
*
* @author cedric dumoulin
*
*/
public class LifeCycleEventsProvider implements ILifeCycleEventsProvider {
/**
*
*/
protected SaveEventListenerLazyList preSaveListeners = new SaveEventListenerLazyList();
/**
*
*/
protected SaveEventListenerLazyList saveListeners = new SaveEventListenerLazyList();
/**
*
*/
protected SaveEventListenerLazyList postSaveListeners = new SaveEventListenerLazyList();
/**
* Add specified listener.
*
* @param listener
*/
public void addDoSaveListener(ISaveEventListener listener) {
saveListeners.addListener(listener);
}
/**
* Remove specified listener.
*
* @param listener
*/
public void removeDoSaveListener(ISaveEventListener listener) {
saveListeners.removeListener(listener);
}
/**
* Add specified listener.
*
* @param listener
*/
public void addAboutToDoSaveListener(ISaveEventListener listener) {
preSaveListeners.addListener(listener);
}
/**
* Remove specified listener.
*
* @param listener
*/
public void removeAboutToDoSaveListener(ISaveEventListener listener) {
preSaveListeners.removeListener(listener);
}
/**
* Add specified listener.
*
* @param listener
*/
public void addPostDoSaveListener(ISaveEventListener listener) {
postSaveListeners.addListener(listener);
}
/**
* Remove specified listener.
*
* @param listener
*/
public void removePostDoSaveListener(ISaveEventListener listener) {
postSaveListeners.removeListener(listener);
}
// ****************************************************** //
// Fire events methods //
// ****************************************************** //
/**
* Fire AboutToSaveEvent to registered Listeners.
*
* @param editorPart
*/
public void fireAboutToDoSaveEvent(DoSaveEvent event) {
preSaveListeners.fireSaveEvent(event);
}
/**
* Fire AboutToSaveAs to registered Listeners.
*
* @param editorPart
*/
public void fireAboutToDoSaveAsEvent(DoSaveEvent event) {
preSaveListeners.fireSaveAsEvent(event);
}
/**
* Fire AboutToSaveEvent to registered Listeners.
*
* @param editorPart
*/
public void fireDoSaveEvent(DoSaveEvent event) {
saveListeners.fireSaveEvent(event);
}
/**
* Fire AboutToSaveAs to registered Listeners.
*
* @param editorPart
*/
public void fireDoSaveAsEvent(DoSaveEvent event) {
saveListeners.fireSaveAsEvent(event);
}
/**
* Fire AboutToSaveEvent to registered Listeners.
*
* @param editorPart
*/
public void firePostDoSaveEvent(DoSaveEvent event) {
postSaveListeners.fireSaveEvent(event);
}
/**
* Fire AboutToSaveAs to registered Listeners.
*
* @param editorPart
*/
public void firePostDoSaveAsEvent(DoSaveEvent event) {
postSaveListeners.fireSaveAsEvent(event);
}
/**
* Fire all Save events (about, events, post) to registered Listeners.
* Exceptions from listeners are propagated and stop the event chain.
*
* @param editorPart
*/
public void fireAllDoSaveEvent(DoSaveEvent event) {
fireAboutToDoSaveEvent(event);
fireDoSaveEvent(event);
firePostDoSaveEvent(event);
}
/**
* Fire all SaveAs events (about, events, post) to registered Listeners. If
* one of the saveAs event fail, post events are not sent.
*
* @param editorPart
*/
public void fireAllDoSaveAsEvent(DoSaveEvent event) {
fireAboutToDoSaveAsEvent(event);
fireDoSaveAsEvent(event);
firePostDoSaveAsEvent(event);
}
/**
* Base class encapsulating a lazy creation list.
*
* @author cedric dumoulin
*
* @param <T>
*/
abstract protected class AbstractEventListenersLazyList<T> {
List<T> listeners;
/**
* Add specified listener.
*
* @param listener
*/
public void addListener(T listener) {
// Lazy creation
if(listeners == null)
listeners = new ArrayList<T>();
// do not add if already present.
if(listeners.contains(listener))
return;
listeners.add(listener);
}
/**
* Remove specified listener.
*
* @param listener
*/
public void removeListener(T listener) {
// Lazy creation
if(listeners == null)
return;
listeners.remove(listener);
}
/**
* @return the listeners
*/
protected List<T> getListeners() {
return listeners;
}
/**
* Remove all listeners.
*/
protected void clear() {
if (listeners != null) {
listeners.clear();
}
}
}
/**
* List of {@link ISaveEventListener}.
*
* @author cedric dumoulin
*
*/
protected class SaveEventListenerLazyList extends AbstractEventListenersLazyList<ISaveEventListener> {
/**
* Fire OpenEvent to registered Listeners. If a listener throw an
* exception, remaining listeners are called, and then the exception is
* resent.
*
* @param editorPart
*/
public void fireSaveEvent(DoSaveEvent event) {
// Lazy creation
if(listeners == null)
return;
for(ISaveEventListener listener : listeners) {
listener.doSave(event);
}
}
/**
* Fire OpenEvent to registered Listeners.
*
* @param editorPart
*/
public void fireSaveAsEvent(DoSaveEvent event) {
// Lazy creation
if(listeners == null)
return;
for(ISaveEventListener listener : listeners) {
listener.doSaveAs(event);
}
}
}
}