]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scenegraph.swing/src/org/simantics/scenegraph/swing/ComponentNode.java
Fixed all line endings of the repository
[simantics/platform.git] / bundles / org.simantics.scenegraph.swing / src / org / simantics / scenegraph / swing / ComponentNode.java
index c9cb8bc29addafa88a6c3e3c8f77baa82a3896be..9e75104702d8ddf6fccbd2cffe4ffeb28431467f 100644 (file)
@@ -1,56 +1,56 @@
-/*******************************************************************************\r
- * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
- * in Industry THTH ry.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- *     VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management
+ * in Industry THTH ry.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     VTT Technical Research Centre of Finland - initial API and implementation
+ *******************************************************************************/
 package org.simantics.scenegraph.swing;
 
-import java.awt.AWTEvent;\r
-import java.awt.Color;\r
-import java.awt.Component;\r
-import java.awt.Container;\r
-import java.awt.Cursor;\r
-import java.awt.Font;\r
-import java.awt.Graphics;\r
-import java.awt.Graphics2D;\r
-import java.awt.event.FocusEvent;\r
-import java.awt.event.FocusListener;\r
-import java.awt.event.KeyEvent;\r
-import java.awt.event.KeyListener;\r
-import java.awt.event.MouseEvent;\r
-import java.awt.event.MouseListener;\r
-import java.awt.event.MouseMotionListener;\r
-import java.awt.event.MouseWheelEvent;\r
-import java.awt.geom.AffineTransform;\r
-import java.awt.geom.Point2D;\r
-import java.awt.geom.Rectangle2D;\r
-\r
-import javax.swing.JComponent;\r
-import javax.swing.UIDefaults;\r
-\r
-import org.simantics.scenegraph.g2d.G2DFocusManager;\r
-import org.simantics.scenegraph.g2d.G2DNode;\r
-import org.simantics.scenegraph.g2d.G2DParentNode;\r
-import org.simantics.scenegraph.g2d.IG2DNode;\r
-import org.simantics.scenegraph.g2d.events.ISGMouseEvent;\r
-import org.simantics.scenegraph.g2d.events.SGMouseEvent;\r
-import org.simantics.scenegraph.g2d.events.SGMouseWheelEvent;\r
-import org.simantics.scenegraph.utils.DummyComponent;\r
-import org.simantics.scenegraph.utils.NodeUtil;\r
+import java.awt.AWTEvent;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Cursor;
+import java.awt.Font;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.MouseMotionListener;
+import java.awt.event.MouseWheelEvent;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.Point2D;
+import java.awt.geom.Rectangle2D;
+
+import javax.swing.JComponent;
+import javax.swing.UIDefaults;
+
+import org.simantics.scenegraph.g2d.G2DFocusManager;
+import org.simantics.scenegraph.g2d.G2DNode;
+import org.simantics.scenegraph.g2d.G2DParentNode;
+import org.simantics.scenegraph.g2d.IG2DNode;
+import org.simantics.scenegraph.g2d.events.ISGMouseEvent;
+import org.simantics.scenegraph.g2d.events.SGMouseEvent;
+import org.simantics.scenegraph.g2d.events.SGMouseWheelEvent;
+import org.simantics.scenegraph.utils.DummyComponent;
+import org.simantics.scenegraph.utils.NodeUtil;
 
 public class ComponentNode<T extends JComponent> extends G2DNode implements MouseListener, MouseMotionListener, KeyListener, FocusListener {
 
     private static final long serialVersionUID = 3161843367263793336L;
-    protected ComponentContainer container = new ComponentContainer();\r
+    protected ComponentContainer container = new ComponentContainer();
     
-       protected Rectangle2D bounds = null;\r
-       protected boolean focusable = true;\r
+       protected Rectangle2D bounds = null;
+       protected boolean focusable = true;
 
     public class ComponentContainer extends Container {
         /**
@@ -62,22 +62,22 @@ public class ComponentNode<T extends JComponent> extends G2DNode implements Mous
             super();
         }
         protected boolean contains = false;
-\r
-//        @Override\r
-//        public void setSize(int width, int height) {\r
-//             System.err.println("ss " + width + " " + height);\r
-//             super.setSize(width, height);\r
-//        }\r
+
+//        @Override
+//        public void setSize(int width, int height) {
+//             System.err.println("ss " + width + " " + height);
+//             super.setSize(width, height);
+//        }
         
         public void setContains(boolean contains) {
-            this.contains = contains;\r
-        }\r
-//        @Override\r
-//        public void setBounds(int x, int y, int width, int height) {\r
-//             super.setBounds(x, y, width, height);\r
+            this.contains = contains;
+        }
+//        @Override
+//        public void setBounds(int x, int y, int width, int height) {
+//             super.setBounds(x, y, width, height);
 //        }
         @Override
-        public void update(Graphics g) {\r
+        public void update(Graphics g) {
                component.update(g);
         }
         @Override
@@ -87,179 +87,179 @@ public class ComponentNode<T extends JComponent> extends G2DNode implements Mous
         public void paintAll(Graphics g) {
         }
         @Override
-        public void paintComponents(Graphics g) {\r
+        public void paintComponents(Graphics g) {
         }
-        @Override\r
-        public void repaint() {\r
+        @Override
+        public void repaint() {
         }
-        @Override\r
-        public void repaint(long tm) {\r
-        }\r
-        @Override\r
-        public void repaint(int x, int y, int width, int height) {\r
-        }\r
-        @Override\r
-        public void repaint(long tm, int x, int y, int width, int height) {\r
-        }\r
-\r
-        \r
         @Override
-        public boolean contains(int eventX, int eventY) {\r
-               \r
-//                     G2DSceneGraph sg = (G2DSceneGraph)ComponentNode.this.getRootNode();\r
-                       //AWTChassis chassis = (AWTChassis)(sg.getRootPane().getParent());\r
-//                     AffineTransform ct = chassis.getCanvasContext().getDefaultHintContext().getHint(Hints.KEY_CANVAS_TRANSFORM);\r
-//                     if(ct == null) return false;\r
-//                     Point2D canvasPosition = new Point2D.Double(); \r
-//                     try {\r
-//                             ct.inverseTransform(new Point2D.Double(x,y), canvasPosition);\r
-//                     } catch (NoninvertibleTransformException e) {\r
-//                             e.printStackTrace();\r
-//                     }\r
-////                   System.err.println("pane tr=" + canvasPosition + " " + ct + " (" + x + "," + y + ")");\r
-//                     return super.contains((int)canvasPosition.getX() , (int)canvasPosition.getY());\r
-                       \r
-                       \r
-//                     System.err.println("pane tr=" + canvasPosition);\r
-//                     //ElementUtils.controlToElementCoordinate(element, element.get, controlPoint, elementPoint);\r
-//                     boolean contains = super.contains(x, y);\r
-//                     if(contains) {\r
-//                             System.err.println("pane contains!" + x + " " + y);\r
-//                     } else {\r
-//                             System.err.println("pane does not contain!" + x + " " + y);\r
-//                     }\r
-//                     return contains;\r
-                       \r
-                       \r
-//                     int trX = 0;//getAbsoluteX(this, 0);\r
-//                     int trY = 0;//getAbsoluteY(this, 0);\r
-//                     \r
-////                   System.err.println("trX=" + trX + " trY = " + trY);\r
-//                     \r
-////                   AWTChassis chassis = (AWTChassis)base.getParent().getParent();\r
-//                     AffineTransform ct = chassis.getCanvasContext().getDefaultHintContext().getHint(Hints.KEY_CANVAS_TRANSFORM);\r
-//                     if(ct == null) return false;\r
-//\r
-//                     int origX = eventX;\r
-//                     int origY = eventY;\r
-//                     \r
-//                     eventX += trX;\r
-//                     eventX -= ct.getTranslateX();\r
-//                     eventX /= ct.getScaleX();\r
-//                     eventX -= trX;\r
-//                     eventY += trY;\r
-//                     eventY -= ct.getTranslateY();\r
-//                     eventY /= ct.getScaleY();\r
-//                     eventY -= trY;\r
-//\r
-//                     System.err.println("ComponentNode contains? (" + origX + "," + origY + ")=>(" + eventX + "," + eventY + ")");\r
-\r
-//                     return super.contains(eventX, eventY);\r
-               \r
+        public void repaint(long tm) {
+        }
+        @Override
+        public void repaint(int x, int y, int width, int height) {
+        }
+        @Override
+        public void repaint(long tm, int x, int y, int width, int height) {
+        }
+
+        
+        @Override
+        public boolean contains(int eventX, int eventY) {
+               
+//                     G2DSceneGraph sg = (G2DSceneGraph)ComponentNode.this.getRootNode();
+                       //AWTChassis chassis = (AWTChassis)(sg.getRootPane().getParent());
+//                     AffineTransform ct = chassis.getCanvasContext().getDefaultHintContext().getHint(Hints.KEY_CANVAS_TRANSFORM);
+//                     if(ct == null) return false;
+//                     Point2D canvasPosition = new Point2D.Double(); 
+//                     try {
+//                             ct.inverseTransform(new Point2D.Double(x,y), canvasPosition);
+//                     } catch (NoninvertibleTransformException e) {
+//                             e.printStackTrace();
+//                     }
+////                   System.err.println("pane tr=" + canvasPosition + " " + ct + " (" + x + "," + y + ")");
+//                     return super.contains((int)canvasPosition.getX() , (int)canvasPosition.getY());
+                       
+                       
+//                     System.err.println("pane tr=" + canvasPosition);
+//                     //ElementUtils.controlToElementCoordinate(element, element.get, controlPoint, elementPoint);
+//                     boolean contains = super.contains(x, y);
+//                     if(contains) {
+//                             System.err.println("pane contains!" + x + " " + y);
+//                     } else {
+//                             System.err.println("pane does not contain!" + x + " " + y);
+//                     }
+//                     return contains;
+                       
+                       
+//                     int trX = 0;//getAbsoluteX(this, 0);
+//                     int trY = 0;//getAbsoluteY(this, 0);
+//                     
+////                   System.err.println("trX=" + trX + " trY = " + trY);
+//                     
+////                   AWTChassis chassis = (AWTChassis)base.getParent().getParent();
+//                     AffineTransform ct = chassis.getCanvasContext().getDefaultHintContext().getHint(Hints.KEY_CANVAS_TRANSFORM);
+//                     if(ct == null) return false;
+//
+//                     int origX = eventX;
+//                     int origY = eventY;
+//                     
+//                     eventX += trX;
+//                     eventX -= ct.getTranslateX();
+//                     eventX /= ct.getScaleX();
+//                     eventX -= trX;
+//                     eventY += trY;
+//                     eventY -= ct.getTranslateY();
+//                     eventY /= ct.getScaleY();
+//                     eventY -= trY;
+//
+//                     System.err.println("ComponentNode contains? (" + origX + "," + origY + ")=>(" + eventX + "," + eventY + ")");
+
+//                     return super.contains(eventX, eventY);
+               
                return true;
 ////            return contains;
         }
 
         @Override
         public Cursor getCursor() {
-            if(contains == false || component == null || component.isCursorSet() == false) {\r
-               return Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR);\r
-            }\r
+            if(contains == false || component == null || component.isCursorSet() == false) {
+               return Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR);
+            }
             return component.getCursor();
         }
     };
 
     protected T      component  = null;
     protected boolean visible = true;
-    protected boolean scale = false; // If true, component is scaled. If false, component is resized\r
-\r
-    private transient Font componentFont;\r
-    private transient double lastScale = 0;\r
-    \r
-    @PropertySetter("Bounds")\r
-    @SyncField("bounds")\r
-    public void setBounds(Rectangle2D bounds) {\r
-       assert(bounds != null);\r
-       this.bounds = bounds;\r
-       setScaleDirty();\r
-    }\r
-    \r
-    @PropertySetter("Background Color")\r
-    @ClientSide\r
-       public void setBackgroundColor(Color color) {\r
-               if(component != null) {\r
-                       component.setBackground(color);\r
-               }\r
-       }\r
-\r
-    /**\r
-     * If the size, font or any other scalable visual property of the component\r
-     * changes, this method should be invoked to make sure that\r
-     * {@link #render(Graphics2D)} will update the visual properties for the\r
-     * component with proper scaling.\r
-     */\r
-    protected void setScaleDirty() {\r
-        // Triggers resetting of component font and size if necessary before\r
-        // rendering.\r
-        lastScale = 0;\r
-        //System.out.println("scale dirty");\r
-    }\r
-\r
-    protected Font getComponentFont() {\r
-        if (component != null) {\r
-            if (componentFont == null) {\r
-                componentFont = component.getFont();\r
-            }\r
-            return componentFont;\r
-        }\r
-        return null;\r
-    }\r
-\r
-    protected void setComponentFont(Font font) {\r
-        this.componentFont = font;\r
-        setScaleDirty();\r
-        component.setFont(font);\r
-    }\r
-\r
+    protected boolean scale = false; // If true, component is scaled. If false, component is resized
+
+    private transient Font componentFont;
+    private transient double lastScale = 0;
+    
+    @PropertySetter("Bounds")
+    @SyncField("bounds")
+    public void setBounds(Rectangle2D bounds) {
+       assert(bounds != null);
+       this.bounds = bounds;
+       setScaleDirty();
+    }
+    
+    @PropertySetter("Background Color")
+    @ClientSide
+       public void setBackgroundColor(Color color) {
+               if(component != null) {
+                       component.setBackground(color);
+               }
+       }
+
+    /**
+     * If the size, font or any other scalable visual property of the component
+     * changes, this method should be invoked to make sure that
+     * {@link #render(Graphics2D)} will update the visual properties for the
+     * component with proper scaling.
+     */
+    protected void setScaleDirty() {
+        // Triggers resetting of component font and size if necessary before
+        // rendering.
+        lastScale = 0;
+        //System.out.println("scale dirty");
+    }
+
+    protected Font getComponentFont() {
+        if (component != null) {
+            if (componentFont == null) {
+                componentFont = component.getFont();
+            }
+            return componentFont;
+        }
+        return null;
+    }
+
+    protected void setComponentFont(Font font) {
+        this.componentFont = font;
+        setScaleDirty();
+        component.setFont(font);
+    }
+
     @Override
     public void render(Graphics2D g2d) {
         if(!visible || bounds == null) return;
 
         Graphics2D g = (Graphics2D)g2d.create();
-        if (component != null) {\r
-            // see http://java.sun.com/docs/books/tutorial/uiswing/lookandfeel/size.html\r
+        if (component != null) {
+            // see http://java.sun.com/docs/books/tutorial/uiswing/lookandfeel/size.html
             component.putClientProperty("JComponent.sizeVariant", "large");
 
-            double sx = 1;\r
-            double sy = 1;\r
-            if (transform != null) {\r
-                g.transform(transform);\r
-//                sx = g.getTransform().getScaleX();\r
-//                sy = g.getTransform().getScaleY();\r
-//                if(!scale) {\r
-//                     g.scale(1/sx, 1/sy);\r
-//                }\r
-            }\r
-\r
-            // Assumes proportional scaling always.\r
-            if (!scale && lastScale != sx) {\r
-                //System.out.println("NEW SCALE: " + sx + " vs. " + lastScale);\r
-                lastScale = sx;\r
-\r
-                // Handle font scaling\r
-                if (componentFont == null)\r
-                    componentFont = component.getFont();\r
-                if (componentFont != null) {\r
-                    Font newFont = component.getFont().deriveFont(componentFont.getSize2D()*(float)sx);\r
-                    component.setFont(newFont);\r
-                }\r
-\r
-                // Handle component size scaling.\r
-                component.setSize((int)(bounds.getWidth()*sx), (int)(bounds.getHeight()*sy));\r
-            }\r
-            component.setSize((int)(bounds.getWidth()*sx), (int)(bounds.getHeight()*sy));\r
-            g.translate(bounds.getMinX()*sx, bounds.getMinY()*sy);\r
-            component.paint(g);\r
+            double sx = 1;
+            double sy = 1;
+            if (transform != null) {
+                g.transform(transform);
+//                sx = g.getTransform().getScaleX();
+//                sy = g.getTransform().getScaleY();
+//                if(!scale) {
+//                     g.scale(1/sx, 1/sy);
+//                }
+            }
+
+            // Assumes proportional scaling always.
+            if (!scale && lastScale != sx) {
+                //System.out.println("NEW SCALE: " + sx + " vs. " + lastScale);
+                lastScale = sx;
+
+                // Handle font scaling
+                if (componentFont == null)
+                    componentFont = component.getFont();
+                if (componentFont != null) {
+                    Font newFont = component.getFont().deriveFont(componentFont.getSize2D()*(float)sx);
+                    component.setFont(newFont);
+                }
+
+                // Handle component size scaling.
+                component.setSize((int)(bounds.getWidth()*sx), (int)(bounds.getHeight()*sy));
+            }
+            component.setSize((int)(bounds.getWidth()*sx), (int)(bounds.getHeight()*sy));
+            g.translate(bounds.getMinX()*sx, bounds.getMinY()*sy);
+            component.paint(g);
         }
         g.dispose();
     }
@@ -268,271 +268,271 @@ public class ComponentNode<T extends JComponent> extends G2DNode implements Mous
     public void setVisible(boolean value) {
         this.visible = value;
     }
-\r
-    public Component getHeavyweightParent(Component component) {\r
-       if(component.isLightweight()) return getHeavyweightParent(component.getParent());\r
-       else return component;\r
-    }\r
-    \r
+
+    public Component getHeavyweightParent(Component component) {
+       if(component.isLightweight()) return getHeavyweightParent(component.getParent());
+       else return component;
+    }
+    
     // FIXME
-    public void handleEvent(AWTEvent event) {\r
-       if(focusable == false) return; // No event handling if not focusable\r
-       if(bounds == null) return; // AAARGH..\r
+    public void handleEvent(AWTEvent event) {
+       if(focusable == false) return; // No event handling if not focusable
+       if(bounds == null) return; // AAARGH..
        
-        AWTEvent cevent = event;\r
-        double sx = 1.0;\r
-        double sy = 1.0;\r
-        if(event instanceof MouseEvent) {\r
-               if(!scale) {\r
-                   IG2DNode node = (IG2DNode) this.getParent();\r
-                   while(node != null) {\r
-                       sx *= node.getTransform().getScaleX();\r
-                       sy *= node.getTransform().getScaleY();\r
-                       node = (G2DParentNode)node.getParent(); // FIXME: it should be G2DParentNode but you can never be sure\r
-                   }\r
-               }\r
-\r
-            MouseEvent me = (MouseEvent)event;\r
-               // Use double coordinates if available                  \r
-               double mx = me.getX();\r
-               double my = me.getY();\r
-               if(event instanceof ISGMouseEvent) {\r
-                       mx = ((ISGMouseEvent)event).getDoubleX();\r
-                       my = ((ISGMouseEvent)event).getDoubleY();\r
-               }\r
-               AffineTransform i = AffineTransform.getTranslateInstance(-transform.getTranslateX()*sx-getBoundsInLocal().getMinX()*sx, -transform.getTranslateY()*sy-getBoundsInLocal().getMinY()*sy);\r
-            Point2D p = i.transform(new Point2D.Double(sx*mx, sy*my), null);\r
-            cevent = relocateEvent(me, p);\r
-            Rectangle2D tb = new Rectangle2D.Double(transform.getTranslateX()+getBoundsInLocal().getMinX(), transform.getTranslateY()+getBoundsInLocal().getMinY(), getBoundsInLocal().getWidth(), getBoundsInLocal().getHeight());\r
-            \r
-            if(cevent.getID() == MouseEvent.MOUSE_PRESSED || cevent.getID() == MouseWheelEvent.MOUSE_WHEEL) {\r
-                if(tb.contains(me.getPoint())) {\r
-                    G2DFocusManager.INSTANCE.markFocus(component);\r
-                       if(component != null && component.hasFocus() == false) {\r
-                        component.requestFocusInWindow();\r
-                    }\r
-                }\r
-            }\r
-\r
-            if(tb.contains(me.getPoint())) {\r
-                container.setContains(true);\r
-            } else {\r
-                container.setContains(false);\r
-            }\r
-\r
-            if(cevent.getID() == MouseEvent.MOUSE_DRAGGED && component != null && component.hasFocus()) {\r
-                cevent.setSource(component);\r
-            }\r
+        AWTEvent cevent = event;
+        double sx = 1.0;
+        double sy = 1.0;
+        if(event instanceof MouseEvent) {
+               if(!scale) {
+                   IG2DNode node = (IG2DNode) this.getParent();
+                   while(node != null) {
+                       sx *= node.getTransform().getScaleX();
+                       sy *= node.getTransform().getScaleY();
+                       node = (G2DParentNode)node.getParent(); // FIXME: it should be G2DParentNode but you can never be sure
+                   }
+               }
+
+            MouseEvent me = (MouseEvent)event;
+               // Use double coordinates if available                  
+               double mx = me.getX();
+               double my = me.getY();
+               if(event instanceof ISGMouseEvent) {
+                       mx = ((ISGMouseEvent)event).getDoubleX();
+                       my = ((ISGMouseEvent)event).getDoubleY();
+               }
+               AffineTransform i = AffineTransform.getTranslateInstance(-transform.getTranslateX()*sx-getBoundsInLocal().getMinX()*sx, -transform.getTranslateY()*sy-getBoundsInLocal().getMinY()*sy);
+            Point2D p = i.transform(new Point2D.Double(sx*mx, sy*my), null);
+            cevent = relocateEvent(me, p);
+            Rectangle2D tb = new Rectangle2D.Double(transform.getTranslateX()+getBoundsInLocal().getMinX(), transform.getTranslateY()+getBoundsInLocal().getMinY(), getBoundsInLocal().getWidth(), getBoundsInLocal().getHeight());
+            
+            if(cevent.getID() == MouseEvent.MOUSE_PRESSED || cevent.getID() == MouseWheelEvent.MOUSE_WHEEL) {
+                if(tb.contains(me.getPoint())) {
+                    G2DFocusManager.INSTANCE.markFocus(component);
+                       if(component != null && component.hasFocus() == false) {
+                        component.requestFocusInWindow();
+                    }
+                }
+            }
+
+            if(tb.contains(me.getPoint())) {
+                container.setContains(true);
+            } else {
+                container.setContains(false);
+            }
+
+            if(cevent.getID() == MouseEvent.MOUSE_DRAGGED && component != null && component.hasFocus()) {
+                cevent.setSource(component);
+            }
         }
-        if (component != null && container.contains) { //cevent.getSource().equals(component)) {\r
-//             new Lightwe\r
-               cevent.setSource(component);\r
-               \r
-//            container.dispatchEvent(cevent);\r
-               \r
-//             Component hw = getHeavyweightParent(component);\r
-//             hw.dispatchEvent(cevent);\r
-               \r
-//             container.getParent().dispatchEvent(cevent);\r
-//            System.err.println("cevent=" + cevent);\r
-//            // FIXME: terrible kludge to dispatch event correctly to every child\r
-//            for(Component c : component.getComponents()) {\r
-//             AWTEvent xe = translateEvent(cevent, new Point2D.Double(-c.getLocation().getX(), -c.getLocation().getY()));\r
-//             xe.setSource(c);\r
-//                c.dispatchEvent(xe);\r
-//                if(c instanceof JComponent) {\r
-//                     for(Component c2 : ((JComponent)c).getComponents()) {\r
-//                             AWTEvent qe = translateEvent(xe, new Point2D.Double(-c.getLocation().getX(), -c.getLocation().getY()));\r
-//                             qe.setSource(c);\r
-//                             qe.setSource(c2);\r
-//                             c2.dispatchEvent(qe);\r
-//                             System.err.println("qe=" + qe);\r
-//                             System.err.println("xe=" + xe);\r
-//                             System.err.println("cevent=" + cevent);\r
-//                     }\r
-//                }\r
+        if (component != null && container.contains) { //cevent.getSource().equals(component)) {
+//             new Lightwe
+               cevent.setSource(component);
+               
+//            container.dispatchEvent(cevent);
+               
+//             Component hw = getHeavyweightParent(component);
+//             hw.dispatchEvent(cevent);
+               
+//             container.getParent().dispatchEvent(cevent);
+//            System.err.println("cevent=" + cevent);
+//            // FIXME: terrible kludge to dispatch event correctly to every child
+//            for(Component c : component.getComponents()) {
+//             AWTEvent xe = translateEvent(cevent, new Point2D.Double(-c.getLocation().getX(), -c.getLocation().getY()));
+//             xe.setSource(c);
+//                c.dispatchEvent(xe);
+//                if(c instanceof JComponent) {
+//                     for(Component c2 : ((JComponent)c).getComponents()) {
+//                             AWTEvent qe = translateEvent(xe, new Point2D.Double(-c.getLocation().getX(), -c.getLocation().getY()));
+//                             qe.setSource(c);
+//                             qe.setSource(c2);
+//                             c2.dispatchEvent(qe);
+//                             System.err.println("qe=" + qe);
+//                             System.err.println("xe=" + xe);
+//                             System.err.println("cevent=" + cevent);
+//                     }
+//                }
 //            }
         }
     }
-\r
-    protected AWTEvent relocateEvent(AWTEvent e, Point2D p) {\r
-       if(!(e instanceof MouseEvent)) return e; // Only for mouse events\r
-       MouseEvent me = (MouseEvent)e;\r
-       MouseEvent cevent = null;\r
-        if(me.getID() == MouseWheelEvent.MOUSE_WHEEL) {\r
-            cevent = new SGMouseWheelEvent(new DummyComponent(), me.getID(), me.getWhen(), me.getModifiers(), p.getX(), p.getY(), me.getClickCount(), me.isPopupTrigger(), ((MouseWheelEvent)me).getScrollType(), ((MouseWheelEvent)me).getScrollAmount(), ((MouseWheelEvent)me).getWheelRotation(), me);\r
-        } else {\r
-            cevent = new SGMouseEvent(new DummyComponent(), me.getID(), me.getWhen(), me.getModifiers(), p.getX(), p.getY(), me.getClickCount(), me.isPopupTrigger(), me.getButton(), me);\r
-        }\r
-        return cevent;\r
-    }\r
-    \r
-    protected AWTEvent translateEvent(AWTEvent e, Point2D p) {\r
-       if(!(e instanceof MouseEvent)) return e; // Only for mouse events\r
-       MouseEvent me = (MouseEvent)e;\r
-       MouseEvent cevent = null;\r
-        if(me.getID() == MouseWheelEvent.MOUSE_WHEEL) {\r
-            cevent = new SGMouseWheelEvent(new DummyComponent(), me.getID(), me.getWhen(), me.getModifiers(), me.getX()+p.getX(), me.getY()+p.getY(), me.getClickCount(), me.isPopupTrigger(), ((MouseWheelEvent)me).getScrollType(), ((MouseWheelEvent)me).getScrollAmount(), ((MouseWheelEvent)me).getWheelRotation(), me);\r
-        } else {\r
-            cevent = new SGMouseEvent(new DummyComponent(), me.getID(), me.getWhen(), me.getModifiers(), me.getX()+p.getX(), me.getY()+p.getY(), me.getClickCount(), me.isPopupTrigger(), me.getButton(), me);\r
-        }\r
-        return cevent;\r
-    }\r
-    public void setFocusable(boolean focusable) {\r
-       this.focusable = focusable;\r
-       container.setContains(false); // Always false when focusable property is changed\r
-       component.setFocusable(focusable);\r
-    }\r
-    \r
-    @Override\r
-    public void init() {\r
-        if(component == null) return; // FIXME: assert maybe?\r
-\r
-        Container rootPane = NodeUtil.findRootPane(this);\r
-        if(rootPane != null) {\r
-            rootPane.add(container);\r
-        } else {\r
-               throw new AssertionError("The canvas has no rootPane!");\r
-        }\r
-        container.add(component);\r
-        component.setFocusable(true);\r
-        component.setIgnoreRepaint(true);\r
-\r
-        UIDefaults cDefaults = new UIDefaults();\r
-\r
-        component.putClientProperty("Nimbus.Overrides",cDefaults);\r
-        component.putClientProperty("Nimbus.Overrides.InheritDefaults",false);\r
-\r
-//        component.addMouseListener(new MouseListener() {\r
-//\r
-//                     @Override\r
-//                     public void mouseClicked(MouseEvent e) {\r
-//                             System.err.println("aff");\r
-//                     }\r
-//\r
-//                     @Override\r
-//                     public void mousePressed(MouseEvent e) {\r
-//                             System.err.println("aff2");\r
-//                     }\r
-//\r
-//                     @Override\r
-//                     public void mouseReleased(MouseEvent e) {\r
-//                             System.err.println("aff3");\r
-//                     }\r
-//\r
-//                     @Override\r
-//                     public void mouseEntered(MouseEvent e) {\r
-//                             // TODO Auto-generated method stub\r
-//                             \r
-//                     }\r
-//\r
-//                     @Override\r
-//                     public void mouseExited(MouseEvent e) {\r
-//                             // TODO Auto-generated method stub\r
-//                             \r
-//                     }\r
-//             \r
-//        });\r
-        \r
-        NodeUtil.getEventDelegator(this).addMouseListener(this);\r
-        NodeUtil.getEventDelegator(this).addMouseMotionListener(this);\r
-        NodeUtil.getEventDelegator(this).addKeyListener(this);\r
-        NodeUtil.getEventDelegator(this).addFocusListener(this);\r
-        \r
+
+    protected AWTEvent relocateEvent(AWTEvent e, Point2D p) {
+       if(!(e instanceof MouseEvent)) return e; // Only for mouse events
+       MouseEvent me = (MouseEvent)e;
+       MouseEvent cevent = null;
+        if(me.getID() == MouseWheelEvent.MOUSE_WHEEL) {
+            cevent = new SGMouseWheelEvent(new DummyComponent(), me.getID(), me.getWhen(), me.getModifiers(), p.getX(), p.getY(), me.getClickCount(), me.isPopupTrigger(), ((MouseWheelEvent)me).getScrollType(), ((MouseWheelEvent)me).getScrollAmount(), ((MouseWheelEvent)me).getWheelRotation(), me);
+        } else {
+            cevent = new SGMouseEvent(new DummyComponent(), me.getID(), me.getWhen(), me.getModifiers(), p.getX(), p.getY(), me.getClickCount(), me.isPopupTrigger(), me.getButton(), me);
+        }
+        return cevent;
+    }
+    
+    protected AWTEvent translateEvent(AWTEvent e, Point2D p) {
+       if(!(e instanceof MouseEvent)) return e; // Only for mouse events
+       MouseEvent me = (MouseEvent)e;
+       MouseEvent cevent = null;
+        if(me.getID() == MouseWheelEvent.MOUSE_WHEEL) {
+            cevent = new SGMouseWheelEvent(new DummyComponent(), me.getID(), me.getWhen(), me.getModifiers(), me.getX()+p.getX(), me.getY()+p.getY(), me.getClickCount(), me.isPopupTrigger(), ((MouseWheelEvent)me).getScrollType(), ((MouseWheelEvent)me).getScrollAmount(), ((MouseWheelEvent)me).getWheelRotation(), me);
+        } else {
+            cevent = new SGMouseEvent(new DummyComponent(), me.getID(), me.getWhen(), me.getModifiers(), me.getX()+p.getX(), me.getY()+p.getY(), me.getClickCount(), me.isPopupTrigger(), me.getButton(), me);
+        }
+        return cevent;
+    }
+    public void setFocusable(boolean focusable) {
+       this.focusable = focusable;
+       container.setContains(false); // Always false when focusable property is changed
+       component.setFocusable(focusable);
+    }
+    
+    @Override
+    public void init() {
+        if(component == null) return; // FIXME: assert maybe?
+
+        Container rootPane = NodeUtil.findRootPane(this);
+        if(rootPane != null) {
+            rootPane.add(container);
+        } else {
+               throw new AssertionError("The canvas has no rootPane!");
+        }
+        container.add(component);
+        component.setFocusable(true);
+        component.setIgnoreRepaint(true);
+
+        UIDefaults cDefaults = new UIDefaults();
+
+        component.putClientProperty("Nimbus.Overrides",cDefaults);
+        component.putClientProperty("Nimbus.Overrides.InheritDefaults",false);
+
+//        component.addMouseListener(new MouseListener() {
+//
+//                     @Override
+//                     public void mouseClicked(MouseEvent e) {
+//                             System.err.println("aff");
+//                     }
+//
+//                     @Override
+//                     public void mousePressed(MouseEvent e) {
+//                             System.err.println("aff2");
+//                     }
+//
+//                     @Override
+//                     public void mouseReleased(MouseEvent e) {
+//                             System.err.println("aff3");
+//                     }
+//
+//                     @Override
+//                     public void mouseEntered(MouseEvent e) {
+//                             // TODO Auto-generated method stub
+//                             
+//                     }
+//
+//                     @Override
+//                     public void mouseExited(MouseEvent e) {
+//                             // TODO Auto-generated method stub
+//                             
+//                     }
+//             
+//        });
+        
+        NodeUtil.getEventDelegator(this).addMouseListener(this);
+        NodeUtil.getEventDelegator(this).addMouseMotionListener(this);
+        NodeUtil.getEventDelegator(this).addKeyListener(this);
+        NodeUtil.getEventDelegator(this).addFocusListener(this);
+        
     }
 
     @Override
-    public Rectangle2D getBoundsInLocal() {\r
-       return bounds;\r
-    }\r
+    public Rectangle2D getBoundsInLocal() {
+       return bounds;
+    }
     
     @Override
     public void finalize() throws Throwable {
-        cleanup();\r
+        cleanup();
         super.finalize();
     }
 
     @Override
-    public void cleanup() {\r
-        retractMapping();\r
-\r
-        Container rootPane = NodeUtil.findRootPane(this);\r
+    public void cleanup() {
+        retractMapping();
+
+        Container rootPane = NodeUtil.findRootPane(this);
        
-        if(container != null) {\r
-               rootPane.remove(container);\r
+        if(container != null) {
+               rootPane.remove(container);
                container.setContains(false);
-            if(container.getParent() != null) container.getParent().remove(container); // eh...\r
+            if(container.getParent() != null) container.getParent().remove(container); // eh...
             if (component != null)
-               container.remove(component);\r
+               container.remove(component);
         }
         container = null;
-        component = null;\r
-        \r
-        NodeUtil.getEventDelegator(this).removeMouseListener(this);\r
-        NodeUtil.getEventDelegator(this).removeMouseMotionListener(this);\r
-        NodeUtil.getEventDelegator(this).removeKeyListener(this);\r
-        NodeUtil.getEventDelegator(this).removeFocusListener(this);\r
-\r
+        component = null;
+        
+        NodeUtil.getEventDelegator(this).removeMouseListener(this);
+        NodeUtil.getEventDelegator(this).removeMouseMotionListener(this);
+        NodeUtil.getEventDelegator(this).removeKeyListener(this);
+        NodeUtil.getEventDelegator(this).removeFocusListener(this);
+
         super.cleanup();
-    }\r
-\r
-       @Override\r
-       public void keyTyped(KeyEvent e) {\r
-               handleEvent(e);\r
-       }\r
-\r
-       @Override\r
-       public void keyPressed(KeyEvent e) {\r
-               handleEvent(e);\r
-       }\r
-\r
-       @Override\r
-       public void keyReleased(KeyEvent e) {\r
-               handleEvent(e);\r
-       }\r
-\r
-       @Override\r
-       public void mouseDragged(MouseEvent e) {\r
-               handleEvent(e);\r
-       }\r
-\r
-       @Override\r
-       public void mouseMoved(MouseEvent e) {\r
-               handleEvent(e);\r
-       }\r
-\r
-       @Override\r
-       public void mouseClicked(MouseEvent e) {\r
-               handleEvent(e);\r
-       }\r
-\r
-       @Override\r
-       public void mousePressed(MouseEvent e) {\r
-               handleEvent(e);\r
-       }\r
-\r
-       @Override\r
-       public void mouseReleased(MouseEvent e) {\r
-               handleEvent(e);\r
-       }\r
-\r
-       @Override\r
-       public void mouseEntered(MouseEvent e) {\r
-               handleEvent(e);\r
-       }\r
-\r
-       @Override\r
-       public void mouseExited(MouseEvent e) {\r
-               handleEvent(e);\r
-       }\r
-\r
-       @Override\r
-       public void focusGained(FocusEvent e) {\r
-               handleEvent(e);\r
-       }\r
-\r
-       @Override\r
-       public void focusLost(FocusEvent e) {\r
-               handleEvent(e);\r
+    }
+
+       @Override
+       public void keyTyped(KeyEvent e) {
+               handleEvent(e);
+       }
+
+       @Override
+       public void keyPressed(KeyEvent e) {
+               handleEvent(e);
+       }
+
+       @Override
+       public void keyReleased(KeyEvent e) {
+               handleEvent(e);
+       }
+
+       @Override
+       public void mouseDragged(MouseEvent e) {
+               handleEvent(e);
+       }
+
+       @Override
+       public void mouseMoved(MouseEvent e) {
+               handleEvent(e);
+       }
+
+       @Override
+       public void mouseClicked(MouseEvent e) {
+               handleEvent(e);
+       }
+
+       @Override
+       public void mousePressed(MouseEvent e) {
+               handleEvent(e);
+       }
+
+       @Override
+       public void mouseReleased(MouseEvent e) {
+               handleEvent(e);
+       }
+
+       @Override
+       public void mouseEntered(MouseEvent e) {
+               handleEvent(e);
+       }
+
+       @Override
+       public void mouseExited(MouseEvent e) {
+               handleEvent(e);
+       }
+
+       @Override
+       public void focusGained(FocusEvent e) {
+               handleEvent(e);
+       }
+
+       @Override
+       public void focusLost(FocusEvent e) {
+               handleEvent(e);
        }
 }