Skip to content

Commit 85a221d

Browse files
Merge pull request ReactiveX#265 from jmhofer/swing
Swing - component event observables and minor cleanup
2 parents 3ca1219 + 335bb22 commit 85a221d

File tree

5 files changed

+166
-15
lines changed

5 files changed

+166
-15
lines changed

rxjava-contrib/rxjava-swing/src/main/java/rx/observables/SwingObservable.java

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,19 @@
1717

1818
import static rx.Observable.filter;
1919

20+
import java.awt.Component;
21+
import java.awt.Dimension;
2022
import java.awt.event.ActionEvent;
23+
import java.awt.event.ComponentEvent;
2124
import java.awt.event.KeyEvent;
2225
import java.awt.event.MouseEvent;
2326
import java.util.Set;
2427

2528
import javax.swing.AbstractButton;
26-
import javax.swing.JComponent;
2729

2830
import rx.Observable;
2931
import rx.swing.sources.AbstractButtonSource;
32+
import rx.swing.sources.ComponentEventSource;
3033
import rx.swing.sources.KeyEventSource;
3134
import rx.swing.sources.MouseEventSource;
3235
import rx.util.functions.Func1;
@@ -54,7 +57,7 @@ public static Observable<ActionEvent> fromButtonAction(AbstractButton button) {
5457
* The component to register the observable for.
5558
* @return Observable of key events.
5659
*/
57-
public static Observable<KeyEvent> fromKeyEvents(JComponent component) {
60+
public static Observable<KeyEvent> fromKeyEvents(Component component) {
5861
return KeyEventSource.fromKeyEventsOf(component);
5962
}
6063

@@ -65,7 +68,7 @@ public static Observable<KeyEvent> fromKeyEvents(JComponent component) {
6568
* The component to register the observable for.
6669
* @return Observable of key events.
6770
*/
68-
public static Observable<KeyEvent> fromKeyEvents(JComponent component, final Set<Integer> keyCodes) {
71+
public static Observable<KeyEvent> fromKeyEvents(Component component, final Set<Integer> keyCodes) {
6972
return filter(fromKeyEvents(component), new Func1<KeyEvent, Boolean>() {
7073
@Override
7174
public Boolean call(KeyEvent event) {
@@ -81,7 +84,7 @@ public Boolean call(KeyEvent event) {
8184
* The component to register the observable for.
8285
* @return Observable of currently pressed keys.
8386
*/
84-
public static Observable<Set<Integer>> currentlyPressedKeys(JComponent component) {
87+
public static Observable<Set<Integer>> fromPressedKeys(Component component) {
8588
return KeyEventSource.currentlyPressedKeysOf(component);
8689
}
8790

@@ -92,7 +95,7 @@ public static Observable<Set<Integer>> currentlyPressedKeys(JComponent component
9295
* The component to register the observable for.
9396
* @return Observable of mouse events.
9497
*/
95-
public static Observable<MouseEvent> fromMouseEvents(JComponent component) {
98+
public static Observable<MouseEvent> fromMouseEvents(Component component) {
9699
return MouseEventSource.fromMouseEventsOf(component);
97100
}
98101

@@ -103,7 +106,29 @@ public static Observable<MouseEvent> fromMouseEvents(JComponent component) {
103106
* The component to register the observable for.
104107
* @return Observable of mouse motion events.
105108
*/
106-
public static Observable<MouseEvent> fromMouseMotionEvents(JComponent component) {
109+
public static Observable<MouseEvent> fromMouseMotionEvents(Component component) {
107110
return MouseEventSource.fromMouseMotionEventsOf(component);
108111
}
112+
113+
/**
114+
* Creates an observable corresponding to raw component events.
115+
*
116+
* @param component
117+
* The component to register the observable for.
118+
* @return Observable of component events.
119+
*/
120+
public static Observable<ComponentEvent> fromComponentEvents(Component component) {
121+
return ComponentEventSource.fromComponentEventsOf(component);
122+
}
123+
124+
/**
125+
* Creates an observable corresponding to component resize events.
126+
*
127+
* @param component
128+
* The component to register the observable for.
129+
* @return Observable emitting the current size of the given component after each resize event.
130+
*/
131+
public static Observable<Dimension> fromResizing(Component component) {
132+
return ComponentEventSource.fromResizing(component);
133+
}
109134
}

rxjava-contrib/rxjava-swing/src/main/java/rx/swing/sources/AbstractButtonSource.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@
3838

3939
public enum AbstractButtonSource { ; // no instances
4040

41+
/**
42+
* @see SwingObservable.fromButtonAction
43+
*/
4144
public static Observable<ActionEvent> fromActionOf(final AbstractButton button) {
4245
return Observable.create(new Func1<Observer<ActionEvent>, Subscription>() {
4346
@Override
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
/**
2+
* Copyright 2013 Netflix, Inc.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package rx.swing.sources;
17+
18+
import static rx.swing.sources.ComponentEventSource.Predicate.RESIZED;
19+
20+
import java.awt.Component;
21+
import java.awt.Dimension;
22+
import java.awt.event.ComponentEvent;
23+
import java.awt.event.ComponentListener;
24+
25+
import rx.Observable;
26+
import rx.Observer;
27+
import rx.Subscription;
28+
import rx.observables.SwingObservable;
29+
import rx.subscriptions.Subscriptions;
30+
import rx.util.functions.Action0;
31+
import rx.util.functions.Func1;
32+
33+
public enum ComponentEventSource { ; // no instances
34+
35+
/**
36+
* @see SwingObservable.fromComponentEvents
37+
*/
38+
public static Observable<ComponentEvent> fromComponentEventsOf(final Component component) {
39+
return Observable.create(new Func1<Observer<ComponentEvent>, Subscription>() {
40+
@Override
41+
public Subscription call(final Observer<ComponentEvent> observer) {
42+
final ComponentListener listener = new ComponentListener() {
43+
@Override
44+
public void componentHidden(ComponentEvent event) {
45+
observer.onNext(event);
46+
}
47+
48+
@Override
49+
public void componentMoved(ComponentEvent event) {
50+
observer.onNext(event);
51+
}
52+
53+
@Override
54+
public void componentResized(ComponentEvent event) {
55+
observer.onNext(event);
56+
}
57+
58+
@Override
59+
public void componentShown(ComponentEvent event) {
60+
observer.onNext(event);
61+
}
62+
};
63+
component.addComponentListener(listener);
64+
65+
return Subscriptions.create(new Action0() {
66+
@Override
67+
public void call() {
68+
component.removeComponentListener(listener);
69+
}
70+
});
71+
}
72+
});
73+
}
74+
75+
/**
76+
* @see SwingObservable.fromResizing
77+
*/
78+
public static Observable<Dimension> fromResizing(final Component component) {
79+
return fromComponentEventsOf(component).filter(RESIZED).map(new Func1<ComponentEvent, Dimension>() {
80+
@Override
81+
public Dimension call(ComponentEvent event) {
82+
return event.getComponent().getSize();
83+
}
84+
});
85+
}
86+
87+
/**
88+
* Predicates that help with filtering observables for specific component events.
89+
*/
90+
public enum Predicate implements rx.util.functions.Func1<java.awt.event.ComponentEvent, Boolean> {
91+
RESIZED(ComponentEvent.COMPONENT_RESIZED),
92+
HIDDEN(ComponentEvent.COMPONENT_HIDDEN),
93+
MOVED(ComponentEvent.COMPONENT_MOVED),
94+
SHOWN(ComponentEvent.COMPONENT_SHOWN);
95+
96+
private final int id;
97+
98+
private Predicate(int id) {
99+
this.id = id;
100+
}
101+
102+
@Override
103+
public Boolean call(ComponentEvent event) {
104+
return event.getID() == id;
105+
}
106+
107+
}
108+
}

rxjava-contrib/rxjava-swing/src/main/java/rx/swing/sources/KeyEventSource.java

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,19 @@
1616
package rx.swing.sources;
1717

1818
import static java.util.Arrays.asList;
19-
import static org.mockito.Mockito.*;
19+
import static org.mockito.Mockito.inOrder;
20+
import static org.mockito.Mockito.mock;
21+
import static org.mockito.Mockito.never;
22+
import static org.mockito.Mockito.times;
23+
import static org.mockito.Mockito.verify;
2024

25+
import java.awt.Component;
2126
import java.awt.event.KeyEvent;
2227
import java.awt.event.KeyListener;
2328
import java.util.Collections;
2429
import java.util.HashSet;
2530
import java.util.Set;
2631

27-
import javax.swing.JComponent;
2832
import javax.swing.JPanel;
2933

3034
import org.junit.Test;
@@ -42,7 +46,10 @@
4246

4347
public enum KeyEventSource { ; // no instances
4448

45-
public static Observable<KeyEvent> fromKeyEventsOf(final JComponent component) {
49+
/**
50+
* @see SwingObservable.fromKeyEvents(Component)
51+
*/
52+
public static Observable<KeyEvent> fromKeyEventsOf(final Component component) {
4653
return Observable.create(new Func1<Observer<KeyEvent>, Subscription>() {
4754
@Override
4855
public Subscription call(final Observer<KeyEvent> observer) {
@@ -74,7 +81,10 @@ public void call() {
7481
});
7582
}
7683

77-
public static Observable<Set<Integer>> currentlyPressedKeysOf(JComponent component) {
84+
/**
85+
* @see SwingObservable.fromKeyEvents(Component, Set)
86+
*/
87+
public static Observable<Set<Integer>> currentlyPressedKeysOf(Component component) {
7888
return Observable.<KeyEvent, Set<Integer>>scan(fromKeyEventsOf(component), new HashSet<Integer>(), new Func2<Set<Integer>, KeyEvent, Set<Integer>>() {
7989
@Override
8090
public Set<Integer> call(Set<Integer> pressedKeys, KeyEvent event) {
@@ -96,7 +106,7 @@ public Set<Integer> call(Set<Integer> pressedKeys, KeyEvent event) {
96106
}
97107

98108
public static class UnitTest {
99-
private JComponent comp = new JPanel();
109+
private Component comp = new JPanel();
100110

101111
@Test
102112
public void testObservingKeyEvents() {

rxjava-contrib/rxjava-swing/src/main/java/rx/swing/sources/MouseEventSource.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,11 @@
1515
*/
1616
package rx.swing.sources;
1717

18+
import java.awt.Component;
1819
import java.awt.event.MouseEvent;
1920
import java.awt.event.MouseListener;
2021
import java.awt.event.MouseMotionListener;
2122

22-
import javax.swing.JComponent;
23-
2423
import rx.Observable;
2524
import rx.Observer;
2625
import rx.Subscription;
@@ -30,7 +29,10 @@
3029

3130
public enum MouseEventSource { ; // no instances
3231

33-
public static Observable<MouseEvent> fromMouseEventsOf(final JComponent component) {
32+
/**
33+
* @see SwingObservable.fromMouseEvents
34+
*/
35+
public static Observable<MouseEvent> fromMouseEventsOf(final Component component) {
3436
return Observable.create(new Func1<Observer<MouseEvent>, Subscription>() {
3537
@Override
3638
public Subscription call(final Observer<MouseEvent> observer) {
@@ -72,7 +74,10 @@ public void call() {
7274
});
7375
}
7476

75-
public static Observable<MouseEvent> fromMouseMotionEventsOf(final JComponent component) {
77+
/**
78+
* @see SwingObservable.fromMouseMotionEvents
79+
*/
80+
public static Observable<MouseEvent> fromMouseMotionEventsOf(final Component component) {
7681
return Observable.create(new Func1<Observer<MouseEvent>, Subscription>() {
7782
@Override
7883
public Subscription call(final Observer<MouseEvent> observer) {

0 commit comments

Comments
 (0)