Revision: 1161
Author: atdixon
Date: Sat Jan 7 11:42:05 2012
Log: Issue 235 - PSwingEventHandler now uses Point2D.Double in call to
cameraToLocal to avoid under/overflow
http://code.google.com/p/piccolo2d/source/detail?r=1161
Added:
/piccolo2d.java/trunk/examples/src/main/java/org/piccolo2d/examples/PSwingScaleExample.java
Modified:
/piccolo2d.java/trunk/extras/src/main/java/org/piccolo2d/extras/pswing/PSwingEventHandler.java
===
--- /dev/null
+++
/piccolo2d.java/trunk/examples/src/main/java/org/piccolo2d/examples/PSwingScaleExample.java
Sat Jan 7 11:42:05 2012
@@ -0,0 +1,61 @@
+package org.piccolo2d.examples;
+
+import org.piccolo2d.PCamera;
+import org.piccolo2d.PLayer;
+import org.piccolo2d.PNode;
+import org.piccolo2d.extras.PFrame;
+import org.piccolo2d.extras.pswing.PSwing;
+import org.piccolo2d.extras.pswing.PSwingCanvas;
+import org.piccolo2d.util.PBounds;
+
+import javax.swing.JButton;
+import javax.swing.JOptionPane;
+import java.awt.Color;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+/**
+ * Demonstrate that PSwing nodes properly receive events even when they
are parented by nodes
+ * with extreme scales. This is an effective regression test that
previously failed before fix
+ * applied to {@link org.piccolo2d.extras.pswing.PSwingEventHandler}.
+ */
+public class PSwingScaleExample extends PFrame {
+
+public static void main(String[] args) {
+new PSwingScaleExample();
+}
+
+public PSwingScaleExample() {
+super(PSwingScaleExample.class.getSimpleName(), false, new
PSwingCanvas());
+}
+
+public void initialize() {
+final PSwingCanvas canvas = (PSwingCanvas) getCanvas();
+final PLayer layer = canvas.getLayer();
+final PCamera camera = canvas.getCamera();
+
+PNode parent = new PNode();
+parent.setPaint(Color.orange);
+parent.setBounds(0, 0, 200, 200);
+
+JButton button = new JButton(Drink Me);
+button.addActionListener(new ActionListener() {
+public void actionPerformed(ActionEvent e) {
+
JOptionPane.showMessageDialog(PSwingScaleExample.this, Thank You);
+}
+});
+final PSwing ps = new PSwing(button);
+centerFullBoundsIn(ps, parent.getGlobalFullBounds());
+parent.addChild(ps);
+parent.scale(0.001);
+
+layer.addChild(parent);
+
+camera.animateViewToCenterBounds(ps.getGlobalFullBounds(), true,
0);
+}
+
+private static void centerFullBoundsIn(PNode centerMe, PBounds bounds)
{
+centerMe.centerFullBoundsOnPoint(bounds.getCenterX(),
bounds.getCenterY());
+}
+
+}
===
---
/piccolo2d.java/trunk/extras/src/main/java/org/piccolo2d/extras/pswing/PSwingEventHandler.java
Tue Mar 15 15:23:53 2011
+++
/piccolo2d.java/trunk/extras/src/main/java/org/piccolo2d/extras/pswing/PSwingEventHandler.java
Sat Jan 7 11:42:05 2012
@@ -28,6 +28,15 @@
*/
package org.piccolo2d.extras.pswing;
+import org.piccolo2d.PCamera;
+import org.piccolo2d.PLayer;
+import org.piccolo2d.PNode;
+import org.piccolo2d.event.PInputEvent;
+import org.piccolo2d.event.PInputEventListener;
+import org.piccolo2d.util.PAffineTransform;
+import org.piccolo2d.util.PAffineTransformException;
+
+import javax.swing.SwingUtilities;
import java.awt.Component;
import java.awt.Container;
import java.awt.Point;
@@ -38,16 +47,6 @@
import java.awt.geom.NoninvertibleTransformException;
import java.awt.geom.Point2D;
-import javax.swing.SwingUtilities;
-
-import org.piccolo2d.PCamera;
-import org.piccolo2d.PLayer;
-import org.piccolo2d.PNode;
-import org.piccolo2d.event.PInputEvent;
-import org.piccolo2d.event.PInputEventListener;
-import org.piccolo2d.util.PAffineTransform;
-import org.piccolo2d.util.PAffineTransformException;
-
/**
* Event handler to send MousePressed, MouseReleased, MouseMoved,
MouseClicked,
@@ -209,9 +208,12 @@
final PSwing swing = (PSwing) currentNode;
final PNode grabNode = pickedNode;
-point = new Point(mEvent.getX(), mEvent.getY());
-cameraToLocal(pSwingMouseEvent.getPath().getTopCamera(),
point, grabNode);
-prevPoint = (Point) point.clone();
+// use a floating point object to perform cameraToLocal to
survive the transform math
+final Point2D.Double p2d = new Point2D.Double(mEvent.getX(),
mEvent.getY());
+cameraToLocal(pSwingMouseEvent.getPath().getTopCamera(), p2d,
grabNode);
+
+point = new Point((int) p2d.getX(), (int) p2d.getY());
+prevPoint = (Point2D) p2d.clone();
// This is only partially fixed to find the deepest
// component at pt. It needs to do something like
--
Piccolo2D Developers Group: http://groups.google.com/group/piccolo2d-dev?hl=en