comparison org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableMap.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) 2008 Matthew Hall 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 * Matthew Hall - initial API and implementation (bug 221704)
10 * Matthew Hall - bug 223114
11 ******************************************************************************/
12
13 module org.eclipse.core.internal.databinding.observable.masterdetail.DetailObservableMap;
14
15 import java.lang.all;
16
17 import java.util.Collections;
18 import java.util.HashMap;
19 import java.util.Map;
20
21 import org.eclipse.core.databinding.observable.Diffs;
22 import org.eclipse.core.databinding.observable.map.IMapChangeListener;
23 import org.eclipse.core.databinding.observable.map.IObservableMap;
24 import org.eclipse.core.databinding.observable.map.MapChangeEvent;
25 import org.eclipse.core.databinding.observable.map.ObservableMap;
26 import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
27 import org.eclipse.core.databinding.observable.value.IObservableValue;
28 import org.eclipse.core.databinding.observable.value.IValueChangeListener;
29 import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
30
31 /**
32 * @since 1.1
33 *
34 */
35 public class DetailObservableMap : ObservableMap {
36 private bool updating = false;
37
38 private IObservableValue master;
39 private IObservableFactory detailFactory;
40
41 private IObservableMap detailMap;
42
43 private IValueChangeListener masterChangeListener = new class() IValueChangeListener {
44 public void handleValueChange(ValueChangeEvent event) {
45 Map oldMap = new HashMap(wrappedMap);
46 updateDetailMap();
47 fireMapChange(Diffs.computeMapDiff(oldMap, wrappedMap));
48 }
49 };
50
51 private IMapChangeListener detailChangeListener = new class() IMapChangeListener {
52 public void handleMapChange(MapChangeEvent event) {
53 if (!updating) {
54 fireMapChange(event.diff);
55 }
56 }
57 };
58
59 /**
60 * Constructs a new DetailObservableMap
61 *
62 * @param detailFactory
63 * observable factory that creates IObservableMap instances given
64 * the current value of master observable value
65 * @param master
66 *
67 */
68 public this(IObservableFactory detailFactory,
69 IObservableValue master) {
70 super(master.getRealm(), Collections.EMPTY_MAP);
71 this.master = master;
72 this.detailFactory = detailFactory;
73
74 updateDetailMap();
75 master.addValueChangeListener(masterChangeListener);
76 }
77
78 private void updateDetailMap() {
79 Object masterValue = master.getValue();
80 if (detailMap !is null) {
81 detailMap.removeMapChangeListener(detailChangeListener);
82 detailMap.dispose();
83 }
84
85 if (masterValue is null) {
86 detailMap = null;
87 wrappedMap = Collections.EMPTY_MAP;
88 } else {
89 detailMap = cast(IObservableMap) detailFactory
90 .createObservable(masterValue);
91 wrappedMap = detailMap;
92 detailMap.addMapChangeListener(detailChangeListener);
93 }
94 }
95
96 public Object put(Object key, Object value) {
97 return detailMap.put(key, value);
98 }
99
100 public void putAll(Map map) {
101 detailMap.putAll(map);
102 }
103
104 public Object remove(Object key) {
105 return detailMap.remove(key);
106 }
107
108 public void clear() {
109 detailMap.clear();
110 }
111
112 public synchronized void dispose() {
113 if (master !is null) {
114 master.removeValueChangeListener(masterChangeListener);
115 master = null;
116 masterChangeListener = null;
117 }
118 detailFactory = null;
119 if (detailMap !is null) {
120 detailMap.removeMapChangeListener(detailChangeListener);
121 detailMap.dispose();
122 detailMap = null;
123 }
124 detailChangeListener = null;
125 super.dispose();
126 }
127
128 }