Mercurial > projects > dwt2
annotate org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/ComputedObservableMap.d @ 94:1d37a7813832
First Databinding Snippet (004) builds
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Sun, 19 Apr 2009 17:37:36 +0200 |
parents | 6be48cf9f95c |
children | 5d5bd660917f |
rev | line source |
---|---|
78 | 1 /******************************************************************************* |
2 * Copyright (c) 2006, 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 *******************************************************************************/ | |
11 | |
12 module org.eclipse.core.databinding.observable.map.ComputedObservableMap; | |
81 | 13 import org.eclipse.core.databinding.observable.map.AbstractObservableMap; |
78 | 14 |
15 import java.lang.all; | |
16 | |
17 import java.util.AbstractSet; | |
18 import java.util.Collections; | |
19 import java.util.HashMap; | |
20 import java.util.HashSet; | |
21 import java.util.Iterator; | |
22 import java.util.Map; | |
23 import java.util.Set; | |
24 | |
25 import org.eclipse.core.databinding.observable.Diffs; | |
26 import org.eclipse.core.databinding.observable.set.IObservableSet; | |
27 import org.eclipse.core.databinding.observable.set.ISetChangeListener; | |
28 import org.eclipse.core.databinding.observable.set.SetChangeEvent; | |
29 | |
30 /** | |
31 * Maps objects to one of their attributes. Tracks changes to the underlying | |
32 * observable set of objects (keys), as well as changes to attribute values. | |
33 */ | |
34 public abstract class ComputedObservableMap : AbstractObservableMap { | |
35 | |
85 | 36 private final IObservableSet fkeySet; |
78 | 37 |
85 | 38 private ISetChangeListener setChangeListener; |
39 class SetChangeListener : ISetChangeListener { | |
78 | 40 public void handleSetChange(SetChangeEvent event) { |
41 Set addedKeys = new HashSet(event.diff.getAdditions()); | |
42 Set removedKeys = new HashSet(event.diff.getRemovals()); | |
43 Map oldValues = new HashMap(); | |
44 Map newValues = new HashMap(); | |
45 for (Iterator it = removedKeys.iterator(); it.hasNext();) { | |
46 Object removedKey = it.next(); | |
47 Object oldValue = doGet(removedKey); | |
48 unhookListener(removedKey); | |
49 if (oldValue !is null) { | |
50 oldValues.put(removedKey, oldValue); | |
51 } | |
52 } | |
53 for (Iterator it = addedKeys.iterator(); it.hasNext();) { | |
54 Object addedKey = it.next(); | |
55 hookListener(addedKey); | |
56 Object newValue = doGet(addedKey); | |
57 newValues.put(addedKey, newValue); | |
58 } | |
59 fireMapChange(Diffs.createMapDiff(addedKeys, removedKeys, | |
60 Collections.EMPTY_SET, oldValues, newValues)); | |
61 } | |
62 }; | |
63 | |
85 | 64 private Set fentrySet; |
78 | 65 |
66 private class EntrySet : AbstractSet { | |
94
1d37a7813832
First Databinding Snippet (004) builds
Frank Benoit <benoit@tionex.de>
parents:
85
diff
changeset
|
67 public int opApply (int delegate(ref Object value) dg){ |
1d37a7813832
First Databinding Snippet (004) builds
Frank Benoit <benoit@tionex.de>
parents:
85
diff
changeset
|
68 return super.opApply(dg); |
1d37a7813832
First Databinding Snippet (004) builds
Frank Benoit <benoit@tionex.de>
parents:
85
diff
changeset
|
69 } |
78 | 70 |
71 public Iterator iterator() { | |
72 return new class() Iterator { | |
73 | |
74 final Iterator keyIterator; | |
75 this(){ | |
85 | 76 keyIterator = fkeySet.iterator(); |
78 | 77 } |
78 | |
79 public bool hasNext() { | |
80 return keyIterator.hasNext(); | |
81 } | |
82 | |
83 public Object next() { | |
84 return new class() Map.Entry { | |
85 Object key; | |
86 this(){ | |
87 key = keyIterator.next(); | |
88 } | |
89 | |
90 public Object getKey() { | |
91 return key; | |
92 } | |
93 | |
94 public Object getValue() { | |
95 return get(getKey()); | |
96 } | |
97 | |
98 public Object setValue(Object value) { | |
99 return put(getKey(), value); | |
100 } | |
85 | 101 |
102 public override equals_t opEquals(Object o){ | |
103 implMissing( __FILE__, __LINE__ ); | |
104 return 0; | |
105 } | |
106 public override hash_t toHash(){ | |
107 implMissing( __FILE__, __LINE__ ); | |
108 return 0; | |
109 } | |
110 | |
78 | 111 }; |
112 } | |
113 | |
114 public void remove() { | |
115 keyIterator.remove(); | |
116 } | |
117 }; | |
118 } | |
119 | |
120 public int size() { | |
85 | 121 return fkeySet.size(); |
78 | 122 } |
123 | |
85 | 124 public override String toString(){ |
125 return super.toString(); | |
126 } | |
78 | 127 } |
128 | |
129 /** | |
130 * @param keySet | |
131 */ | |
85 | 132 public this(IObservableSet _keySet) { |
133 setChangeListener = new SetChangeListener(); | |
134 fentrySet = new EntrySet(); | |
135 super(_keySet.getRealm()); | |
136 this.fkeySet = _keySet; | |
137 this.fkeySet.addSetChangeListener(setChangeListener); | |
78 | 138 } |
139 | |
140 protected void init() { | |
85 | 141 for (Iterator it = this.fkeySet.iterator(); it.hasNext();) { |
78 | 142 Object key = it.next(); |
143 hookListener(key); | |
144 } | |
145 } | |
146 | |
147 protected final void fireSingleChange(Object key, Object oldValue, | |
148 Object newValue) { | |
149 fireMapChange(Diffs.createMapDiffSingleChange(key, oldValue, newValue)); | |
150 } | |
151 | |
152 public Set entrySet() { | |
85 | 153 return fentrySet; |
78 | 154 } |
155 | |
156 public Set keySet() { | |
85 | 157 return fkeySet; |
78 | 158 } |
159 | |
160 final public Object get(Object key) { | |
161 return doGet(key); | |
162 } | |
163 | |
164 final public Object put(Object key, Object value) { | |
165 return doPut(key, value); | |
166 } | |
167 | |
168 /** | |
169 * @param removedKey | |
170 */ | |
171 protected abstract void unhookListener(Object removedKey); | |
172 | |
173 /** | |
174 * @param addedKey | |
175 */ | |
176 protected abstract void hookListener(Object addedKey); | |
177 | |
178 /** | |
179 * @param key | |
180 * @return the value for the given key | |
181 */ | |
182 protected abstract Object doGet(Object key); | |
183 | |
184 /** | |
185 * @param key | |
186 * @param value | |
187 * @return the old value for the given key | |
188 */ | |
189 protected abstract Object doPut(Object key, Object value); | |
190 } |