/**
* <copyright>
*
* Copyright (c) 2007 IBM Corporation 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:
* IBM - Initial API and implementation
*
* </copyright>
*
* $Id: EMFEditObservables.java,v 1.3 2008/04/22 13:35:52 emerks Exp $
*/
package org.eclipse.emf.databinding.edit;
import org.eclipse.core.databinding.observable.IObservable;
import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.core.databinding.observable.map.IObservableMap;
import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
import org.eclipse.core.databinding.observable.masterdetail.MasterDetailObservables;
import org.eclipse.core.databinding.observable.set.IObservableSet;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.emf.common.util.EMap;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.edit.domain.EditingDomain;
/**
* PROVISIONAL This API is subject to arbitrary change, including renaming or
* removal.
*/
public class EMFEditObservables {
/**
* Returns an observable value for the given feature of the object.
*
* @param domain
* the editing domain used for applying changes.
* @param eObject
* the object to observe.
* @param eStructuralFeature
* the feature of the object to observe.
* @return an observable value for the given feature of the object.
*/
@SuppressWarnings("deprecation")
public static IObservableValue observeValue(EditingDomain domain,
EObject eObject, EStructuralFeature eStructuralFeature) {
return new EditingDomainEObjectObservableValue(domain, eObject,
eStructuralFeature);
}
/**
* Returns an observable value for the given feature of the object.
*
* @param realm
* the realm in which to observe.
* @param domain
* the editing domain used for applying changes.
* @param eObject
* the object to observe.
* @param eStructuralFeature
* the feature of the object to observe.
* @return an observable value for the given feature of the object.
*/
@SuppressWarnings("deprecation")
public static IObservableValue observeValue(Realm realm,
EditingDomain domain, EObject eObject,
EStructuralFeature eStructuralFeature) {
return new EditingDomainEObjectObservableValue(realm, domain, eObject,
eStructuralFeature);
}
/**
* Returns an observable value for the given feature of the object.
*
* @param eObject
* the object to observe.
* @param domain
* the editing domain used for applying changes.
* @param eStructuralFeature
* the map feature whose key is observed
* @param key
* the key value
* @param eMapValueFeature
* the value feature name
* @return an observable value for the given feature of the object.
*/
public static IObservableValue observeMapValue(EditingDomain domain, EObject eObject,
EStructuralFeature eStructuralFeature, Object key,
EStructuralFeature eMapValueFeature) {
EMap<?, ?> map = (EMap<?, ?>) eObject.eGet(eStructuralFeature);
return observeValue(domain, (EObject) map.get(map.indexOfKey(key)),
eMapValueFeature);
}
/**
* Returns an observable value for the given feature of the object.
*
* @param realm
* the realm in which to observe.
* @param domain
* the editing domain used for applying changes.
* @param eObject
* the object to observe.
* @param eStructuralFeature
* the map feature whose key is observed
* @param key
* the key value
* @param eMapValueFeature
* the value feature name
* @return an observable value for the given feature of the object.
*/
public static IObservableValue observeMapValue(Realm realm,
EditingDomain domain, EObject eObject, EStructuralFeature eStructuralFeature, Object key,
EStructuralFeature eMapValueFeature) {
EMap<?, ?> map = (EMap<?, ?>) eObject.eGet(eStructuralFeature);
return observeValue(realm, domain, (EObject) map.get(map.indexOfKey(key)),
eMapValueFeature);
}
/**
* Returns an observable list for the given multi-valued feature of the
* object.
*
* @param domain
* the editing domain used for applying changes.
* @param eObject
* the object to observe.
* @param eStructuralFeature
* the feature of the object to observe.
* @return an observable list for the given multi-valued feature of the
* object.
*/
@SuppressWarnings("deprecation")
public static IObservableList observeList(EditingDomain domain,
EObject eObject, EStructuralFeature eStructuralFeature) {
return new EditingDomainEObjectObservableList(domain, eObject,
eStructuralFeature);
}
/**
* Returns an observable list for the given multi-valued feature of the
* object.
*
* @param realm
* the realm in which to observe.
* @param domain
* the editing domain used for applying changes.
* @param eObject
* the object to observe.
* @param eStructuralFeature
* the feature of the object to observe.
* @return an observable list for the given multi-valued feature of the
* object.
*/
@SuppressWarnings("deprecation")
public static IObservableList observeList(Realm realm,
EditingDomain domain, EObject eObject,
EStructuralFeature eStructuralFeature) {
return new EditingDomainEObjectObservableList(realm, domain, eObject,
eStructuralFeature);
}
/**
* Returns an observable map in the default realm tracking the current value
* of the given feature for each object in the given set.
*
* @param domain
* the editing domain used for applying changes.
* @param objects
* the objects to track.
* @param eStructuralFeature
* the feature for which to track the value.
* @return an observable map tracking the current value of the given feature
* for each object in the given set.
*/
@SuppressWarnings("deprecation")
public static IObservableMap observeMap(EditingDomain domain,
IObservableSet objects, EStructuralFeature eStructuralFeature) {
return new EditingDomainEObjectObservableMap(domain, objects,
eStructuralFeature);
}
/**
* Returns an array of observable maps in the default realm tracking the
* current value of the given features for each object in the given set.
*
* @param domain
* the editing domain used for applying changes.
* @param objects
* the objects to track.
* @param eStructuralFeatures
* the features for which to track the value.
* @return an array of observable maps tracking the current value of the
* given features for each object in the given set.
*/
public static IObservableMap[] observeMaps(EditingDomain domain,
IObservableSet objects, EStructuralFeature... eStructuralFeatures) {
IObservableMap[] result = new IObservableMap[eStructuralFeatures.length];
for (int i = 0; i < eStructuralFeatures.length; i++) {
result[i] = observeMap(domain, objects, eStructuralFeatures[i]);
}
return result;
}
/**
* Returns an observable value that tracks the current value of the feature
* of the current value of the master observable value.
*
* @param realm
* the realm in which to observe.
* @param domain
* the editing domain used for applying changes.
* @param value
* the master observable value.
* @param eStructuralFeature
* the feature for which to track the value.
* @return an observable value that tracks the current value of the named
* property for the current value of the master observable value
* @see MasterDetailObservables#detailValue(IObservableValue,
* IObservableFactory, Object)
*/
public static IObservableValue observeDetailValue(Realm realm,
EditingDomain domain, IObservableValue value,
EStructuralFeature eStructuralFeature) {
return MasterDetailObservables.detailValue(value, valueFactory(realm,
domain, eStructuralFeature), eStructuralFeature);
}
/**
* Returns a factory for creating observable values tracking the value of
* the given feature of a particular {@link EObject object}.
*
* @param realm
* the realm in which to observe.
* @param domain
* the editing domain used for applying changes.
* @param eStructuralFeature
* the feature for which to track the value.
* @return an observable factory.
*/
public static IObservableFactory valueFactory(final Realm realm,
final EditingDomain domain,
final EStructuralFeature eStructuralFeature) {
return new IObservableFactory() {
public IObservable createObservable(Object target) {
return observeValue(realm, domain, (EObject) target,
eStructuralFeature);
}
};
}
/**
* Returns an observable list that tracks the current value of the feature
* of the current value of the master observable value.
*
* @param realm
* the realm in which to observe.
* @param domain
* the editing domain used for applying changes.
* @param value
* the master observable value.
* @param eStructuralFeature
* the feature for which to track the value.
* @return an observable value that tracks the current value of the named
* property for the current value of the master observable value
* @see MasterDetailObservables#detailList(IObservableValue,
* IObservableFactory, Object)
*/
public static IObservableList observeDetailList(Realm realm,
EditingDomain domain, IObservableValue value,
EStructuralFeature eStructuralFeature) {
return MasterDetailObservables.detailList(value, listFactory(realm,
domain, eStructuralFeature), eStructuralFeature);
}
/**
* Returns a factory for creating observable lists tracking the value of the
* given feature of a particular {@link EObject object}.
*
* @param realm
* the realm in which to observe.
* @param domain
* the editing domain used for applying changes.
* @param eStructuralFeature
* the feature for which to track the value.
* @return an observable factory.
*/
public static IObservableFactory listFactory(final Realm realm,
final EditingDomain domain,
final EStructuralFeature eStructuralFeature) {
return new IObservableFactory() {
public IObservable createObservable(Object target) {
return observeList(realm, domain, (EObject) target,
eStructuralFeature);
}
};
}
/**
* Returns a factory for creating observable maps tracking the value of the
* given feature of a particular {@link EObject object}.
*
* @param domain
* the editing domain used for applying changes.
* @param eStructuralFeature
* the feature for which to track the value.
* @return an observable factory.
*/
public static IObservableFactory mapFactory(final EditingDomain domain,
final EStructuralFeature eStructuralFeature) {
return new IObservableFactory() {
public IObservable createObservable(Object target) {
return observeMap(domain, (IObservableSet) target,
eStructuralFeature);
}
};
}
}