package edu.umd.cs.piccolo.tutorial; import java.awt.BasicStroke; import java.awt.Color; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.awt.geom.Point2D; import edu.umd.cs.piccolo.*; import edu.umd.cs.piccolo.event.*; import edu.umd.cs.piccolo.nodes.*; import edu.umd.cs.piccolo.util.*; import edu.umd.cs.piccolox.*; public class UserInteraction extends PFrame { public UserInteraction() { super(); } public void initialize() { // Create a Camera Event Listener. // Remove the pan event handler that is installed by default so that it // does not conflict with our new squiggle handler. getCanvas().setPanEventHandler(null); // Create a squiggle handler and register it with the Canvas. PBasicInputEventHandler squiggleHandler = new SquiggleHandler(getCanvas()); getCanvas().addInputEventListener(squiggleHandler); // Create a Node Event Listener. // Create a green rectangle node. PNode nodeGreen = PPath.createRectangle(0, 0, 100, 100); nodeGreen.setPaint(Color.GREEN); getCanvas().getLayer().addChild(nodeGreen); // Attach event handler directly to the node. nodeGreen.addInputEventListener(new PBasicInputEventHandler() { public void mousePressed(PInputEvent event) { event.getPickedNode().setPaint(Color.ORANGE); event.getInputManager().setKeyboardFocus(event.getPath()); event.setHandled(true); } public void mouseDragged(PInputEvent event) { PNode aNode = event.getPickedNode(); PDimension delta = event.getDeltaRelativeTo(aNode); aNode.translate(delta.width, delta.height); event.setHandled(true); } public void mouseReleased(PInputEvent event) { event.getPickedNode().setPaint(Color.GREEN); event.setHandled(true); } public void keyPressed(PInputEvent event) { PNode node = event.getPickedNode(); switch (event.getKeyCode()) { case KeyEvent.VK_UP: node.translate(0, -10f); break; case KeyEvent.VK_DOWN: node.translate(0, 10f); break; case KeyEvent.VK_LEFT: node.translate(-10f, 0); break; case KeyEvent.VK_RIGHT: node.translate(10f, 0); break; } } }); } public class SquiggleHandler extends PDragSequenceEventHandler { protected PCanvas canvas; // The squiggle that is currently getting created. protected PPath squiggle; public SquiggleHandler(PCanvas aCanvas) { canvas = aCanvas; setEventFilter(new PInputEventFilter(InputEvent.BUTTON1_MASK)); } public void startDrag(PInputEvent e) { super.startDrag(e); Point2D p = e.getPosition(); // Create a new squiggle and add it to the canvas. squiggle = new PPath(); squiggle.moveTo((float) p.getX(), (float) p.getY()); squiggle.setStroke(new BasicStroke((float) (1 / e.getCamera().getViewScale()))); canvas.getLayer().addChild(squiggle); // Reset the keydboard focus. e.getInputManager().setKeyboardFocus(null); } public void drag(PInputEvent e) { super.drag(e); // Update the squiggle while dragging. updateSquiggle(e); } public void endDrag(PInputEvent e) { super.endDrag(e); // Update the squiggle one last time. updateSquiggle(e); squiggle = null; } public void updateSquiggle(PInputEvent aEvent) { // Add a new segment to the squiggle from the last mouse position // to the current mouse position. Point2D p = aEvent.getPosition(); squiggle.lineTo((float) p.getX(), (float) p.getY()); } } public static void main(String[] args) { new UserInteraction(); } }