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
-~----------~----~----~----~------~----~------~--~---