/*******************************************************************************
* Copyright (c) 2006, 2010 Soyatec (http://www.soyatec.com) 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:
* Soyatec - initial API and implementation
*******************************************************************************/
package org.eclipse.papyrus.xwt.databinding;
import java.lang.reflect.Array;
import org.eclipse.core.databinding.observable.ChangeEvent;
import org.eclipse.core.databinding.observable.Diffs;
import org.eclipse.core.databinding.observable.DisposeEvent;
import org.eclipse.core.databinding.observable.IChangeListener;
import org.eclipse.core.databinding.observable.IDisposeListener;
import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.core.databinding.observable.value.AbstractObservableValue;
import org.eclipse.core.databinding.observable.value.IObservableValue;
/**
* Manage the Array to List and then update from List to Array
*
* @author yyang
*/
public class ListToArrayObservableValue extends AbstractObservableValue {
protected IObservableList source;
protected IObservableValue target;
protected Object valueType;
protected Object cacheData;
public ListToArrayObservableValue(IObservableList source, IObservableValue target) {
super(source.getRealm());
this.source = source;
this.target = target;
source.addChangeListener(new IChangeListener() {
public void handleChange(ChangeEvent event) {
ListToArrayObservableValue.this.handleChange();
}
});
source.addDisposeListener(new IDisposeListener() {
public void handleDispose(DisposeEvent event) {
ListToArrayObservableValue.this.dispose();
}
});
}
protected Object doGetValue() {
return source;
}
protected void doSetValue(Object value) {
super.doSetValue(value);
}
public Object getValueType() {
return source.getElementType();
}
@Override
public synchronized void dispose() {
super.dispose();
source.dispose();
target.dispose();
source = null;
target = null;
}
protected void handleChange() {
try {
Object elements = Array.newInstance((Class<?>)getValueType(), source.size());
Object[] objects = source.toArray((Object[])elements);
if(cacheData == null) {
cacheData = target.getValue();
}
target.setValue(objects);
fireValueChange(Diffs.createValueDiff(cacheData, objects));
cacheData = objects;
} catch (NegativeArraySizeException e) {
e.printStackTrace();
}
}
}