// ============================================================================
//
// Copyright (C) 2006-2016 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.dataprofiler.core.ui.events;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.collections.MultiMap;
import org.apache.commons.collections.map.MultiValueMap;
/**
* DOC yyin class global comment. Detailled comment
*/
public class EventManager {
private static EventManager instance;
// MultiMap<EventEnum,IEventReceiver>
private Map<Object, MultiMap> ctxToReceiverQueueMap;
private EventManager() {
ctxToReceiverQueueMap = new HashMap<Object, MultiMap>();
}
/**
* Getter for instance.
*
* @return the instance
*/
public static synchronized EventManager getInstance() {
if (instance == null) {
instance = new EventManager();
}
return instance;
}
/**
* register repository node's event receiver with its event type. e.g. when opening a editor, need to call register
* to remember its receiver with some widgets.
*
* @param context: the host of the event receiver
* @param event: pointed event
* @param receiver: event handler
* @return
*/
public boolean register(Object context, EventEnum event, IEventReceiver receiver) {
MultiMap receverQueryMap = ctxToReceiverQueueMap.get(context);
if (receverQueryMap == null) {
receverQueryMap = new MultiValueMap();
ctxToReceiverQueueMap.put(context, receverQueryMap);
}
receverQueryMap.put(event, receiver);
return false;
}
/**
* remove the registered receivers & event of some repository node when unnecessory. e.g. when closing some editor.
*
* @param context: the host of the event receiver
* @param event: pointed event
* @param toBeUnRegistered: event handler
* @return false: if the related receivers & event of some repository node is not registered yet.
*/
public boolean unRegister(Object context, EventEnum event, IEventReceiver toBeUnRegistered) {
MultiMap receverQueryMap = ctxToReceiverQueueMap.get(context);
if (receverQueryMap == null) {
return false;
}
if (receverQueryMap.containsValue(toBeUnRegistered)) {
receverQueryMap.remove(event, toBeUnRegistered);
}
return true;
}
/**
* clear all eventReceivers for the current event, for the current context
*
* @param context
* @param event
* @return
*/
public boolean clearEvent(Object context, EventEnum event) {
MultiMap receverQueryMap = ctxToReceiverQueueMap.get(context);
if (receverQueryMap == null) {
return false;
}
receverQueryMap.remove(event);
return true;
}
/**
* call the registered event's related receiver to handle
*
* @param context
* @param event
* @param data
*/
public boolean publish(Object context, EventEnum event, Object data) {
MultiMap receverQueryMap = ctxToReceiverQueueMap.get(context);
if (receverQueryMap == null || receverQueryMap.isEmpty()) {
return true;
}
List<IEventReceiver> receivers = (List<IEventReceiver>) receverQueryMap.get(event);
if (receivers == null || receivers.size() == 0) {
return true;
}
// Notify the receiver to handle the event.
boolean handleResult = Boolean.TRUE;
for (IEventReceiver receiver : receivers) {
handleResult = receiver.handle(data);
if (!handleResult) {
break;
}
}
return handleResult;
}
/**
* find if there are some registered event for the context, if existed, return the index position in the event list.
*
* @param context
* @param event
* @return
*/
public IEventReceiver findRegisteredEvent(Object context, EventEnum event, int index) {
MultiMap receverQueryMap = ctxToReceiverQueueMap.get(context);
if (receverQueryMap == null || receverQueryMap.isEmpty()) {
return null;
}
List<IEventReceiver> receivers = (List<IEventReceiver>) receverQueryMap.get(event);
if (receivers == null || receivers.size() == 0 || receivers.size() < index) {
return null;
}
return receivers.get(index);
}
}