Skip to content

Commit 1b63cbb

Browse files
Merge pull request #6 from eddieburns55/mousewheel-events
add mousewheel event support and extra unit tests
2 parents 1e41f78 + 2a97b90 commit 1b63cbb

File tree

3 files changed

+154
-17
lines changed

3 files changed

+154
-17
lines changed

src/main/java/rx/observables/SwingObservable.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,7 @@
1818
import java.awt.Component;
1919
import java.awt.Dimension;
2020
import java.awt.Point;
21-
import java.awt.event.ActionEvent;
22-
import java.awt.event.ComponentEvent;
23-
import java.awt.event.KeyEvent;
24-
import java.awt.event.MouseEvent;
25-
import java.awt.event.FocusEvent;
21+
import java.awt.event.*;
2622
import java.util.Set;
2723

2824
import javax.swing.AbstractButton;
@@ -121,6 +117,17 @@ public static Observable<MouseEvent> fromMouseMotionEvents(Component component)
121117
public static Observable<Point> fromRelativeMouseMotion(Component component) {
122118
return MouseEventSource.fromRelativeMouseMotion(component);
123119
}
120+
121+
/**
122+
* Creates an observable corresponding to raw mouse wheel events.
123+
*
124+
* @param component
125+
* The component to register the observable for.
126+
* @return The component to register the observable for.
127+
*/
128+
public static Observable<MouseWheelEvent> fromMouseWheelEvents(Component component) {
129+
return MouseEventSource.fromMouseWheelEvents(component);
130+
}
124131

125132
/**
126133
* Creates an observable corresponding to raw component events.

src/main/java/rx/swing/sources/MouseEventSource.java

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,7 @@
1717

1818
import java.awt.Component;
1919
import java.awt.Point;
20-
import java.awt.event.MouseEvent;
21-
import java.awt.event.MouseListener;
22-
import java.awt.event.MouseMotionListener;
20+
import java.awt.event.*;
2321

2422
import rx.Observable;
2523
import rx.Observable.OnSubscribe;
@@ -109,6 +107,28 @@ public void call() {
109107
});
110108
}
111109

110+
public static Observable<MouseWheelEvent> fromMouseWheelEvents(final Component component){
111+
return Observable.create(new OnSubscribe<MouseWheelEvent>() {
112+
@Override
113+
public void call(final Subscriber<? super MouseWheelEvent> subscriber) {
114+
final MouseWheelListener listener = new MouseWheelListener() {
115+
@Override
116+
public void mouseWheelMoved(MouseWheelEvent event) {
117+
subscriber.onNext(event);
118+
}
119+
};
120+
component.addMouseWheelListener(listener);
121+
122+
subscriber.add(SwingSubscriptions.unsubscribeInEventDispatchThread(new Action0() {
123+
@Override
124+
public void call() {
125+
component.removeMouseWheelListener(listener);
126+
}
127+
}));
128+
}
129+
});
130+
}
131+
112132
/**
113133
* @see rx.observables.SwingObservable#fromRelativeMouseMotion
114134
*/

src/test/java/rx/swing/sources/MouseEventSourceTest.java

Lines changed: 119 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@
2323

2424
import java.awt.Component;
2525
import java.awt.Point;
26-
import java.awt.event.MouseEvent;
27-
import java.awt.event.MouseMotionListener;
26+
import java.awt.event.*;
27+
2828

2929
import javax.swing.JPanel;
3030

@@ -60,17 +60,17 @@ public void call() {
6060
verify(error, never()).call(Matchers.<Exception> any());
6161
verify(complete, never()).call();
6262

63-
fireMouseEvent(mouseEvent(0, 0));
63+
fireMouseMotionEvent(mouseEvent(0, 0, MouseEvent.MOUSE_MOVED));
6464
verify(action, never()).call(Matchers.<Point> any());
6565

66-
fireMouseEvent(mouseEvent(10, -5));
66+
fireMouseMotionEvent(mouseEvent(10, -5, MouseEvent.MOUSE_MOVED));
6767
inOrder.verify(action, times(1)).call(new Point(10, -5));
6868

69-
fireMouseEvent(mouseEvent(6, 10));
69+
fireMouseMotionEvent(mouseEvent(6, 10, MouseEvent.MOUSE_MOVED));
7070
inOrder.verify(action, times(1)).call(new Point(-4, 15));
7171

7272
sub.unsubscribe();
73-
fireMouseEvent(mouseEvent(0, 0));
73+
fireMouseMotionEvent(mouseEvent(0, 0, MouseEvent.MOUSE_MOVED));
7474
inOrder.verify(action, never()).call(Matchers.<Point> any());
7575
verify(error, never()).call(Matchers.<Exception> any());
7676
verify(complete, never()).call();
@@ -79,14 +79,124 @@ public void call() {
7979
}).awaitTerminal();
8080
}
8181

