blob: bf1615a6b2fd8624373159d93658b94ed4b16260 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009 Siemens AG 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:
* Kai Tödter - initial implementation
******************************************************************************/
package org.eclipse.e4.demo.contacts.databinding;
import org.eclipse.core.databinding.beans.PojoObservables;
import org.eclipse.core.databinding.observable.Diffs;
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;
import org.eclipse.core.databinding.observable.value.WritableValue;
public class AggregateNameObservableValue extends AbstractObservableValue {
private final IObservableValue[] observableValues;
private final IValueChangeListener listener;
private volatile boolean isUpdating;
private String currentStringValue;
public AggregateNameObservableValue(WritableValue value) {
String[] properties = new String[] { "firstName", "middleName",
"lastName" };
observableValues = new IObservableValue[properties.length];
listener = new IValueChangeListener() {
public void handleValueChange(ValueChangeEvent event) {
if (!isUpdating) {
fireValueChange(Diffs.createValueDiff(currentStringValue,
doGetValue()));
}
}
};
int i = 0;
for (String property : properties) {
observableValues[i] = PojoObservables.observeDetailValue(value,
property, String.class);
observableValues[i++].addValueChangeListener(listener);
}
}
@Override
protected Object doGetValue() {
StringBuilder builder = new StringBuilder();
for (IObservableValue value : observableValues) {
String stringValue = ((String) value.getValue());
if (stringValue != null && stringValue.trim().length() > 0) {
builder.append(stringValue.trim());
builder.append(" ");
}
}
currentStringValue = builder.toString().trim();
return currentStringValue;
}
@Override
public void doSetValue(Object value) {
Object oldValue = doGetValue();
String[] nameValues = ((String) value).split(" ");
try {
isUpdating = true;
if (nameValues.length == 3) {
for (int i = 0; i < 3; i++) {
observableValues[i].setValue(nameValues[i]);
}
} else if (nameValues.length == 2) {
observableValues[0].setValue(nameValues[0]);
observableValues[1].setValue("");
observableValues[2].setValue(nameValues[1]);
} else if (nameValues.length == 1) {
observableValues[0].setValue(nameValues[0]);
observableValues[1].setValue("");
observableValues[2].setValue("");
} else {
for (int i = 0; i < 3; i++) {
observableValues[i].setValue("");
}
}
} finally {
isUpdating = false;
}
doGetValue();
fireValueChange(Diffs.createValueDiff(oldValue, value));
}
public Object getValueType() {
return String.class;
}
@Override
public synchronized void dispose() {
for (int i = 0; i < observableValues.length; i++) {
observableValues[i].removeValueChangeListener(listener);
}
super.dispose();
}
}