/*******************************************************************************
* Copyright (c) 2006-2013 The RCP Company 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:
* The RCP Company - initial API and implementation
*******************************************************************************/
package com.rcpcompany.uibindings.observables;
import org.eclipse.core.databinding.observable.IStaleListener;
import org.eclipse.core.databinding.observable.StaleEvent;
import org.eclipse.core.databinding.observable.value.AbstractObservableValue;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.databinding.observable.value.IValueChangeListener;
import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
/**
* Proxy wrapper class for IObservableValue instances.
*/
public class ProxyObservableValue extends AbstractObservableValue {
private final IObservableValue wrappedValue;
private final IValueChangeListener valueChangeListener = new IValueChangeListener() {
@Override
public void handleValueChange(ValueChangeEvent event) {
fireValueChange(event.diff);
}
};
IStaleListener staleListener = new IStaleListener() {
@Override
public void handleStale(StaleEvent staleEvent) {
fireStale();
}
};
/**
* Constructs an UnmodifiableObservableValue which wraps the given observable value
*
* @param wrappedValue the observable value to wrap in an unmodifiable instance.
*/
public ProxyObservableValue(IObservableValue wrappedValue) {
super(wrappedValue.getRealm());
this.wrappedValue = wrappedValue;
}
@Override
public synchronized void dispose() {
if (hasListeners()) {
lastListenerRemoved();
}
super.dispose();
}
@Override
protected void firstListenerAdded() {
super.firstListenerAdded();
wrappedValue.addValueChangeListener(valueChangeListener);
wrappedValue.addStaleListener(staleListener);
}
@Override
protected void lastListenerRemoved() {
wrappedValue.removeValueChangeListener(valueChangeListener);
wrappedValue.removeStaleListener(staleListener);
super.lastListenerRemoved();
}
@Override
protected Object doGetValue() {
return wrappedValue.getValue();
}
@Override
protected void doSetValue(Object value) {
wrappedValue.setValue(value);
}
@Override
public Object getValueType() {
return wrappedValue.getValueType();
}
@Override
public boolean isStale() {
return wrappedValue.isStale();
}
}