Author: allain.lalonde Date: Fri Jul 17 14:51:54 2009 New Revision: 493 Modified: piccolo2d.java/trunk/core/src/main/java/edu/umd/cs/piccolo/event/PInputEventFilter.java piccolo2d.java/trunk/core/src/test/java/edu/umd/cs/piccolo/event/PInputEventFilterTest.java
Log: Fixed Issue 100; Plastered PInputEventFilter with Unit Tests and then made it consider the masks conditionally. andMask if it's non-zero notMask if it's non-zero orMask if it's not ALL_MODIFIERS (I can't think of a case where you might want to say, "Only allow events as long as they have a modifier, I don't care which one") Modified: piccolo2d.java/trunk/core/src/main/java/edu/umd/cs/piccolo/event/PInputEventFilter.java ============================================================================== --- piccolo2d.java/trunk/core/src/main/java/edu/umd/cs/piccolo/event/PInputEventFilter.java (original) +++ piccolo2d.java/trunk/core/src/main/java/edu/umd/cs/piccolo/event/PInputEventFilter.java Fri Jul 17 14:51:54 2009 @@ -101,85 +101,72 @@ modifiers = aEvent.getModifiers(); } - // TODO: this really messes up the Eclipse formatter - if ((!aEvent.isHandled() || acceptsAlreadyHandledEvents) && (modifiers == 0 || // if - // no - // modifiers - // then - // ignore - // modifier - // constraints - // , - // ELSE - (modifiers & andMask) == andMask && // must have all modifiers - // from the AND mask and - (modifiers & orMask) != 0 && // must have at least one - // modifier from the OR - // mask and - (modifiers & notMask) == 0)) { // can't have any - // modifiers from the NOT - // mask - - if (aEvent.isMouseEvent() && clickCount != -1 && clickCount != aEvent.getClickCount()) { - aResult = false; - } - else { - switch (type) { - case KeyEvent.KEY_PRESSED: - aResult = getAcceptsKeyPressed(); - break; - - case KeyEvent.KEY_RELEASED: - aResult = getAcceptsKeyReleased(); - break; - - case KeyEvent.KEY_TYPED: - aResult = getAcceptsKeyTyped(); - break; - - case MouseEvent.MOUSE_CLICKED: - aResult = getAcceptsMouseClicked(); - break; - - case MouseEvent.MOUSE_DRAGGED: - aResult = getAcceptsMouseDragged(); - break; - - case MouseEvent.MOUSE_ENTERED: - aResult = getAcceptsMouseEntered(); - break; - - case MouseEvent.MOUSE_EXITED: - aResult = getAcceptsMouseExited(); - break; - - case MouseEvent.MOUSE_MOVED: - aResult = getAcceptsMouseMoved(); - break; - - case MouseEvent.MOUSE_PRESSED: - aResult = getAcceptsMousePressed(); - break; - - case MouseEvent.MOUSE_RELEASED: - aResult = getAcceptsMouseReleased(); - break; - - case MouseWheelEvent.WHEEL_UNIT_SCROLL: - case MouseWheelEvent.WHEEL_BLOCK_SCROLL: - aResult = getAcceptsMouseWheelRotated(); - break; - - case FocusEvent.FOCUS_GAINED: - case FocusEvent.FOCUS_LOST: - aResult = getAcceptsFocusEvents(); - break; - - default: - throw new RuntimeException("PInputEvent with bad ID"); - } - } - } + if (aEvent.isHandled() && !acceptsAlreadyHandledEvents) + return false; + + if ((modifiers & andMask) != andMask || (modifiers & notMask) != 0) + return false; + + if (orMask != ALL_MODIFIERS_MASK && (modifiers & orMask) == 0) + return false; + + if (aEvent.isMouseEvent() && clickCount != -1 && clickCount != aEvent.getClickCount()) + return false; + + switch (type) { + case KeyEvent.KEY_PRESSED: + aResult = getAcceptsKeyPressed(); + break; + + case KeyEvent.KEY_RELEASED: + aResult = getAcceptsKeyReleased(); + break; + + case KeyEvent.KEY_TYPED: + aResult = getAcceptsKeyTyped(); + break; + + case MouseEvent.MOUSE_CLICKED: + aResult = getAcceptsMouseClicked(); + break; + + case MouseEvent.MOUSE_DRAGGED: + aResult = getAcceptsMouseDragged(); + break; + + case MouseEvent.MOUSE_ENTERED: + aResult = getAcceptsMouseEntered(); + break; + + case MouseEvent.MOUSE_EXITED: + aResult = getAcceptsMouseExited(); + break; + + case MouseEvent.MOUSE_MOVED: + aResult = getAcceptsMouseMoved(); + break; + + case MouseEvent.MOUSE_PRESSED: + aResult = getAcceptsMousePressed(); + break; + + case MouseEvent.MOUSE_RELEASED: + aResult = getAcceptsMouseReleased(); + break; + + case MouseWheelEvent.WHEEL_UNIT_SCROLL: + case MouseWheelEvent.WHEEL_BLOCK_SCROLL: + aResult = getAcceptsMouseWheelRotated(); + break; + + case FocusEvent.FOCUS_GAINED: + case FocusEvent.FOCUS_LOST: + aResult = getAcceptsFocusEvents(); + break; + + default: + throw new RuntimeException("PInputEvent with bad ID"); + } if (aResult && getMarksAcceptedEventsAsHandled()) { aEvent.setHandled(true); Modified: piccolo2d.java/trunk/core/src/test/java/edu/umd/cs/piccolo/event/PInputEventFilterTest.java ============================================================================== --- piccolo2d.java/trunk/core/src/test/java/edu/umd/cs/piccolo/event/PInputEventFilterTest.java (original) +++ piccolo2d.java/trunk/core/src/test/java/edu/umd/cs/piccolo/event/PInputEventFilterTest.java Fri Jul 17 14:51:54 2009 @@ -1,6 +1,15 @@ package edu.umd.cs.piccolo.event; +import java.awt.Component; +import java.awt.event.InputEvent; +import java.awt.event.MouseEvent; + +import javax.swing.JComponent; +import javax.swing.JPanel; + import junit.framework.TestCase; +import edu.umd.cs.piccolo.PCamera; +import edu.umd.cs.piccolo.PInputManager; public class PInputEventFilterTest extends TestCase { private PInputEventFilter filter; @@ -8,19 +17,19 @@ public void setUp() { filter = new PInputEventFilter(); } - + public void testAcceptsAlreadyHandledEventsFalseByDefault() { assertFalse(filter.getAcceptsAlreadyHandledEvents()); } - + public void testDoesNotMarkEventsHandledByDefault() { assertFalse(filter.getMarksAcceptedEventsAsHandled()); } - - public void testAcceptsEverythingByDefault() { - assertAcceptsAll(); + + public void testAcceptsEverythingByDefault() { + assertAcceptsAll(); } - + public void testMaskDoesNotAffectReportedAccepts() { filter = new PInputEventFilter(0); assertAcceptsAll(); @@ -29,7 +38,7 @@ private void assertAcceptsAll() { assertTrue(filter.getAcceptsFocusEvents()); assertTrue(filter.getAcceptsKeyPressed()); - assertTrue(filter.getAcceptsKeyReleased()); + assertTrue(filter.getAcceptsKeyReleased()); assertTrue(filter.getAcceptsKeyTyped()); assertTrue(filter.getAcceptsMouseClicked()); assertTrue(filter.getAcceptsMouseDragged()); @@ -40,13 +49,11 @@ assertTrue(filter.getAcceptsMouseReleased()); assertTrue(filter.getAcceptsMouseWheelRotated()); } - - public void testRejectsEverythingAfterCallingRejectAllEventTypes() { + + public void testRejectsEverythingAfterCallingRejectAllEventTypes() { filter.rejectAllEventTypes(); - assertRejectsAll(); + assertRejectsAll(); } - - private void assertRejectsAll() { assertFalse(filter.getAcceptsFocusEvents()); @@ -62,61 +69,157 @@ assertFalse(filter.getAcceptsMouseReleased()); assertFalse(filter.getAcceptsMouseWheelRotated()); } - - public void testSetAcceptsFocusEventsPersists() { filter.setAcceptsFocusEvents(false); assertFalse(filter.getAcceptsFocusEvents()); } - + public void testSetAcceptsKeyPressedPersists() { filter.setAcceptsKeyPressed(false); assertFalse(filter.getAcceptsKeyPressed()); } - + public void testSetAcceptsKeyReleasedPersists() { filter.setAcceptsKeyReleased(false); assertFalse(filter.getAcceptsKeyReleased()); } - + public void testSetAcceptsKeyTypedPersists() { filter.setAcceptsKeyTyped(false); assertFalse(filter.getAcceptsKeyTyped()); } - + public void testSetAcceptsMouseClickedPersists() { filter.setAcceptsMouseClicked(false); assertFalse(filter.getAcceptsMouseClicked()); } - + public void testSetAcceptsMouseEnteredPersists() { filter.setAcceptsMouseEntered(false); assertFalse(filter.getAcceptsMouseEntered()); } - + public void testSetAcceptsMouseExitedPersists() { filter.setAcceptsMouseExited(false); assertFalse(filter.getAcceptsMouseExited()); } - + public void testSetAcceptsMouseMovedPersists() { filter.setAcceptsMouseMoved(false); assertFalse(filter.getAcceptsMouseMoved()); } + public void testSetAcceptsMouseDraggedPersists() { + filter.setAcceptsMouseDragged(false); + assertFalse(filter.getAcceptsMouseDragged()); + } + public void testSetAcceptsMouseMovedPressed() { filter.setAcceptsMousePressed(false); assertFalse(filter.getAcceptsMousePressed()); } - + public void testSetAcceptsMouseMovedReleased() { filter.setAcceptsMouseReleased(false); assertFalse(filter.getAcceptsMouseReleased()); } - + public void testSetAcceptsMouseWheelRotated() { filter.setAcceptsMouseWheelRotated(false); assertFalse(filter.getAcceptsMouseWheelRotated()); + } + + public void testAcceptsSimpleEvent() { + PInputEvent event = buildTestEvent(); + assertAcceptsEvent(event); + } + + public void testRejectsAcceptedEventIfAcceptsHandledEventsIsFalse() { + PInputEvent event = buildTestEvent(); + event.setHandled(true); + filter.setAcceptsAlreadyHandledEvents(false); + assertRejectsEvent(event); + } + + public void testRejectsEventsUnlessModifiersContainAllOfMask() { + PInputEvent event = buildTestEvent(); + filter.setAndMask(InputEvent.CTRL_MASK | InputEvent.ALT_MASK); + assertRejectsEvent(event); + event = buildTestEvent(InputEvent.CTRL_MASK | InputEvent.ALT_MASK); + assertAcceptsEvent(event); + + event = buildTestEvent(InputEvent.CTRL_MASK | InputEvent.ALT_MASK | InputEvent.META_MASK); + assertAcceptsEvent(event); + } + + public void testRejectsEventsUnlessModifiersContainOneOfOrMask() { + PInputEvent event = buildTestEvent(); + filter.setOrMask(InputEvent.CTRL_MASK | InputEvent.ALT_MASK); + assertRejectsEvent(event); + assertRejectsEvent(buildTestEvent(InputEvent.META_MASK)); + assertAcceptsEvent(buildTestEvent(InputEvent.CTRL_MASK)); + assertAcceptsEvent(buildTestEvent(InputEvent.ALT_MASK)); + assertAcceptsEvent(buildTestEvent(InputEvent.CTRL_MASK | InputEvent.ALT_MASK)); + } + + public void testRejectsEventsUnlessTheyMatchOneOfNotMask() { + PInputEvent event = buildTestEvent(); + filter.setNotMask(InputEvent.CTRL_MASK | InputEvent.ALT_MASK); + assertAcceptsEvent(event); + + assertAcceptsEvent(buildTestEvent(InputEvent.META_MASK)); + assertRejectsEvent(buildTestEvent(InputEvent.CTRL_MASK)); + assertRejectsEvent(buildTestEvent(InputEvent.ALT_MASK)); + assertRejectsEvent(buildTestEvent(InputEvent.CTRL_MASK | InputEvent.ALT_MASK)); + } + + public void testRejectsMouseEventsIfMouseClickFilterSet() { + filter.setAcceptClickCount((short)1); + assertRejectsEvent(buildTestEvent(0, 0)); + assertAcceptsEvent(buildTestEvent(0, 1)); + assertRejectsEvent(buildTestEvent(0, 2)); + assertRejectsEvent(buildTestEvent(0, 3)); + } + + public void testMarksEventsAsHandledIsHonnored() { + filter.setMarksAcceptedEventsAsHandled(true); + PInputEvent event = buildTestEvent(); + assertAcceptsEvent(event); + assertTrue(event.isHandled()); + } + + public void testRejectAllClickCountsIsHonoured() { + filter.rejectAllClickCounts(); + assertRejectsEvent(buildTestEvent(0, 0)); + assertRejectsEvent(buildTestEvent(0, 1)); + assertRejectsEvent(buildTestEvent(0, 2)); + assertRejectsEvent(buildTestEvent(0, 3)); + + } + + private void assertRejectsEvent(PInputEvent event) { + assertFalse(filter.acceptsEvent(event, MouseEvent.MOUSE_CLICKED)); + } + + private void assertAcceptsEvent(PInputEvent event) { + assertTrue(filter.acceptsEvent(event, MouseEvent.MOUSE_CLICKED)); + } + + private PInputEvent buildTestEvent() { + return buildTestEvent(0); + } + + private PInputEvent buildTestEvent(int modifiers) { + return buildTestEvent(modifiers, 0); + } + + private PInputEvent buildTestEvent(int modifiers, int clickCount) { + JComponent component = new JPanel(); + PInputManager inputManager = new PInputManager(); + PCamera camera = new PCamera(); + + MouseEvent event = new MouseEvent(component, 1, System.currentTimeMillis(), modifiers, 1, 1, clickCount, false); + return new PInputEvent(inputManager, event, camera); } } --~--~---------~--~----~------------~-------~--~----~ Piccolo2D Developers Group: http://groups.google.com/group/piccolo2d-dev?hl=en -~----------~----~----~----~------~----~------~--~---