diff --git a/extras/src/main/java/edu/umd/cs/piccolox/util/PLocator.java b/extras/src/main/java/edu/umd/cs/piccolox/util/PLocator.java index 6f3f2e0..ba355ab 100644 --- a/extras/src/main/java/edu/umd/cs/piccolox/util/PLocator.java +++ b/extras/src/main/java/edu/umd/cs/piccolox/util/PLocator.java @@ -55,16 +55,16 @@ * in dstPoints. Should dstPoints be null, it will create a new point and * return it. * - * @param aDstPoint output parameter to store the located point + * @param dstPoint output parameter to store the located point * @return the located point */ - public Point2D locatePoint(final Point2D aDstPoint) { + public Point2D locatePoint(final Point2D dstPoint) { Point2D result; - if (aDstPoint == null) { + if (dstPoint == null) { result = new Point2D.Double(); } else { - result = aDstPoint; + result = dstPoint; } result.setLocation(locateX(), locateY()); return result; diff --git a/swt/src/main/java/edu/umd/cs/piccolox/swt/PSWTCanvas.java b/swt/src/main/java/edu/umd/cs/piccolox/swt/PSWTCanvas.java index ec3a22a..41cca06 100644 --- a/swt/src/main/java/edu/umd/cs/piccolox/swt/PSWTCanvas.java +++ b/swt/src/main/java/edu/umd/cs/piccolox/swt/PSWTCanvas.java @@ -62,22 +62,24 @@ import edu.umd.cs.piccolo.util.PStack; /** - * PSWTCanvas is a simple Swing component that can be used to embed Piccolo - * into a Java Swing application. Canvas's view the Piccolo scene graph through - * a camera. The canvas manages screen updates coming from this camera, and - * forwards swing mouse and keyboard events to the camera. + * PSWTCanvas is a simple Swing component that can be used to embed + * Piccolo into a Java Swing application. Canvas's view the Piccolo scene graph + * through a camera. The canvas manages screen updates coming from this camera, + * and forwards swing mouse and keyboard events to the camera. *
*
* @version 1.0
* @author Jesse Grosjean
*/
public class PSWTCanvas extends Composite implements PComponent {
-
+ /**
+ * Terrible Singleton instance of the PSWTCanvas. Falsely assumes you will
+ * only have one of these per application.
+ */
public static PSWTCanvas CURRENT_CANVAS = null;
private Image backBuffer;
private boolean doubleBuffered = true;
-
private PCamera camera;
private final PStack cursorStack;
private Cursor curCursor;
@@ -90,10 +92,17 @@
private boolean paintingImmediately;
private boolean animatingOnLastPaint;
+ private boolean isButton1Pressed;
+ private boolean isButton2Pressed;
+ private boolean isButton3Pressed;
+
/**
* Construct a canvas with the basic scene graph consisting of a root,
* camera, and layer. Event handlers for zooming and panning are
* automatically installed.
+ *
+ * @param parent component onto which the canvas is installed
+ * @param style component style for the PSWTCanvas
*/
public PSWTCanvas(final Composite parent, final int style) {
super(parent, style | SWT.NO_BACKGROUND | SWT.NO_REDRAW_RESIZE);
@@ -110,15 +119,19 @@
addInputEventListener(panEventHandler);
addInputEventListener(zoomEventHandler);
- // Add a paint listener to call paint
+ installPaintListener();
+ installDisposeListener();
+ }
+
+ private void installPaintListener() {
addPaintListener(new PaintListener() {
public void paintControl(final PaintEvent pe) {
paintComponent(pe.gc, pe.x, pe.y, pe.width, pe.height);
}
});
+ }
- // Keep track of the references so we can dispose of the Fonts and
- // Colors
+ private void installDisposeListener() {
SWTGraphics2D.incrementGCCount();
addDisposeListener(new DisposeListener() {
public void widgetDisposed(final DisposeEvent de) {
@@ -129,13 +142,15 @@
}
// ****************************************************************
- // Basic - Methods for accessing common piccolo nodes.
+ // Basic - Methods for accessing common Piccolo2D nodes.
// ****************************************************************
/**
* Get the pan event handler associated with this canvas. This event handler
* is set up to get events from the camera associated with this canvas by
* default.
+ *
+ * @return the current pan event handler, which may be null
*/
public PPanEventHandler getPanEventHandler() {
return panEventHandler;
@@ -260,19 +275,22 @@
}
/**
- * Get whether this canvas should use double buffering - the default is no
- * double buffering
+ * Get whether this canvas should use double buffering - the default is to
+ * double buffer.
+ *
+ * @return true if double buffering is enabled
*/
public boolean getDoubleBuffered() {
return doubleBuffered;
}
/**
- * Set whether this canvas should use double buffering - the default is no
- * double buffering
+ * Set whether this canvas should use double buffering - the default is yes.
+ *
+ * @param doubleBuffered value of double buffering flas
*/
- public void setDoubleBuffered(final boolean dBuffered) {
- doubleBuffered = dBuffered;
+ public void setDoubleBuffered(final boolean doubleBuffered) {
+ this.doubleBuffered = doubleBuffered;
}
/**
@@ -315,56 +333,59 @@
/**
* Set the canvas cursor, and remember the previous cursor on the cursor
- * stack.
+ * stack. Under the hood it is mapping the java.awt.Cursor to
+ * org.eclipse.swt.graphics.Cursor objects.
+ *
+ * @param newCursor new cursor to push onto the cursor stack
*/
- public void pushCursor(final java.awt.Cursor cursor) {
- Cursor aCursor = null;
- if (cursor.getType() == java.awt.Cursor.N_RESIZE_CURSOR) {
- aCursor = new Cursor(getDisplay(), SWT.CURSOR_SIZEN);
+ public void pushCursor(final java.awt.Cursor newCursor) {
+ Cursor swtCursor = null;
+ if (newCursor.getType() == java.awt.Cursor.N_RESIZE_CURSOR) {
+ swtCursor = new Cursor(getDisplay(), SWT.CURSOR_SIZEN);
}
- else if (cursor.getType() == java.awt.Cursor.NE_RESIZE_CURSOR) {
- aCursor = new Cursor(getDisplay(), SWT.CURSOR_SIZENE);
+ else if (newCursor.getType() == java.awt.Cursor.NE_RESIZE_CURSOR) {
+ swtCursor = new Cursor(getDisplay(), SWT.CURSOR_SIZENE);
}
- else if (cursor.getType() == java.awt.Cursor.NW_RESIZE_CURSOR) {
- aCursor = new Cursor(getDisplay(), SWT.CURSOR_SIZENW);
+ else if (newCursor.getType() == java.awt.Cursor.NW_RESIZE_CURSOR) {
+ swtCursor = new Cursor(getDisplay(), SWT.CURSOR_SIZENW);
}
- else if (cursor.getType() == java.awt.Cursor.S_RESIZE_CURSOR) {
- aCursor = new Cursor(getDisplay(), SWT.CURSOR_SIZES);
+ else if (newCursor.getType() == java.awt.Cursor.S_RESIZE_CURSOR) {
+ swtCursor = new Cursor(getDisplay(), SWT.CURSOR_SIZES);
}
- else if (cursor.getType() == java.awt.Cursor.SE_RESIZE_CURSOR) {
- aCursor = new Cursor(getDisplay(), SWT.CURSOR_SIZESE);
+ else if (newCursor.getType() == java.awt.Cursor.SE_RESIZE_CURSOR) {
+ swtCursor = new Cursor(getDisplay(), SWT.CURSOR_SIZESE);
}
- else if (cursor.getType() == java.awt.Cursor.SW_RESIZE_CURSOR) {
- aCursor = new Cursor(getDisplay(), SWT.CURSOR_SIZESW);
+ else if (newCursor.getType() == java.awt.Cursor.SW_RESIZE_CURSOR) {
+ swtCursor = new Cursor(getDisplay(), SWT.CURSOR_SIZESW);
}
- else if (cursor.getType() == java.awt.Cursor.E_RESIZE_CURSOR) {
- aCursor = new Cursor(getDisplay(), SWT.CURSOR_SIZEE);
+ else if (newCursor.getType() == java.awt.Cursor.E_RESIZE_CURSOR) {
+ swtCursor = new Cursor(getDisplay(), SWT.CURSOR_SIZEE);
}
- else if (cursor.getType() == java.awt.Cursor.W_RESIZE_CURSOR) {
- aCursor = new Cursor(getDisplay(), SWT.CURSOR_SIZEW);
+ else if (newCursor.getType() == java.awt.Cursor.W_RESIZE_CURSOR) {
+ swtCursor = new Cursor(getDisplay(), SWT.CURSOR_SIZEW);
}
- else if (cursor.getType() == java.awt.Cursor.TEXT_CURSOR) {
- aCursor = new Cursor(getDisplay(), SWT.CURSOR_IBEAM);
+ else if (newCursor.getType() == java.awt.Cursor.TEXT_CURSOR) {
+ swtCursor = new Cursor(getDisplay(), SWT.CURSOR_IBEAM);
}
- else if (cursor.getType() == java.awt.Cursor.HAND_CURSOR) {
- aCursor = new Cursor(getDisplay(), SWT.CURSOR_HAND);
+ else if (newCursor.getType() == java.awt.Cursor.HAND_CURSOR) {
+ swtCursor = new Cursor(getDisplay(), SWT.CURSOR_HAND);
}
- else if (cursor.getType() == java.awt.Cursor.MOVE_CURSOR) {
- aCursor = new Cursor(getDisplay(), SWT.CURSOR_SIZEALL);
+ else if (newCursor.getType() == java.awt.Cursor.MOVE_CURSOR) {
+ swtCursor = new Cursor(getDisplay(), SWT.CURSOR_SIZEALL);
}
- else if (cursor.getType() == java.awt.Cursor.CROSSHAIR_CURSOR) {
- aCursor = new Cursor(getDisplay(), SWT.CURSOR_CROSS);
+ else if (newCursor.getType() == java.awt.Cursor.CROSSHAIR_CURSOR) {
+ swtCursor = new Cursor(getDisplay(), SWT.CURSOR_CROSS);
}
- else if (cursor.getType() == java.awt.Cursor.WAIT_CURSOR) {
- aCursor = new Cursor(getDisplay(), SWT.CURSOR_WAIT);
+ else if (newCursor.getType() == java.awt.Cursor.WAIT_CURSOR) {
+ swtCursor = new Cursor(getDisplay(), SWT.CURSOR_WAIT);
}
- if (aCursor != null) {
+ if (swtCursor != null) {
if (curCursor != null) {
cursorStack.push(curCursor);
}
- curCursor = aCursor;
- setCursor(aCursor);
+ curCursor = swtCursor;
+ setCursor(swtCursor);
}
}
@@ -377,11 +398,11 @@
curCursor.dispose();
}
- if (!cursorStack.isEmpty()) {
- curCursor = (Cursor) cursorStack.pop();
+ if (cursorStack.isEmpty()) {
+ curCursor = null;
}
else {
- curCursor = null;
+ curCursor = (Cursor) cursorStack.pop();
}
// This sets the cursor back to default
@@ -392,148 +413,64 @@
// Code to manage connection to Swing. There appears to be a bug in
// swing where it will occasionally send to many mouse pressed or mouse
// released events. Below we attempt to filter out those cases before
- // they get delivered to the Piccolo framework.
+ // they get delivered to the Piccolo2D framework.
// ****************************************************************
- private boolean isButton1Pressed;
- private boolean isButton2Pressed;
- private boolean isButton3Pressed;
-
/**
* This method installs mouse and key listeners on the canvas that forward
- * those events to piccolo.
+ * those events to Piccolo2D.
*/
protected void installInputSources() {
- addMouseListener(new MouseListener() {
- public void mouseDown(final MouseEvent me) {
- boolean shouldBalanceEvent = false;
+ MouseInputSource mouseInputSource = new MouseInputSource();
+ addMouseListener(mouseInputSource);
+ addMouseMoveListener(mouseInputSource);
- switch (me.button) {
- case 1:
- if (isButton1Pressed) {
- shouldBalanceEvent = true;
- }
- isButton1Pressed = true;
- break;
- case 2:
- if (isButton2Pressed) {
- shouldBalanceEvent = true;
- }
- isButton2Pressed = true;
- break;
- case 3:
- if (isButton3Pressed) {
- shouldBalanceEvent = true;
- }
- isButton3Pressed = true;
- break;
- }
-
- if (shouldBalanceEvent) {
- final java.awt.event.MouseEvent balanceEvent = new PSWTMouseEvent(me,
- java.awt.event.MouseEvent.MOUSE_RELEASED, 1);
- sendInputEventToInputManager(balanceEvent, java.awt.event.MouseEvent.MOUSE_RELEASED);
- }
-
- final java.awt.event.MouseEvent balanceEvent = new PSWTMouseEvent(me,
- java.awt.event.MouseEvent.MOUSE_PRESSED, 1);
- sendInputEventToInputManager(balanceEvent, java.awt.event.MouseEvent.MOUSE_PRESSED);
- }
-
- public void mouseUp(final MouseEvent me) {
- boolean shouldBalanceEvent = false;
-
- switch (me.button) {
- case 1:
- if (!isButton1Pressed) {
- shouldBalanceEvent = true;
- }
- isButton1Pressed = false;
- break;
- case 2:
- if (!isButton2Pressed) {
- shouldBalanceEvent = true;
- }
- isButton2Pressed = false;
- break;
- case 3:
- if (!isButton3Pressed) {
- shouldBalanceEvent = true;
- }
- isButton3Pressed = false;
- break;
- }
-
- if (shouldBalanceEvent) {
- final java.awt.event.MouseEvent balanceEvent = new PSWTMouseEvent(me,
- java.awt.event.MouseEvent.MOUSE_PRESSED, 1);
- sendInputEventToInputManager(balanceEvent, java.awt.event.MouseEvent.MOUSE_PRESSED);
- }
-
- final java.awt.event.MouseEvent balanceEvent = new PSWTMouseEvent(me,
- java.awt.event.MouseEvent.MOUSE_RELEASED, 1);
- sendInputEventToInputManager(balanceEvent, java.awt.event.MouseEvent.MOUSE_RELEASED);
- }
-
- public void mouseDoubleClick(final MouseEvent me) {
- // This doesn't work with click event types for some reason - it
- // has to do with how the click and release events are ordered,
- // I think
- java.awt.event.MouseEvent inputEvent = new PSWTMouseEvent(me, java.awt.event.MouseEvent.MOUSE_PRESSED,
- 2);
- sendInputEventToInputManager(inputEvent, java.awt.event.MouseEvent.MOUSE_PRESSED);
- inputEvent = new PSWTMouseEvent(me, java.awt.event.MouseEvent.MOUSE_RELEASED, 2);
- sendInputEventToInputManager(inputEvent, java.awt.event.MouseEvent.MOUSE_RELEASED);
- }
- });
-
- addMouseMoveListener(new MouseMoveListener() {
- public void mouseMove(final MouseEvent me) {
- if (isButton1Pressed || isButton2Pressed || isButton3Pressed) {
- final java.awt.event.MouseEvent inputEvent = new PSWTMouseEvent(me,
- java.awt.event.MouseEvent.MOUSE_DRAGGED, 1);
- sendInputEventToInputManager(inputEvent, java.awt.event.MouseEvent.MOUSE_DRAGGED);
- }
- else {
- final java.awt.event.MouseEvent inputEvent = new PSWTMouseEvent(me,
- java.awt.event.MouseEvent.MOUSE_MOVED, 1);
- sendInputEventToInputManager(inputEvent, java.awt.event.MouseEvent.MOUSE_MOVED);
- }
- }
- });
-
- addKeyListener(new KeyListener() {
- public void keyPressed(final KeyEvent ke) {
- final java.awt.event.KeyEvent inputEvent = new PSWTKeyEvent(ke, java.awt.event.KeyEvent.KEY_PRESSED);
- sendInputEventToInputManager(inputEvent, java.awt.event.KeyEvent.KEY_PRESSED);
- }
-
- public void keyReleased(final KeyEvent ke) {
- final java.awt.event.KeyEvent inputEvent = new PSWTKeyEvent(ke, java.awt.event.KeyEvent.KEY_RELEASED);
- sendInputEventToInputManager(inputEvent, java.awt.event.KeyEvent.KEY_RELEASED);
- }
- });
-
+ addKeyListener(new KeyboardInputSource());
}
- protected void sendInputEventToInputManager(final InputEvent e, final int type) {
- getRoot().getDefaultInputManager().processEventFromCamera(e, type, getCamera());
+ /**
+ * Dispatches the given event to the default input manager for the root of
+ * this canvas.
+ *
+ * @param awtEvent awt event needing dispatching
+ * @param type type of the event
+ */
+ protected void sendInputEventToInputManager(final InputEvent awtEvent, final int type) {
+ getRoot().getDefaultInputManager().processEventFromCamera(awtEvent, type, getCamera());
}
- public void setBounds(final int x, final int y, final int w, final int h) {
- camera.setBounds(camera.getX(), camera.getY(), w, h);
+ /**
+ * Changes the bounds of this PSWTCanvas. Updating the camera and the double
+ * buffered image appropriately.
+ *
+ * @param x left of the new bounds
+ * @param y top of the new bounds
+ * @param newWidth new width of the bounds
+ * @param newHeight new height of the bounds
+ */
+ public void setBounds(final int x, final int y, final int newWidth, final int newHeight) {
+ camera.setBounds(camera.getX(), camera.getY(), newWidth, newHeight);
- if (backBuffer == null || backBuffer.getBounds().width < w || backBuffer.getBounds().height < h) {
- backBuffer = new Image(getDisplay(), w, h);
+ if (backBuffer == null || backBuffer.getBounds().width < newWidth || backBuffer.getBounds().height < newHeight) {
+ backBuffer = new Image(getDisplay(), newWidth, newHeight);
}
- super.setBounds(x, y, w, h);
+ super.setBounds(x, y, newWidth, newHeight);
}
+ /**
+ * Exists to dispatch from the Swing's repaint method to SWT's redraw
+ * method.
+ */
public void repaint() {
super.redraw();
}
+ /**
+ * Flags the bounds provided as needing to be redrawn.
+ *
+ * @param bounds the bounds that should be repainted
+ */
public void repaint(final PBounds bounds) {
bounds.expandNearestIntegerDimensions();
bounds.inset(-1, -1);
@@ -583,13 +520,13 @@
paintContext.setRenderQuality(defaultRenderQuality);
}
- // paint piccolo
+ // paint Piccolo2D
camera.fullPaint(paintContext);
// if switched state from animating to not animating invalidate
// the entire screen so that it will be drawn with the default instead
// of animating render quality.
- if (!getAnimating() && animatingOnLastPaint) {
+ if (animatingOnLastPaint && !getAnimating()) {
repaint();
}
animatingOnLastPaint = getAnimating();
@@ -617,4 +554,111 @@
update();
paintingImmediately = false;
}
+
+ private final class KeyboardInputSource implements KeyListener {
+ public void keyPressed(final KeyEvent ke) {
+ final java.awt.event.KeyEvent inputEvent = new PSWTKeyEvent(ke, java.awt.event.KeyEvent.KEY_PRESSED);
+ sendInputEventToInputManager(inputEvent, java.awt.event.KeyEvent.KEY_PRESSED);
+ }
+
+ public void keyReleased(final KeyEvent ke) {
+ final java.awt.event.KeyEvent inputEvent = new PSWTKeyEvent(ke, java.awt.event.KeyEvent.KEY_RELEASED);
+ sendInputEventToInputManager(inputEvent, java.awt.event.KeyEvent.KEY_RELEASED);
+ }
+ }
+
+ private final class MouseInputSource implements MouseListener, MouseMoveListener {
+ public void mouseMove(final MouseEvent me) {
+ if (isButton1Pressed || isButton2Pressed || isButton3Pressed) {
+ final java.awt.event.MouseEvent inputEvent = new PSWTMouseEvent(me,
+ java.awt.event.MouseEvent.MOUSE_DRAGGED, 1);
+ sendInputEventToInputManager(inputEvent, java.awt.event.MouseEvent.MOUSE_DRAGGED);
+ }
+ else {
+ final java.awt.event.MouseEvent inputEvent = new PSWTMouseEvent(me,
+ java.awt.event.MouseEvent.MOUSE_MOVED, 1);
+ sendInputEventToInputManager(inputEvent, java.awt.event.MouseEvent.MOUSE_MOVED);
+ }
+ }
+
+ public void mouseDown(final MouseEvent mouseEvent) {
+ boolean shouldBalanceEvent = false;
+
+ switch (mouseEvent.button) {
+ case 1:
+ if (isButton1Pressed) {
+ shouldBalanceEvent = true;
+ }
+ isButton1Pressed = true;
+ break;
+ case 2:
+ if (isButton2Pressed) {
+ shouldBalanceEvent = true;
+ }
+ isButton2Pressed = true;
+ break;
+ case 3:
+ if (isButton3Pressed) {
+ shouldBalanceEvent = true;
+ }
+ isButton3Pressed = true;
+ break;
+ }
+
+ if (shouldBalanceEvent) {
+ final java.awt.event.MouseEvent balanceEvent = new PSWTMouseEvent(mouseEvent,
+ java.awt.event.MouseEvent.MOUSE_RELEASED, 1);
+ sendInputEventToInputManager(balanceEvent, java.awt.event.MouseEvent.MOUSE_RELEASED);
+ }
+
+ final java.awt.event.MouseEvent balanceEvent = new PSWTMouseEvent(mouseEvent,
+ java.awt.event.MouseEvent.MOUSE_PRESSED, 1);
+ sendInputEventToInputManager(balanceEvent, java.awt.event.MouseEvent.MOUSE_PRESSED);
+ }
+
+ public void mouseUp(final MouseEvent me) {
+ boolean shouldBalanceEvent = false;
+
+ switch (me.button) {
+ case 1:
+ if (!isButton1Pressed) {
+ shouldBalanceEvent = true;
+ }
+ isButton1Pressed = false;
+ break;
+ case 2:
+ if (!isButton2Pressed) {
+ shouldBalanceEvent = true;
+ }
+ isButton2Pressed = false;
+ break;
+ case 3:
+ if (!isButton3Pressed) {
+ shouldBalanceEvent = true;
+ }
+ isButton3Pressed = false;
+ break;
+ }
+
+ if (shouldBalanceEvent) {
+ final java.awt.event.MouseEvent balanceEvent = new PSWTMouseEvent(me,
+ java.awt.event.MouseEvent.MOUSE_PRESSED, 1);
+ sendInputEventToInputManager(balanceEvent, java.awt.event.MouseEvent.MOUSE_PRESSED);
+ }
+
+ final java.awt.event.MouseEvent balanceEvent = new PSWTMouseEvent(me,
+ java.awt.event.MouseEvent.MOUSE_RELEASED, 1);
+ sendInputEventToInputManager(balanceEvent, java.awt.event.MouseEvent.MOUSE_RELEASED);
+ }
+
+ public void mouseDoubleClick(final MouseEvent me) {
+ // This doesn't work with click event types for some reason - it
+ // has to do with how the click and release events are ordered,
+ // I think
+ java.awt.event.MouseEvent inputEvent = new PSWTMouseEvent(me, java.awt.event.MouseEvent.MOUSE_PRESSED, 2);
+ sendInputEventToInputManager(inputEvent, java.awt.event.MouseEvent.MOUSE_PRESSED);
+ inputEvent = new PSWTMouseEvent(me, java.awt.event.MouseEvent.MOUSE_RELEASED, 2);
+ sendInputEventToInputManager(inputEvent, java.awt.event.MouseEvent.MOUSE_RELEASED);
+ }
+ }
}
diff --git a/swt/src/test/java/edu/umd/cs/piccolox/swt/PSWTBoundsHandleTest.java b/swt/src/test/java/edu/umd/cs/piccolox/swt/PSWTBoundsHandleTest.java
new file mode 100644
index 0000000..1c56827
--- /dev/null
+++ b/swt/src/test/java/edu/umd/cs/piccolox/swt/PSWTBoundsHandleTest.java
@@ -0,0 +1,76 @@
+package edu.umd.cs.piccolox.swt;
+
+import edu.umd.cs.piccolo.PCamera;
+import edu.umd.cs.piccolo.PNode;
+import edu.umd.cs.piccolo.event.PInputEventListener;
+import edu.umd.cs.piccolox.util.PBoundsLocator;
+
+public class PSWTBoundsHandleTest extends SWTTest {
+ private PNode node;
+
+ public void setUp() {
+ if (hasHead()) {
+ node = new PNode();
+ node.setBounds(0, 0, 100, 100);
+ }
+ }
+
+ public void testAddBoundsHandlesToNodeAddsHandles() {
+ if (hasHead()) {
+ PSWTBoundsHandle.addBoundsHandlesTo(node);
+ assertEquals(8, node.getChildrenCount());
+
+ for (int i=0; i<8; i++) {
+ PNode child = node.getChild(i);
+ assertTrue(child instanceof PSWTBoundsHandle);
+ }
+ }
+ }
+
+ public void testAddStickyBoundsHandlesToNodeAddsHandles() {
+ if (hasHead()) {
+ PCamera camera = new PCamera();
+ PSWTBoundsHandle.addStickyBoundsHandlesTo(node, camera);
+ assertEquals(0, node.getChildrenCount());
+ assertEquals(8, camera.getChildrenCount());
+
+ for (int i=0; i<8; i++) {
+ PNode child = camera.getChild(i);
+ assertTrue(child instanceof PSWTBoundsHandle);
+ }
+ }
+ }
+
+ public void testRemoveBoundsHandlesRemovesOnlyHandles() {
+ if (hasHead()) {
+ PNode child = new PNode();
+ node.addChild(child);
+ PSWTBoundsHandle.addBoundsHandlesTo(node);
+ PSWTBoundsHandle.removeBoundsHandlesFrom(node);
+ assertEquals(1, node.getChildrenCount());
+ assertEquals(child, node.getChild(0));
+ }
+ }
+
+ public void testRemoveBoundsHandlesDoesNothingWhenNoHandles() {
+ if (hasHead()) {
+ PNode child = new PNode();
+ node.addChild(child);
+ PSWTBoundsHandle.removeBoundsHandlesFrom(node);
+ assertEquals(1, node.getChildrenCount());
+ }
+ }
+
+ public void testCursorHandlerIsInstalledByDefault() {
+ if (hasHead()) {
+ PSWTBoundsHandle handle = new PSWTBoundsHandle(PBoundsLocator.createEastLocator(node));
+ PInputEventListener dragHandler = handle.getHandleDraggerHandler();
+ PInputEventListener cursorHandler = handle.getHandleCursorEventHandler();
+ assertNotNull(cursorHandler);
+ PInputEventListener[] listeners = handle.getInputEventListeners();
+ assertEquals(2, listeners.length);
+ assertTrue(cursorHandler == listeners[0] || cursorHandler == listeners[1]);
+ assertTrue(dragHandler == listeners[0] || dragHandler == listeners[1]);
+ }
+ }
+}
diff --git a/swt/src/test/java/edu/umd/cs/piccolox/swt/PSWTCanvasTest.java b/swt/src/test/java/edu/umd/cs/piccolox/swt/PSWTCanvasTest.java
new file mode 100644
index 0000000..36d20ee
--- /dev/null
+++ b/swt/src/test/java/edu/umd/cs/piccolox/swt/PSWTCanvasTest.java
@@ -0,0 +1,95 @@
+package edu.umd.cs.piccolox.swt;
+
+import org.eclipse.swt.widgets.Display;
+
+import edu.umd.cs.piccolo.event.PInputEventListener;
+import edu.umd.cs.piccolo.event.PPanEventHandler;
+import edu.umd.cs.piccolo.event.PZoomEventHandler;
+
+public class PSWTCanvasTest extends SWTTest {
+ private PSWTCanvas canvas;
+
+ public void setUp() {
+ if (hasHead()) {
+ canvas = buildSimpleCanvas(Display.getDefault());
+ }
+ }
+
+ public void testPanEventListenerIsInstalledByDefault() {
+ if (hasHead()) {
+ PPanEventHandler handler = canvas.getPanEventHandler();
+ assertNotNull(handler);
+
+ int handlerIndex = getHandlerIndex(handler);
+ assertFalse("Pan Event Handler not installed", handlerIndex == -1);
+ }
+ }
+
+ private int getHandlerIndex(PInputEventListener handler) {
+ PInputEventListener[] listeners = canvas.getCamera().getInputEventListeners();
+ int handlerIndex = -1;
+ for (int i=0; i