diff --git a/extras/src/main/java/edu/umd/cs/piccolox/pswing/PSwingEventHandler.java b/extras/src/main/java/edu/umd/cs/piccolox/pswing/PSwingEventHandler.java index 464c244..b79490b 100644 --- a/extras/src/main/java/edu/umd/cs/piccolox/pswing/PSwingEventHandler.java +++ b/extras/src/main/java/edu/umd/cs/piccolox/pswing/PSwingEventHandler.java @@ -114,7 +114,7 @@ /** * Sets whether this event handler can fire events. * - * @param active true if thie event handler can fire events + * @param active true if this event handler can fire events */ void setActive(final boolean active) { if (this.active && !active) { @@ -266,11 +266,11 @@ } else if (isWheelEvent(pSwingMouseEvent) && comp != null) { final MouseWheelEvent mWEvent = (MouseWheelEvent) mEvent; - + final MouseWheelEvent tempEvent = new MouseWheelEvent(comp, pSwingMouseEvent.getID(), mEvent.getWhen(), mEvent.getModifiers(), point.x - offset.x, point.y - offset.y, mEvent.getClickCount(), mEvent - .isPopupTrigger(), mWEvent.getScrollType(), mWEvent.getScrollAmount(), mWEvent - .getWheelRotation()); + .isPopupTrigger(), mWEvent.getScrollType(), mWEvent.getScrollAmount(), mWEvent + .getWheelRotation()); final PSwingMouseWheelEvent e2 = new PSwingMouseWheelEvent(tempEvent.getID(), tempEvent, aEvent); dispatchEvent(comp, e2); @@ -465,29 +465,34 @@ * Process a Piccolo2D event and (if active) dispatch the corresponding * Swing event. * - * @param aEvent Piccolo2D event being testing for dispatch to swing + * @param aEvent Piccolo2D event being tested for dispatch to swing * @param type is not used in this method */ public void processEvent(final PInputEvent aEvent, final int type) { - if (aEvent.isMouseEvent()) { - final InputEvent sourceSwingEvent = aEvent.getSourceSwingEvent(); - if (sourceSwingEvent instanceof MouseEvent) { - final MouseEvent swingMouseEvent = (MouseEvent) sourceSwingEvent; - final PSwingEvent pSwingMouseEvent = PSwingMouseEvent.createMouseEvent(swingMouseEvent.getID(), - swingMouseEvent, aEvent); - if (!recursing) { - recursing = true; - dispatchEvent(pSwingMouseEvent, aEvent); - if (pSwingMouseEvent.asMouseEvent().isConsumed()) { - aEvent.setHandled(true); - } - recursing = false; - } + if (!aEvent.isMouseEvent()) { + return; + } + + final InputEvent sourceSwingEvent = aEvent.getSourceSwingEvent(); + if (!(sourceSwingEvent instanceof MouseEvent)) { + throw new RuntimeException("PInputEvent.getSourceSwingEvent was not a MouseEvent. Actual event: " + + sourceSwingEvent + ", class=" + sourceSwingEvent.getClass().getName()); + } + + processMouseEvent(aEvent, (MouseEvent) sourceSwingEvent); + } + + private void processMouseEvent(final PInputEvent aEvent, final MouseEvent swingMouseEvent) { + if (!recursing) { + recursing = true; + final PSwingEvent pSwingMouseEvent = PSwingMouseEvent.createMouseEvent(swingMouseEvent.getID(), + swingMouseEvent, aEvent); + + dispatchEvent(pSwingMouseEvent, aEvent); + if (pSwingMouseEvent.asMouseEvent().isConsumed()) { + aEvent.setHandled(true); } - else { - throw new RuntimeException("PInputEvent.getSourceSwingEvent was not a MouseEvent. Actual event: " - + sourceSwingEvent + ", class=" + sourceSwingEvent.getClass().getName()); - } + recursing = false; } } diff --git a/extras/src/main/java/edu/umd/cs/piccolox/pswing/PSwingMouseEvent.java b/extras/src/main/java/edu/umd/cs/piccolox/pswing/PSwingMouseEvent.java index 7197cfc..fc91f3c 100644 --- a/extras/src/main/java/edu/umd/cs/piccolox/pswing/PSwingMouseEvent.java +++ b/extras/src/main/java/edu/umd/cs/piccolox/pswing/PSwingMouseEvent.java @@ -109,6 +109,10 @@ * @return the constructed PSwingEvent */ public static PSwingEvent createMouseEvent(final int id, final MouseEvent swingEvent, final PInputEvent pEvent) { + if (pEvent == null) { + throw new IllegalArgumentException("PInputEvent associated with PSwingEvent may not be null"); + } + if (id == MouseEvent.MOUSE_MOVED || id == MouseEvent.MOUSE_DRAGGED) { return new PSwingMouseMotionEvent(id, swingEvent, pEvent); } diff --git a/extras/src/test/java/edu/umd/cs/piccolox/pswing/PSwingEventHandlerTest.java b/extras/src/test/java/edu/umd/cs/piccolox/pswing/PSwingEventHandlerTest.java new file mode 100644 index 0000000..4431582 --- /dev/null +++ b/extras/src/test/java/edu/umd/cs/piccolox/pswing/PSwingEventHandlerTest.java @@ -0,0 +1,11 @@ +package edu.umd.cs.piccolox.pswing; + +import junit.framework.TestCase; + +public class PSwingEventHandlerTest extends TestCase { + + public void testConstructorAcceptsNullTargetNode() { + PSwingCanvas canvas = new PSwingCanvas(); + PSwingEventHandler handler = new PSwingEventHandler(canvas, null); + } +} diff --git a/extras/src/test/java/edu/umd/cs/piccolox/pswing/PSwingMouseEventTest.java b/extras/src/test/java/edu/umd/cs/piccolox/pswing/PSwingMouseEventTest.java new file mode 100644 index 0000000..0f2f4e7 --- /dev/null +++ b/extras/src/test/java/edu/umd/cs/piccolox/pswing/PSwingMouseEventTest.java @@ -0,0 +1,74 @@ +package edu.umd.cs.piccolox.pswing; + +import java.awt.event.MouseEvent; +import java.awt.event.MouseWheelEvent; + +import javax.swing.JComponent; +import javax.swing.JPanel; + +import junit.framework.TestCase; +import edu.umd.cs.piccolo.event.PInputEvent; + +public class PSwingMouseEventTest extends TestCase { + + public void testCreateMouseEventDoesNotAcceptNullPInputEvent() { + try { + MouseEvent mouseEvent = new MouseEvent(null, MouseEvent.MOUSE_MOVED, System.currentTimeMillis(), 0, 0, 0, + 0, false); + PSwingMouseEvent.createMouseEvent(0, mouseEvent, null); + fail("Null PInputEvent should throw an exception"); + } + catch (IllegalArgumentException iae) { + // expected exception + } + } + + public void testCreateMouseEventDoesNotAcceptNullMouseEvent() { + try { + PInputEvent event = new PInputEvent(null, null); + PSwingMouseEvent.createMouseEvent(0, null, event); + fail("Null MouseEvent should throw an exception"); + } + catch (NullPointerException iae) { + // expected exception + } + } + + public void testCreateMouseEventReturnsValidMouseEventWhenParamsAreGood() { + JComponent src = new JPanel(); + PInputEvent piccoloEvent = new PInputEvent(null, null); + MouseEvent mouseEvent = new MouseEvent(src, MouseEvent.MOUSE_MOVED, System.currentTimeMillis(), 0, 0, 0, 0, + false); + PSwingEvent swingEvent = PSwingMouseEvent.createMouseEvent(0, mouseEvent, piccoloEvent); + assertNotNull(swingEvent); + } + + public void testCreateMouseEventReturnsPSwingMouseEventWhenGivenGenericID() { + JComponent src = new JPanel(); + PInputEvent piccoloEvent = new PInputEvent(null, null); + MouseEvent mouseEvent = new MouseEvent(src, 0, System.currentTimeMillis(), 0, 0, 0, 0, + false); + PSwingEvent swingEvent = PSwingMouseEvent.createMouseEvent(0, mouseEvent, piccoloEvent); + assertTrue(swingEvent instanceof PSwingMouseEvent); + } + + public void testCreateMouseEventReturnsPSwingMouseMotionEventWhenGivenMotionID() { + JComponent src = new JPanel(); + PInputEvent piccoloEvent = new PInputEvent(null, null); + MouseEvent mouseEvent = new MouseEvent(src, MouseEvent.MOUSE_MOVED, System.currentTimeMillis(), 0, 0, 0, 0, + false); + PSwingEvent swingEvent = PSwingMouseEvent.createMouseEvent(MouseEvent.MOUSE_MOVED, mouseEvent, piccoloEvent); + assertTrue(swingEvent instanceof PSwingMouseMotionEvent); + } + + public void testCreateMouseEventReturnsPSwingMouseWheelEventWhenGivenWheelID() { + JComponent src = new JPanel(); + PInputEvent piccoloEvent = new PInputEvent(null, null); + MouseWheelEvent mouseEvent = new MouseWheelEvent(src, MouseEvent.MOUSE_WHEEL, System.currentTimeMillis(), 0, 0, + 0, 0, + false, MouseWheelEvent.WHEEL_UNIT_SCROLL, 10, 1); + PSwingEvent swingEvent = PSwingMouseEvent.createMouseEvent(MouseEvent.MOUSE_WHEEL, mouseEvent, piccoloEvent); + assertTrue(swingEvent instanceof PSwingMouseWheelEvent); + } + +}