/*******************************************************************************
* Copyright (c) 2010 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.papyrus.xwt.jface;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.databinding.observable.IChangeListener;
import org.eclipse.core.databinding.observable.IDisposeListener;
import org.eclipse.core.databinding.observable.IStaleListener;
import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.core.databinding.observable.map.IMapChangeListener;
import org.eclipse.core.databinding.observable.map.IObservableMap;
import org.eclipse.core.databinding.observable.set.IObservableSet;
import org.eclipse.core.databinding.property.value.IValueProperty;
import org.eclipse.papyrus.xwt.internal.core.BindingExpressionPath;
import org.eclipse.papyrus.xwt.internal.core.ScopeManager;
public class XWTObservableWrapper implements IObservableMap {
private IObservableMap delegate;
private IObservableSet domain;
private Object control;
private Object data;
private String path;
private List<IMapChangeListener> changeListeners = Collections.emptyList();
public XWTObservableWrapper(IObservableSet domain, Object control, String path) {
this.control = control;
this.domain = domain;
this.path = path;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public void addMapChangeListener(IMapChangeListener listener) {
if(delegate == null) {
if(changeListeners.isEmpty()) {
changeListeners = new ArrayList<IMapChangeListener>();
}
changeListeners.add(listener);
} else {
delegate.addMapChangeListener(listener);
}
}
public void clear() {
checkDelegated();
delegate.clear();
}
public boolean containsKey(Object key) {
checkDelegated();
return delegate.containsKey(key);
}
public boolean containsValue(Object value) {
checkDelegated();
return delegate.containsValue(value);
}
public Set entrySet() {
checkDelegated();
return delegate.entrySet();
}
public boolean equals(Object o) {
checkDelegated();
return delegate.equals(o);
}
public Object get(Object key) {
if(data == null) {
data = key;
}
checkDelegated();
return delegate.get(key);
}
public Object getKeyType() {
checkDelegated();
return delegate.getKeyType();
}
public Object getValueType() {
checkDelegated();
return delegate.getValueType();
}
public int hashCode() {
checkDelegated();
return delegate.hashCode();
}
public boolean isEmpty() {
checkDelegated();
return delegate.isEmpty();
}
public Set keySet() {
checkDelegated();
return delegate.keySet();
}
public Object put(Object key, Object value) {
checkDelegated();
return delegate.put(key, value);
}
public void putAll(Map t) {
checkDelegated();
delegate.putAll(t);
}
public Object remove(Object key) {
checkDelegated();
return delegate.remove(key);
}
public void removeMapChangeListener(IMapChangeListener listener) {
if(delegate == null) {
changeListeners.remove(listener);
} else {
delegate.removeMapChangeListener(listener);
}
}
public int size() {
checkDelegated();
return delegate.size();
}
public Collection values() {
checkDelegated();
return delegate.values();
}
public void addChangeListener(IChangeListener listener) {
checkDelegated();
delegate.addChangeListener(listener);
}
public void addDisposeListener(IDisposeListener listener) {
checkDelegated();
delegate.addDisposeListener(listener);
}
public void addStaleListener(IStaleListener listener) {
checkDelegated();
delegate.addStaleListener(listener);
}
public void dispose() {
if(delegate != null) {
delegate.dispose();
}
}
public Realm getRealm() {
checkDelegated();
return delegate.getRealm();
}
public boolean isDisposed() {
checkDelegated();
return delegate.isDisposed();
}
public boolean isStale() {
checkDelegated();
return delegate.isStale();
}
public void removeChangeListener(IChangeListener listener) {
checkDelegated();
delegate.removeChangeListener(listener);
}
public void removeDisposeListener(IDisposeListener listener) {
checkDelegated();
delegate.removeDisposeListener(listener);
}
public void removeStaleListener(IStaleListener listener) {
checkDelegated();
delegate.removeStaleListener(listener);
}
protected void checkDelegated() {
if(delegate == null) {
IValueProperty property = ScopeManager.createValueProperty(control, data, new BindingExpressionPath(path));
delegate = property.observeDetail(domain);
for(IMapChangeListener listener : changeListeners) {
delegate.addMapChangeListener(listener);
}
changeListeners.clear();
}
}
}