KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > eclipse > jface > internal > databinding > internal > observable > NestedObservableSet


1 /*******************************************************************************
2  * Copyright (c) 2005, 2006 IBM Corporation and others.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Eclipse Public License v1.0
5  * which accompanies this distribution, and is available at
6  * http://www.eclipse.org/legal/epl-v10.html
7  *
8  * Contributors:
9  * IBM Corporation - initial API and implementation
10  *******************************************************************************/

11 package org.eclipse.jface.internal.databinding.internal.observable;
12
13 import java.util.HashSet JavaDoc;
14 import java.util.Set JavaDoc;
15
16 import org.eclipse.jface.internal.databinding.provisional.DataBindingContext;
17 import org.eclipse.jface.internal.databinding.provisional.description.Property;
18 import org.eclipse.jface.internal.databinding.provisional.observable.Diffs;
19 import org.eclipse.jface.internal.databinding.provisional.observable.set.IObservableSet;
20 import org.eclipse.jface.internal.databinding.provisional.observable.set.ISetChangeListener;
21 import org.eclipse.jface.internal.databinding.provisional.observable.set.ObservableSet;
22 import org.eclipse.jface.internal.databinding.provisional.observable.set.SetDiff;
23 import org.eclipse.jface.internal.databinding.provisional.observable.value.IObservableValue;
24 import org.eclipse.jface.internal.databinding.provisional.observable.value.IValueChangeListener;
25 import org.eclipse.jface.internal.databinding.provisional.observable.value.ValueDiff;
26 import org.eclipse.jface.util.Assert;
27
28 /**
29  * @since 3.2
30  *
31  */

32 public class NestedObservableSet extends ObservableSet {
33
34     private boolean updating = false;
35
36     private ISetChangeListener innerChangeListener = new ISetChangeListener() {
37         public void handleSetChange(IObservableSet source, SetDiff diff) {
38             if (!updating) {
39                 fireSetChange(diff);
40             }
41         }
42     };
43
44     private Object JavaDoc currentOuterValue;
45
46     private Object JavaDoc feature;
47
48     private IObservableSet innerObservableSet;
49
50     private DataBindingContext databindingContext;
51
52     private IObservableValue outerObservableValue;
53
54     /**
55      * @param databindingContext
56      * @param outerObservableValue
57      * @param feature
58      * @param featureType
59      */

60     public NestedObservableSet(DataBindingContext databindingContext,
61             IObservableValue outerObservableValue, Object JavaDoc feature,
62             Object JavaDoc featureType) {
63         super(new HashSet JavaDoc(), featureType);
64         this.databindingContext = databindingContext;
65         this.feature = feature;
66         this.outerObservableValue = outerObservableValue;
67         updateInnerObservableValue(outerObservableValue);
68
69         outerObservableValue.addValueChangeListener(outerChangeListener);
70     }
71
72     IValueChangeListener outerChangeListener = new IValueChangeListener() {
73         public void handleValueChange(IObservableValue source, ValueDiff diff) {
74             Set JavaDoc oldSet = new HashSet JavaDoc(wrappedSet);
75             updateInnerObservableValue(outerObservableValue);
76             fireSetChange(Diffs.computeSetDiff(oldSet, wrappedSet));
77         }
78     };
79
80     private void updateInnerObservableValue(
81             IObservableValue outerObservableValue) {
82         currentOuterValue = outerObservableValue.getValue();
83         if (innerObservableSet != null) {
84             innerObservableSet.removeSetChangeListener(innerChangeListener);
85             innerObservableSet.dispose();
86         }
87         if (currentOuterValue == null) {
88             innerObservableSet = null;
89             wrappedSet = new HashSet JavaDoc();
90         } else {
91             this.innerObservableSet = (IObservableSet) databindingContext
92                     .createObservable(new Property(currentOuterValue, feature));
93             wrappedSet = innerObservableSet;
94             Object JavaDoc innerValueType = innerObservableSet.getElementType();
95             if (elementType == null) {
96                 elementType = innerValueType;
97             } else {
98                 Assert.isTrue(elementType.equals(innerValueType),
99                         "Cannot change value type in a nested updatable value"); //$NON-NLS-1$
100
}
101             innerObservableSet.addSetChangeListener(innerChangeListener);
102         }
103     }
104
105     public void dispose() {
106         super.dispose();
107
108         if (outerObservableValue != null) {
109             outerObservableValue.removeValueChangeListener(outerChangeListener);
110             outerObservableValue.dispose();
111         }
112         if (innerObservableSet != null) {
113             innerObservableSet.removeSetChangeListener(innerChangeListener);
114             innerObservableSet.dispose();
115         }
116         currentOuterValue = null;
117         databindingContext = null;
118         feature = null;
119         innerObservableSet = null;
120         innerChangeListener = null;
121     }
122 }
123
Popular Tags