78
|
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 }
|