Skip to main content
aboutsummaryrefslogtreecommitdiffstats
blob: 7bbd0f3f823efdcd7ac1e08afac904c8d492dc08 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/*****************************************************************************
 * Copyright (c) 2016 CEA LIST 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:
 *   Fanch BONNABESSE (ALL4TEC) fanch.bonnabesse@all4tec.net - Initial API and implementation
 *
 *****************************************************************************/

package org.eclipse.papyrus.infra.ui.emf.databinding;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.databinding.EObjectObservableValue;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.emf.transaction.util.TransactionUtil;

/**
 * Structured ObservableValue.
 */
public class EObjectStructuredObservableValue extends EMFObservableValue {

	/**
	 * List of child of the ObservableValue.
	 */
	protected List<EObjectObservableValue> observables = new ArrayList<>();

	/**
	 * The parent of this EObjectStructuredObservableValue.
	 */
	protected EObjectStructuredObservableValue parent;

	/**
	 * Constructor.
	 *
	 * @param eObject
	 *            The EObject to edit.
	 * @param eStructuralFeature
	 *            The structural feature.
	 * @param domain
	 *            The current editing domain.
	 * @param browseFeatures
	 *            The features for the browse.
	 */
	public EObjectStructuredObservableValue(final EObject eObject, final EStructuralFeature eStructuralFeature, final EditingDomain domain, final boolean browseFeatures, final EObjectStructuredObservableValue parent) {
		super(eObject, eStructuralFeature, domain);
		this.parent = parent;
		if (null != eObject) {
			if (browseFeatures) {
				browseFeatures(eObject);
			}
		}
	}

	/**
	 * Get the child.
	 *
	 * @return The observables.
	 */
	public List<EObjectObservableValue> getObservables() {
		return observables;
	}

	/**
	 * Get the parent.
	 *
	 * @return The parent.
	 */
	public EObjectStructuredObservableValue getParent() {
		return parent;
	}

	/**
	 * Crete the child.
	 *
	 * @param eObject
	 *            The parent.
	 */
	private void browseFeatures(final EObject eObject) {
		EList<EStructuralFeature> eStructuralFeatures = eObject.eClass().getEStructuralFeatures();
		TransactionalEditingDomain editingDomain = TransactionUtil.getEditingDomain(eObject);
		for (EStructuralFeature eStructuralFeature : eStructuralFeatures) {
			EObjectObservableValue eObjectObservableValue;
			Object eGet = eObject.eGet(eStructuralFeature);
			if (eStructuralFeature instanceof EReference && eGet instanceof EObject) {
				eObjectObservableValue = new EObjectStructuredObservableValue((EObject) eGet, eStructuralFeature, editingDomain, true, this);
			} else {
				eObjectObservableValue = new EObjectStructuredObservableValue(eObject, eStructuralFeature, editingDomain, false, this);
			}
			observables.add(eObjectObservableValue);
		}
	}

	/**
	 * {@inheritDoc}
	 * 
	 * @see org.eclipse.emf.databinding.EObjectObservableValue#getValueType()
	 */
	@Override
	public Object getValueType() {
		Object valueType = super.getValueType();
		if (null == valueType && null != eObject) {
			valueType = eObject.eClass();
		}
		return valueType;
	}

	/**
	 * {@inheritDoc}
	 * 
	 * @see org.eclipse.emf.databinding.EObjectObservableValue#dispose()
	 */
	@Override
	public synchronized void dispose() {
		for (EObjectObservableValue eObjectObservableValue : observables) {
			eObjectObservableValue.dispose();
		}
		super.dispose();
	}
}

Back to the top