82-
private MouseEvent mouseEvent(int x, int y) {
83-
return new MouseEvent(comp, MouseEvent.MOUSE_MOVED, 1L, 0, x, y, 0,
82+
@Test
83+
public void testMouseEvents() throws Throwable {
84+
SwingTestHelper.create().runInEventDispatchThread(new Action0() {
85+
86+
@Override
87+
public void call() {
88+
@SuppressWarnings("unchecked")
89+
Action1<MouseEvent> action = mock(Action1.class);
90+
@SuppressWarnings("unchecked")
91+
Action1<Throwable> error = mock(Action1.class);
92+
Action0 complete = mock(Action0.class);
93+
94+
Subscription sub = MouseEventSource.fromMouseEventsOf(comp)
95+
.subscribe(action, error, complete);
96+
97+
InOrder inOrder = inOrder(action);
98+
99+
verify(action, never()).call(Matchers.<MouseEvent> any());
100+
verify(error, never()).call(Matchers.<Exception> any());
101+
verify(complete, never()).call();
102+
103+
MouseEvent mouseEvent =
104+
mouseEvent(0, 0, MouseEvent.MOUSE_CLICKED);
105+
fireMouseClickEvent(mouseEvent);
106+
inOrder.verify(action, times(1)).call(mouseEvent);
107+
108+
mouseEvent = mouseEvent(300, 200, MouseEvent.MOUSE_CLICKED);
109+
fireMouseClickEvent(mouseEvent);
110+
inOrder.verify(action, times(1)).call(mouseEvent);
111+
112+
mouseEvent = mouseEvent(0, 0, MouseEvent.MOUSE_CLICKED);
113+
fireMouseClickEvent(mouseEvent);
114+
inOrder.verify(action, times(1)).call(mouseEvent);
115+
116+
sub.unsubscribe();
117+
fireMouseClickEvent(mouseEvent(0, 0, MouseEvent.MOUSE_CLICKED));
118+
inOrder.verify(action, never()).call(Matchers.<MouseEvent> any());
119+
verify(error, never()).call(Matchers.<Exception> any());
120+
verify(complete, never()).call();
121+
}
122+
123+
}).awaitTerminal();
124+
}
125+
126+
@Test
127+
public void testMouseWheelEvents() throws Throwable {
128+
SwingTestHelper.create().runInEventDispatchThread(new Action0() {
129+
130+
@Override
131+
public void call() {
132+
@SuppressWarnings("unchecked")
133+
Action1<MouseEvent> action = mock(Action1.class);
134+
@SuppressWarnings("unchecked")
135+
Action1<Throwable> error = mock(Action1.class);
136+
Action0 complete = mock(Action0.class);
137+
138+
Subscription sub = MouseEventSource.fromMouseWheelEvents(comp)
139+
.subscribe(action, error, complete);
140+
141+
InOrder inOrder = inOrder(action);
142+
143+
verify(action, never()).call(Matchers.<MouseEvent> any());
144+
verify(error, never()).call(Matchers.<Exception> any());
145+
verify(complete, never()).call();
146+
147+
MouseWheelEvent mouseEvent = mouseWheelEvent(0);
148+
fireMouseWheelEvent(mouseEvent);
149+
inOrder.verify(action, times(1)).call(mouseEvent);
150+
151+
mouseEvent = mouseWheelEvent(3);
152+
fireMouseWheelEvent(mouseEvent);
153+
inOrder.verify(action, times(1)).call(mouseEvent);
154+
155+
mouseEvent = mouseWheelEvent(5);
156+
fireMouseWheelEvent(mouseEvent);
157+
inOrder.verify(action, times(1)).call(mouseEvent);
158+
159+
mouseEvent = mouseWheelEvent(1);
160+
fireMouseWheelEvent(mouseEvent);
161+
inOrder.verify(action, times(1)).call(mouseEvent);
162+
163+
sub.unsubscribe();
164+
fireMouseClickEvent(mouseEvent(0, 0, MouseEvent.MOUSE_CLICKED));
165+
inOrder.verify(action, never()).call(Matchers.<MouseEvent> any());
166+
verify(error, never()).call(Matchers.<Exception> any());
167+
verify(complete, never()).call();
168+
}
169+
170+
}).awaitTerminal();
171+
}
172+
173+
private MouseEvent mouseEvent(int x, int y, int mouseEventType) {
174+
return new MouseEvent(comp, mouseEventType, 1L, 0, x, y, 0,
84175
false);
85176
}
86177

87-
private void fireMouseEvent(MouseEvent event) {
178+
private void fireMouseMotionEvent(MouseEvent event) {
88179
for (MouseMotionListener listener : comp.getMouseMotionListeners()) {
89180
listener.mouseMoved(event);
90181
}
91182
}
183+
184+
private void fireMouseClickEvent(MouseEvent event) {
185+
for (MouseListener listener : comp.getMouseListeners()) {
186+
listener.mouseClicked(event);
187+
}
188+
}
189+
190+
private MouseWheelEvent mouseWheelEvent(int wheelRotationClicks) {
191+
int mouseEventType = MouseEvent.MOUSE_WHEEL;
192+
return new MouseWheelEvent(comp, mouseEventType, 1L, 0, 0, 0, 0,
193+
false, MouseWheelEvent.WHEEL_BLOCK_SCROLL, 0,
194+
wheelRotationClicks);
195+
}
196+
197+
private void fireMouseWheelEvent(MouseWheelEvent event) {
198+
for (MouseWheelListener listener : comp.getMouseWheelListeners()) {
199+
listener.mouseWheelMoved(event);
200+
}
201+
}
92202
}

0 commit comments

Comments
 (0)