comparison org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableSet.d @ 78:0a55d2d5a946

Added file for databinding
author Frank Benoit <benoit@tionex.de>
date Tue, 14 Apr 2009 11:35:29 +0200
parents
children 6be48cf9f95c
comparison
equal deleted inserted replaced
76:f05e6e8b2f2d 78:0a55d2d5a946
1 /*******************************************************************************
2 * Copyright (c) 2005-2008 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 * Matthew Hall - bug 221351
11 *******************************************************************************/
12 module org.eclipse.core.internal.databinding.observable.masterdetail.DetailObservableSet;
13
14 import java.lang.all;
15
16 import java.util.Collection;
17 import java.util.Collections;
18 import java.util.HashSet;
19 import java.util.Set;
20
21 import org.eclipse.core.databinding.observable.Diffs;
22 import org.eclipse.core.databinding.observable.IObserving;
23 import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
24 import org.eclipse.core.databinding.observable.set.IObservableSet;
25 import org.eclipse.core.databinding.observable.set.ISetChangeListener;
26 import org.eclipse.core.databinding.observable.set.ObservableSet;
27 import org.eclipse.core.databinding.observable.set.SetChangeEvent;
28 import org.eclipse.core.databinding.observable.value.IObservableValue;
29 import org.eclipse.core.databinding.observable.value.IValueChangeListener;
30 import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
31 import org.eclipse.core.runtime.Assert;
32
33 /**
34 * @since 3.2
35 *
36 */
37 public class DetailObservableSet : ObservableSet , IObserving {
38
39 private bool updating = false;
40
41 private ISetChangeListener innerChangeListener = new class() ISetChangeListener {
42 public void handleSetChange(SetChangeEvent event) {
43 if (!updating) {
44 fireSetChange(event.diff);
45 }
46 }
47 };
48
49 private Object currentOuterValue;
50
51 private IObservableSet innerObservableSet;
52
53 private IObservableValue outerObservableValue;
54
55 private IObservableFactory factory;
56
57 /**
58 * @param factory
59 * @param outerObservableValue
60 * @param detailType
61 */
62 public this(IObservableFactory factory,
63 IObservableValue outerObservableValue, Object detailType) {
64 super(outerObservableValue.getRealm(), Collections.EMPTY_SET,
65 detailType);
66 this.factory = factory;
67 this.outerObservableValue = outerObservableValue;
68 updateInnerObservableSet(outerObservableValue);
69
70 outerObservableValue.addValueChangeListener(outerChangeListener);
71 }
72
73 IValueChangeListener outerChangeListener = new class() IValueChangeListener {
74 public void handleValueChange(ValueChangeEvent event) {
75 Set oldSet = new HashSet(wrappedSet);
76 updateInnerObservableSet(outerObservableValue);
77 fireSetChange(Diffs.computeSetDiff(oldSet, wrappedSet));
78 }
79 };
80
81 private void updateInnerObservableSet(IObservableValue outerObservableValue) {
82 currentOuterValue = outerObservableValue.getValue();
83 if (innerObservableSet !is null) {
84 innerObservableSet.removeSetChangeListener(innerChangeListener);
85 innerObservableSet.dispose();
86 }
87 if (currentOuterValue is null) {
88 innerObservableSet = null;
89 wrappedSet = Collections.EMPTY_SET;
90 } else {
91 this.innerObservableSet = cast(IObservableSet) factory
92 .createObservable(currentOuterValue);
93 wrappedSet = innerObservableSet;
94
95 if (elementType !is null) {
96 Object innerValueType = innerObservableSet.getElementType();
97
98 Assert.isTrue(elementType.equals(innerValueType),
99 "Cannot change value type in a nested observable set"); //$NON-NLS-1$
100 }
101
102 innerObservableSet.addSetChangeListener(innerChangeListener);
103 }
104 }
105
106 public bool add(Object o) {
107 getterCalled();
108 return wrappedSet.add(o);
109 }
110
111 public bool remove(Object o) {
112 getterCalled();
113 return wrappedSet.remove(o);
114 }
115
116 public bool addAll(Collection c) {
117 getterCalled();
118 return wrappedSet.addAll(c);
119 }
120
121 public bool removeAll(Collection c) {
122 getterCalled();
123 return wrappedSet.removeAll(c);
124 }
125
126 public bool retainAll(Collection c) {
127 getterCalled();
128 return wrappedSet.retainAll(c);
129 }
130
131 public void clear() {
132 getterCalled();
133 wrappedSet.clear();
134 }
135
136 public void dispose() {
137 super.dispose();
138
139 if (outerObservableValue !is null) {
140 outerObservableValue.removeValueChangeListener(outerChangeListener);
141 outerObservableValue.dispose();
142 }
143 if (innerObservableSet !is null) {
144 innerObservableSet.removeSetChangeListener(innerChangeListener);
145 innerObservableSet.dispose();
146 }
147 currentOuterValue = null;
148 factory = null;
149 innerObservableSet = null;
150 innerChangeListener = null;
151 }
152
153 public Object getObserved() {
154 if ( null !is cast(IObserving)innerObservableSet ) {
155 return (cast(IObserving) innerObservableSet).getObserved();
156 }
157 return null;
158 }
159
160 }