KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > eclipse > core > internal > databinding > observable > masterdetail > DetailObservableList


1 /*******************************************************************************
2  * Copyright (c) 2005, 2007 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  * Brad Reynolds - bug 147515
11  *******************************************************************************/

12 package org.eclipse.core.internal.databinding.observable.masterdetail;
13
14 import java.util.ArrayList JavaDoc;
15 import java.util.List JavaDoc;
16
17 import org.eclipse.core.databinding.observable.Diffs;
18 import org.eclipse.core.databinding.observable.IObserving;
19 import org.eclipse.core.databinding.observable.list.IListChangeListener;
20 import org.eclipse.core.databinding.observable.list.IObservableList;
21 import org.eclipse.core.databinding.observable.list.ListChangeEvent;
22 import org.eclipse.core.databinding.observable.list.ObservableList;
23 import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
24 import org.eclipse.core.databinding.observable.value.IObservableValue;
25 import org.eclipse.core.databinding.observable.value.IValueChangeListener;
26 import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
27 import org.eclipse.core.runtime.Assert;
28
29 /**
30  * @since 3.2
31  *
32  */

33
34 public class DetailObservableList extends ObservableList implements IObserving {
35
36     private boolean updating = false;
37
38     private IListChangeListener innerChangeListener = new IListChangeListener() {
39         public void handleListChange(ListChangeEvent event) {
40             if (!updating) {
41                 fireListChange(event.diff);
42             }
43         }
44     };
45
46     private Object JavaDoc currentOuterValue;
47
48     private IObservableList innerObservableList;
49
50     private IObservableFactory factory;
51
52     private IObservableValue outerObservableValue;
53
54     private Object JavaDoc detailType;
55
56     /**
57      * @param factory
58      * @param outerObservableValue
59      * @param detailType
60      */

61     public DetailObservableList(IObservableFactory factory,
62             IObservableValue outerObservableValue, Object JavaDoc detailType) {
63         super(outerObservableValue.getRealm(), new ArrayList JavaDoc(), detailType);
64         this.factory = factory;
65         this.outerObservableValue = outerObservableValue;
66         this.detailType = detailType;
67         updateInnerObservableValue(outerObservableValue);
68
69         outerObservableValue.addValueChangeListener(outerChangeListener);
70     }
71
72     IValueChangeListener outerChangeListener = new IValueChangeListener() {
73         public void handleValueChange(ValueChangeEvent event) {
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) factory
92                     .createObservable(currentOuterValue);
93             wrappedList = innerObservableList;
94
95             if (detailType != null) {
96                 Object JavaDoc innerValueType = innerObservableList.getElementType();
97                 Assert.isTrue(getElementType().equals(innerValueType),
98                         "Cannot change value type in a nested observable list"); //$NON-NLS-1$
99
}
100             innerObservableList.addListChangeListener(innerChangeListener);
101         }
102     }
103
104     public void dispose() {
105         super.dispose();
106
107         if (outerObservableValue != null) {
108             outerObservableValue.removeValueChangeListener(outerChangeListener);
109             outerObservableValue.dispose();
110         }
111         if (innerObservableList != null) {
112             innerObservableList.removeListChangeListener(innerChangeListener);
113             innerObservableList.dispose();
114         }
115         currentOuterValue = null;
116         factory = null;
117         innerObservableList = null;
118         innerChangeListener = null;
119     }
120
121     public Object JavaDoc getObserved() {
122         if (innerObservableList instanceof IObserving) {
123             return ((IObserving)innerObservableList).getObserved();
124         }
125         return null;
126     }
127
128 }
129
Popular Tags