package com.rcpcompany.uibindings.bindings.xtext.observables;
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.emf.ecore.EcorePackage;
import org.eclipse.jface.text.DocumentEvent;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IDocumentListener;
import com.rcpcompany.uibindings.model.utils.BasicUtils;
/**
* {@link IObservableValue} for {@link IDocument}.
* <p>
* TODO Handle re-write sessions better.
*
* @author Tonny Madsen, The RCP Company
*/
public class DocumentObservableValue extends AbstractObservableValue {
private final IDocument myDocument;
private IDocumentListener myDocumentListener = null;
public DocumentObservableValue(IDocument document) {
myDocument = document;
}
@Override
public synchronized void dispose() {
if (hasListeners()) {
lastListenerRemoved();
}
super.dispose();
}
@Override
protected void firstListenerAdded() {
myDocumentListener = new IDocumentListener() {
private String oldValue = null;
@Override
public void documentAboutToBeChanged(DocumentEvent event) {
oldValue = myDocument.get();
}
@Override
public void documentChanged(DocumentEvent event) {
fireValueChange(Diffs.createValueDiff(oldValue, myDocument.get()));
}
};
myDocument.addDocumentListener(myDocumentListener);
}
@Override
protected void lastListenerRemoved() {
if (myDocumentListener != null) {
myDocument.removeDocumentListener(myDocumentListener);
}
}
@Override
public Object getValueType() {
return EcorePackage.Literals.ESTRING;
}
@Override
protected Object doGetValue() {
return myDocument.get();
}
@Override
protected void doSetValue(Object value) {
final String s;
if (value == null) {
s = "";
} else {
s = value.toString();
}
if (BasicUtils.equals(s, doGetValue()))
return;
myDocument.set(s);
}
}