/*******************************************************************************
* 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.internal.observableFactories;
import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.emf.databinding.edit.EditingDomainEObjectObservableList;
import org.eclipse.emf.databinding.edit.EditingDomainEObjectObservableValue;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.edit.domain.EditingDomain;
import com.rcpcompany.uibindings.AbstractEMFObservableFactory;
import com.rcpcompany.uibindings.IEMFObservableFactory;
import com.rcpcompany.uibindings.model.utils.BasicUtils;
import com.rcpcompany.uibindings.utils.EditingDomainUtils;
/**
* Default implementation of {@link IEMFObservableFactory} that uses the editing domain of the
* manager.
*
* @author Tonny Madsen, The RCP Company
*/
public class DefaultEMFObservableFactory extends AbstractEMFObservableFactory implements IEMFObservableFactory {
@Override
public IObservableList observeList(Realm realm, EditingDomain editingDomain, EObject object,
EStructuralFeature structuralFeature) {
if (editingDomain == null) {
editingDomain = EditingDomainUtils.getEditingDomain();
}
return new EditingDomainEObjectObservableList(realm, editingDomain, object, structuralFeature);
}
@Override
public IObservableValue observeValue(Realm realm, EditingDomain editingDomain, EObject object,
EStructuralFeature structuralFeature) {
if (editingDomain == null) {
editingDomain = EditingDomainUtils.getEditingDomain();
}
return new MyEditingDomainEObjectObservableValue(realm, editingDomain, object, structuralFeature);
}
/**
* Version of {@link EditingDomainEObjectObservableValue} that will shortcut
* {@link #setValue(Object)} if the new value is equal to the current value.
*
* @author Tonny Madsen, The RCP Company
*/
public static class MyEditingDomainEObjectObservableValue extends EditingDomainEObjectObservableValue {
/**
* Constructs and returns a new value.
*
* @param realm the realm
* @param domain the editing domain
* @param eObject the object
* @param eStructuralFeature the feature
*/
public MyEditingDomainEObjectObservableValue(Realm realm, EditingDomain domain, EObject eObject,
EStructuralFeature eStructuralFeature) {
super(realm, domain, eObject, eStructuralFeature);
}
@Override
protected void doSetValue(Object value) {
if (BasicUtils.equals(eObject.eGet(eStructuralFeature), value)) return;
super.doSetValue(value);
}
}
}