Skip to content

Commit 84c947d

Browse files
committed
Add ObservableMap factories
1 parent 0f582fa commit 84c947d

File tree

4 files changed

+149
-4
lines changed

4 files changed

+149
-4
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package rx.javafx.sources;
2+
3+
public final class MapChange<K,T> {
4+
private final K key;
5+
private final T value;
6+
private final Flag flag;
7+
8+
MapChange(K key, T value, Flag flag) {
9+
this.key = key;
10+
this.value = value;
11+
this.flag = flag;
12+
}
13+
14+
public K getKey() {
15+
return key;
16+
}
17+
18+
public T getValue() {
19+
return value;
20+
}
21+
22+
public Flag getFlag() {
23+
return flag;
24+
}
25+
}

src/main/java/rx/javafx/sources/ObservableListSource.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import java.util.HashMap;
1111

1212
public final class ObservableListSource {
13+
private ObservableListSource() {}
1314

1415
public static <T> Observable<ObservableList<T>> fromObservableList(final ObservableList<T> source) {
1516

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package rx.javafx.sources;
2+
3+
import javafx.collections.MapChangeListener;
4+
import javafx.collections.ObservableMap;
5+
import rx.Observable;
6+
import rx.schedulers.JavaFxScheduler;
7+
import rx.subscriptions.JavaFxSubscriptions;
8+
9+
import java.util.AbstractMap.SimpleEntry;
10+
import java.util.Map.Entry;
11+
12+
public final class ObservableMapSource {
13+
14+
private ObservableMapSource() {}
15+
16+
public static <K,T> Observable<ObservableMap<K,T>> fromObservableMap(final ObservableMap<K,T> source) {
17+
return Observable.create((Observable.OnSubscribe<ObservableMap<K,T>>) subscriber -> {
18+
MapChangeListener<K,T> listener = c -> subscriber.onNext(source);
19+
source.addListener(listener);
20+
subscriber.add(JavaFxSubscriptions.unsubscribeInEventDispatchThread(() -> source.removeListener(listener)));
21+
}).subscribeOn(JavaFxScheduler.getInstance());
22+
}
23+
24+
public static <K,T> Observable<Entry<K,T>> fromObservableMapAdds(final ObservableMap<K,T> source) {
25+
26+
return Observable.create((Observable.OnSubscribe<Entry<K,T>>) subscriber -> {
27+
28+
MapChangeListener<K,T> listener = c -> {
29+
30+
if (c.wasAdded()) {
31+
subscriber.onNext(new SimpleEntry<>(c.getKey(),c.getValueAdded()));
32+
}
33+
34+
};
35+
source.addListener(listener);
36+
subscriber.add(JavaFxSubscriptions.unsubscribeInEventDispatchThread(() -> source.removeListener(listener)));
37+
38+
}).subscribeOn(JavaFxScheduler.getInstance());
39+
}
40+
41+
public static <K,T> Observable<Entry<K,T>> fromObservableMapRemovals(final ObservableMap<K,T> source) {
42+
43+
return Observable.create((Observable.OnSubscribe<Entry<K,T>>) subscriber -> {
44+
45+
MapChangeListener<K,T> listener = c -> {
46+
47+
if (c.wasRemoved()) {
48+
subscriber.onNext(new SimpleEntry<>(c.getKey(),c.getValueRemoved()));
49+
}
50+
51+
};
52+
source.addListener(listener);
53+
subscriber.add(JavaFxSubscriptions.unsubscribeInEventDispatchThread(() -> source.removeListener(listener)));
54+
55+
}).subscribeOn(JavaFxScheduler.getInstance());
56+
}
57+
58+
public static <K,T> Observable<MapChange<K,T>> fromObservableMapChanges(final ObservableMap<K,T> source) {
59+
60+
return Observable.create((Observable.OnSubscribe<MapChange<K,T>>) subscriber -> {
61+
62+
MapChangeListener<K,T> listener = c -> {
63+
64+
if (c.wasRemoved()) {
65+
subscriber.onNext(new MapChange<>(c.getKey(),c.getValueRemoved(),Flag.REMOVED));
66+
}
67+
if (c.wasAdded()) {
68+
subscriber.onNext(new MapChange<>(c.getKey(),c.getValueAdded(),Flag.ADDED));
69+
}
70+
71+
};
72+
source.addListener(listener);
73+
subscriber.add(JavaFxSubscriptions.unsubscribeInEventDispatchThread(() -> source.removeListener(listener)));
74+
75+
}).subscribeOn(JavaFxScheduler.getInstance());
76+
}
77+
}

src/main/java/rx/observables/JavaFxObservable.java

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import javafx.beans.value.ObservableValue;
2020
import javafx.collections.ObservableList;
21+
import javafx.collections.ObservableMap;
2122
import javafx.event.ActionEvent;
2223
import javafx.event.Event;
2324
import javafx.event.EventType;
@@ -31,6 +32,8 @@
3132
import rx.functions.Func1;
3233
import rx.javafx.sources.*;
3334

35+
import java.util.Map;
36+
3437

3538
public enum JavaFxObservable {
3639
; // no instances
@@ -163,7 +166,7 @@ public static <T> Observable<T> fromObservableListUpdates(final ObservableList<T
163166
/**
164167
* Emits all added, removed, and updated items from an ObservableList
165168
* @param source
166-
* @return An Observable emitting changed items with an ADDED, REMOVED, or UPDATED flags
169+
* @return An Observable emitting changed items with an ADDED, REMOVED, or UPDATED flag
167170
*/
168171
public static <T> Observable<ListChange<T>> fromObservableListChanges(final ObservableList<T> source) {
169172
return ObservableListSource.fromObservableListChanges(source);
@@ -173,7 +176,7 @@ public static <T> Observable<ListChange<T>> fromObservableListChanges(final Obse
173176
* If dupe items with identical hashcode/equals evaluations are added to an ObservableList, only the first one will fire an ADDED item.
174177
* When the last dupe is removed, only then will it fire a REMOVED item.
175178
* @param source
176-
* @return An Observable emitting changed items with an ADDED, REMOVED, or UPDATED flags
179+
* @return An Observable emitting changed items with an ADDED, REMOVED, or UPDATED flag
177180
*/
178181
public static <T> Observable<ListChange<T>> fromObservableListDistinctChanges(final ObservableList<T> source) {
179182
return ObservableListSource.fromObservableListDistinctChanges(source);
@@ -183,7 +186,7 @@ public static <T> Observable<ListChange<T>> fromObservableListDistinctChanges(fi
183186
* If dupe mapped R items with identical hashcode/equals evaluations are added to an ObservableList, only the first one will fire an ADDED T item.
184187
* When the last R dupe is removed, only then will it fire a REMOVED T item.
185188
* @param source
186-
* @return An Observable emitting changed items with an ADDED, REMOVED, or UPDATED flags
189+
* @return An Observable emitting changed items with an ADDED, REMOVED, or UPDATED flag
187190
*/
188191
public static <T,R> Observable<ListChange<T>> fromObservableListDistinctChanges(final ObservableList<T> source, Func1<T,R> mapper) {
189192
return ObservableListSource.fromObservableListDistinctChanges(source,mapper);
@@ -193,9 +196,48 @@ public static <T,R> Observable<ListChange<T>> fromObservableListDistinctChanges(
193196
* If dupe mapped R items with identical hashcode/equals evaluations are added to an ObservableList, only the first one will fire an ADDED R item.
194197
* When the last dupe is removed, only then will it fire a REMOVED R item.
195198
* @param source
196-
* @return An Observable emitting changed mapped items with an ADDED, REMOVED, or UPDATED flags
199+
* @return An Observable emitting changed mapped items with an ADDED, REMOVED, or UPDATED flag
197200
*/
198201
public static <T,R> Observable<ListChange<R>> fromObservableListDistinctMappings(final ObservableList<T> source, Func1<T,R> mapper) {
199202
return ObservableListSource.fromObservableListDistinctMappings(source,mapper);
200203
}
204+
205+
/**
206+
* Creates an observable that emits an ObservableMap every time it is modified
207+
*
208+
* @param source The target ObservableMap of the MapChange events
209+
* @return An Observable emitting the ObservableMap each time it changes
210+
*/
211+
public static <K,T> Observable<ObservableMap<K,T>> fromObservableMap(final ObservableMap<K,T> source) {
212+
return ObservableMapSource.fromObservableMap(source);
213+
}
214+
215+
/**
216+
* Creates an observable that emits all additions to an ObservableMap
217+
*
218+
* @param source The target ObservableMap for the item add events
219+
* @return An Observable emitting Entry items added to the ObservableMap
220+
*/
221+
public static <K,T> Observable<Map.Entry<K,T>> fromObservableMapAdds(final ObservableMap<K,T> source) {
222+
return ObservableMapSource.fromObservableMapAdds(source);
223+
}
224+
225+
/**
226+
* Creates an observable that emits all removal items from an ObservableMap
227+
*
228+
* @param source The target ObservableMap for the item removal events
229+
* @return An Observable emitting items removed Entry items from the ObservableList
230+
*/
231+
public static <K,T> Observable<Map.Entry<K,T>> fromObservableMapRemovals(final ObservableMap<K,T> source) {
232+
return ObservableMapSource.fromObservableMapRemovals(source);
233+
}
234+
235+
/**
236+
* Emits all added, removed, and updated items from an ObservableMap
237+
* @param source
238+
* @return An Observable emitting changed entries with an ADDED, REMOVED, or UPDATED flag
239+
*/
240+
public static <K,T> Observable<MapChange<K,T>> fromObservableMapChanges(final ObservableMap<K,T> source) {
241+
return ObservableMapSource.fromObservableMapChanges(source);
242+
}
201243
}

0 commit comments

Comments
 (0)