KickJava   Java API By Example, From Geeks To Geeks.

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


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.ArrayList JavaDoc;
14 import java.util.List 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.list.IListChangeListener;
20 import org.eclipse.jface.internal.databinding.provisional.observable.list.IObservableList;
21 import org.eclipse.jface.internal.databinding.provisional.observable.list.ListDiff;
22 import org.eclipse.jface.internal.databinding.provisional.observable.list.ObservableList;
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 NestedObservableList extends ObservableList {
33
34     private boolean updating = false;
35
36     private IListChangeListener innerChangeListener = new IListChangeListener() {
37         public void handleListChange(IObservableList source, ListDiff diff) {
38             if (!updating) {
39                 fireListChange(diff);
40             }
41         }
42     };
43
44     private Object JavaDoc currentOuterValue;
45
46     private Object JavaDoc feature;
47
48     private IObservableList innerObservableList;
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 NestedObservableList(DataBindingContext databindingContext,
61             IObservableValue outerObservableValue, Object JavaDoc feature,
62             Class JavaDoc featureType) {
63         super(new ArrayList 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             List JavaDoc oldList = new ArrayList JavaDoc(wrappedList);
75             updateInnerObservableValue(outerObservableValue);
76             fireListChange(Diffs.computeListDiff(oldList, wrappedList));
77         }
78     };
79
80     private void updateInnerObservableValue(
81             IObservableValue outerObservableValue) {
82         currentOuterValue = outerObservableValue.getValue();
83         if (innerObservableList != null) {
84             innerObservableList.removeListChangeListener(innerChangeListener);
85             innerObservableList.dispose();
86         }
87         if (currentOuterValue == null) {
88             innerObservableList = null;
89             wrappedList = new ArrayList JavaDoc();
90         } else {
91             this.innerObservableList = (IObservableList) databindingContext
92                     .createObservable(new Property(currentOuterValue, feature,
93                             (Class JavaDoc) getElementType(), Boolean.TRUE));
94             wrappedList = innerObservableList;
95             Object JavaDoc innerValueType = innerObservableList.getElementType();
96             Assert.isTrue(getElementType().equals(innerValueType),
97                     "Cannot change value type in a nested updatable value"); //$NON-NLS-1$
98
innerObservableList.addListChangeListener(innerChangeListener);
99         }
100     }
101
102     public void dispose() {
103         super.dispose();
104
105         if (outerObservableValue != null) {
106             outerObservableValue.removeValueChangeListener(outerChangeListener);
107             outerObservableValue.dispose();
108         }
109         if (innerObservableList != null) {
110             innerObservableList.removeListChangeListener(innerChangeListener);
111             innerObservableList.dispose();
112         }
113         currentOuterValue = null;
114         databindingContext = null;
115         feature = null;
116         innerObservableList = null;
117         innerChangeListener = null;
118     }
119
120 }
121
Popular Tags