comparison org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableMap.d @ 95:6208d4f6a277

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