All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.eclipse.emf.databinding.EObjectObservableValue Maven / Gradle / Ivy

The newest version!
/**
 * 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 v2.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v20.html
 *
 * Contributors:
 *   IBM - Initial API and implementation
 *   Hasan Ceylan  - Bug 277358
 */
package org.eclipse.emf.databinding;

import org.eclipse.core.databinding.observable.Diffs;
import org.eclipse.core.databinding.observable.IObserving;
import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.core.databinding.observable.value.AbstractObservableValue;
import org.eclipse.core.databinding.observable.value.ValueDiff;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.util.ExtendedMetaData;


/**
 * 

PROVISIONAL: This API is subject to arbitrary change, including renaming or removal.

*/ public class EObjectObservableValue extends AbstractObservableValue implements IObserving { /** * The object instance */ protected EObject eObject; /** * The feature */ protected EStructuralFeature eStructuralFeature; /** * The listener */ protected Adapter listener; /** * Observe a feature of the instance using the default realm * * @param eObject * the object * @param eStructuralFeature * the feature */ public EObjectObservableValue(EObject eObject, EStructuralFeature eStructuralFeature) { this(Realm.getDefault(), eObject, eStructuralFeature); } /** * Observe a feature of the instance using the realm * * @param realm * * @param eObject * the object * @param eStructuralFeature * the feature */ public EObjectObservableValue(Realm realm, EObject eObject, EStructuralFeature eStructuralFeature) { super(realm); this.eObject = eObject; this.eStructuralFeature = eStructuralFeature; } @Override public synchronized void dispose() { if (listener != null) { eObject.eAdapters().remove(listener); listener = null; } eObject = null; eStructuralFeature = null; super.dispose(); } public Object getObserved() { return eObject; } @Override protected void firstListenerAdded() { listener = new AdapterImpl() { @Override public void notifyChanged(Notification notification) { if (eStructuralFeature == notification.getFeature() && !notification.isTouch()) { final ValueDiff diff = Diffs.createValueDiff(notification.getOldValue(), notification.getNewValue()); getRealm().exec(new Runnable() { public void run() { fireValueChange(diff); } }); } } }; eObject.eAdapters().add(listener); } @Override protected void lastListenerRemoved() { if (listener != null){ eObject.eAdapters().remove(listener); listener = null; } } @Override protected Object doGetValue() { return ExtendedMetaData.INSTANCE.getAffiliation(eObject.eClass(), eStructuralFeature) == null ? null : eObject.eGet(eStructuralFeature); } @Override protected void doSetValue(Object value) { eObject.eSet(eStructuralFeature, value); } public Object getValueType() { return eStructuralFeature; } @Override public String toString() { StringBuilder result = new StringBuilder(getClass().getName()); result.append('@'); result.append(Integer.toHexString(hashCode())); result.append(" (eObject:"); result.append(eObject); result.append(")"); result.append(" (eStructuralFeature: "); result.append(eStructuralFeature); result.append(")"); try { Object value = eObject.eGet(eStructuralFeature, false); result.append(" (value: "); result.append(value); result.append(")"); } catch (Exception exception) { // Ignore. } return result.toString(); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy