/*******************************************************************************
* Copyright (c) 2009 Matthew Hall 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:
* Matthew Hall - initial API and implementation (bug 265561)
* Matthew Hall - bug 268336
******************************************************************************/
package org.eclipse.ufacekit.ui.jfx.databinding.internal;
import java.beans.PropertyDescriptor;
import java.util.HashMap;
import java.util.Map;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import org.eclipse.core.databinding.observable.IDiff;
import org.eclipse.core.databinding.property.IProperty;
import org.eclipse.core.databinding.property.ISimplePropertyListener;
import org.eclipse.core.databinding.property.NativePropertyListener;
/**
* @since 3.3
*
*/
public abstract class FXBeanPropertyListener extends NativePropertyListener {
private final PropertyDescriptor propertyDescriptor;
private final Map<Object, ChangeListener<Object>> map = new HashMap<Object, ChangeListener<Object>>();
protected FXBeanPropertyListener(IProperty property,
PropertyDescriptor propertyDescriptor,
ISimplePropertyListener listener) {
super(property, listener);
this.propertyDescriptor = propertyDescriptor;
}
public void propertyChange(java.beans.PropertyChangeEvent evt) {
if (evt.getPropertyName() == null
|| propertyDescriptor.getName().equals(evt.getPropertyName())) {
Object oldValue = evt.getOldValue();
Object newValue = evt.getNewValue();
IDiff diff;
if (evt.getPropertyName() == null || oldValue == null
|| newValue == null)
diff = null;
else
diff = computeDiff(oldValue, newValue);
fireChange(evt.getSource(), diff);
}
}
protected abstract IDiff computeDiff(Object oldValue, Object newValue);
protected void doAddTo(Object source) {
if( ! map.containsKey(source) ) {
ChangeListener<Object> l = new ChangeListener<Object>() {
@Override
public void changed(ObservableValue<? extends Object> source,
Object oldValue, Object newValue) {
IDiff diff;
if (oldValue == null || newValue == null)
diff = null;
else
diff = computeDiff(oldValue, newValue);
fireChange(source, diff);
}
};
map.put(source, l);
FXBeanPropertyListenerSupport.hookListener(source,
propertyDescriptor.getName(), l);
}
}
protected void doRemoveFrom(Object source) {
ChangeListener<Object> l = map.get(source);
if (l != null) {
FXBeanPropertyListenerSupport.unhookListener(source,
propertyDescriptor.getName(), l);
}
}
}