/**
* @version $Id: ObjectSyncManager.java 1839 2014-04-16 02:33:51Z yukihiro-kinjyo $
*
* 2011/09/15 19:11:19
* @author kousuke-morishima
*
* Copyright 2011-2014 TIDAコンソーシアム All Rights Reserved.
*/
package com.tida_okinawa.corona.ui.editors;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author kousuke-morishima
*/
public class ObjectSyncManager {
private ObjectSyncManager() {
}
public static final ObjectSyncManager INSTANCE = new ObjectSyncManager();
private Map<Object, List<IObjectSyncListener>> targetMap = new HashMap<Object, List<IObjectSyncListener>>();
/**
* 監視対象オブジェクトの変更通知を受け取るリスナーを登録する
*
* @param target
* 監視対象オブジェクト
* @param listener
* 通知を受け取るリスナー
*/
public void addListener(Object target, IObjectSyncListener listener) {
if (target != null) {
List<IObjectSyncListener> listeners = targetMap.get(target);
if (listeners == null) {
listeners = new ArrayList<IObjectSyncListener>();
targetMap.put(target, listeners);
}
listeners.add(listener);
}
}
/**
* 指定したリスナーへ監視対象オブジェクトからの変更通知がこないようにする<br />
* 監視対象オブジェクトが登録されていないとき、このメソッドは何も行わない
*
* @param target
* 監視対象オブジェクト
* @param listener
* 変更通知受け取りをやめるリスナー
*/
public void removeListener(Object target, IObjectSyncListener listener) {
if (target != null) {
List<IObjectSyncListener> listeners = targetMap.get(target);
if (listeners != null) {
listeners.remove(listener);
if (listeners.size() == 0) {
targetMap.remove(target);
}
}
}
}
/**
* 監視対象オブジェクトの変更を通知する
*
* @param target
* 監視対象オブジェクト
* @param modifiedItems
* 変更されたオブジェクト。監視対象の内包物かもしれないし、監視対象オブジェクトそのものかもしれない
* @param eventType
* @see ObjectSyncEvent#ADDED
* @see ObjectSyncEvent#REMOVED
* @see ObjectSyncEvent#MODIFIED
*/
public void modified(Object target, Object[] modifiedItems, int eventType) {
if (target != null) {
List<IObjectSyncListener> listeners = targetMap.get(target);
if (listeners != null) {
ObjectSyncEvent event = new ObjectSyncEvent(target, modifiedItems, eventType);
for (IObjectSyncListener l : listeners) {
l.modified(event);
}
}
}
}
/**
* オブジェクトが誰かの監視対象になっているかを返す
*
* @param target
* @return 監視対象ならtrue
*/
public boolean isListening(Object target) {
return targetMap.containsKey(target);
}
}