Merge
authorlana
Tue, 13 Mar 2012 20:23:43 -0700
changeset 12187 0659ed795112
parent 12185 529bdd70a10a (current diff)
parent 12055 23364b73791c (diff)
child 12188 1531d00686cd
Merge
--- a/jdk/.hgtags	Tue Mar 13 15:44:26 2012 -0700
+++ b/jdk/.hgtags	Tue Mar 13 20:23:43 2012 -0700
@@ -150,3 +150,4 @@
 5aca406e87cb9144a9405be312dadd728a9c6fe2 jdk8-b26
 c68342532e2e7deb3a25fc04ed3e4c142278f747 jdk8-b27
 1e1d41daaded291ab3a370ca6a27f7325701978e jdk8-b28
+c5b882dce0fe27e05dc64debc92b1fb9ebf880ec jdk8-b29
--- a/jdk/src/share/classes/java/beans/ChangeListenerMap.java	Tue Mar 13 15:44:26 2012 -0700
+++ b/jdk/src/share/classes/java/beans/ChangeListenerMap.java	Tue Mar 13 20:23:43 2012 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -237,12 +237,5 @@
      *
      * @return a real listener
      */
-    public final L extract(L listener) {
-        while (listener instanceof EventListenerProxy) {
-            @SuppressWarnings("unchecked")
-            EventListenerProxy<L> proxy = (EventListenerProxy<L>) listener;
-            listener = proxy.getListener();
-        }
-        return listener;
-    }
+    public abstract L extract(L listener);
 }
--- a/jdk/src/share/classes/java/beans/PropertyChangeSupport.java	Tue Mar 13 15:44:26 2012 -0700
+++ b/jdk/src/share/classes/java/beans/PropertyChangeSupport.java	Tue Mar 13 20:23:43 2012 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -533,5 +533,15 @@
         protected PropertyChangeListener newProxy(String name, PropertyChangeListener listener) {
             return new PropertyChangeListenerProxy(name, listener);
         }
+
+        /**
+         * {@inheritDoc}
+         */
+        public final PropertyChangeListener extract(PropertyChangeListener listener) {
+            while (listener instanceof PropertyChangeListenerProxy) {
+                listener = ((PropertyChangeListenerProxy) listener).getListener();
+            }
+            return listener;
+        }
     }
 }
--- a/jdk/src/share/classes/java/beans/VetoableChangeSupport.java	Tue Mar 13 15:44:26 2012 -0700
+++ b/jdk/src/share/classes/java/beans/VetoableChangeSupport.java	Tue Mar 13 20:23:43 2012 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -522,5 +522,15 @@
         protected VetoableChangeListener newProxy(String name, VetoableChangeListener listener) {
             return new VetoableChangeListenerProxy(name, listener);
         }
+
+        /**
+         * {@inheritDoc}
+         */
+        public final VetoableChangeListener extract(VetoableChangeListener listener) {
+            while (listener instanceof VetoableChangeListenerProxy) {
+                listener = ((VetoableChangeListenerProxy) listener).getListener();
+            }
+            return listener;
+        }
     }
 }
--- a/jdk/src/share/classes/javax/swing/SwingUtilities.java	Tue Mar 13 15:44:26 2012 -0700
+++ b/jdk/src/share/classes/javax/swing/SwingUtilities.java	Tue Mar 13 20:23:43 2012 -0700
@@ -792,7 +792,8 @@
      * @return true if the left mouse button was active
      */
     public static boolean isLeftMouseButton(MouseEvent anEvent) {
-         return (anEvent.getButton() == MouseEvent.BUTTON1);
+         return ((anEvent.getModifiersEx() & InputEvent.BUTTON1_DOWN_MASK) != 0 ||
+                 anEvent.getButton() == MouseEvent.BUTTON1);
     }
 
     /**
@@ -802,7 +803,8 @@
      * @return true if the middle mouse button was active
      */
     public static boolean isMiddleMouseButton(MouseEvent anEvent) {
-        return (anEvent.getButton() == MouseEvent.BUTTON2);
+        return ((anEvent.getModifiersEx() & InputEvent.BUTTON2_DOWN_MASK) != 0 ||
+                anEvent.getButton() == MouseEvent.BUTTON2);
     }
 
     /**
@@ -812,7 +814,8 @@
      * @return true if the right mouse button was active
      */
     public static boolean isRightMouseButton(MouseEvent anEvent) {
-        return (anEvent.getButton() == MouseEvent.BUTTON3);
+        return ((anEvent.getModifiersEx() & InputEvent.BUTTON3_DOWN_MASK) != 0 ||
+                anEvent.getButton() == MouseEvent.BUTTON3);
     }
 
     /**
--- a/jdk/src/share/demo/jfc/TransparentRuler/transparentruler/Ruler.java	Tue Mar 13 15:44:26 2012 -0700
+++ b/jdk/src/share/demo/jfc/TransparentRuler/transparentruler/Ruler.java	Tue Mar 13 20:23:43 2012 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -40,12 +40,9 @@
 package transparentruler;
 
 
-import java.awt.Color;
-import java.awt.Graphics;
-import java.awt.Graphics2D;
-import java.awt.GraphicsDevice;
+import java.awt.*;
 import java.awt.GraphicsDevice.WindowTranslucency;
-import java.awt.GraphicsEnvironment;
+import static java.awt.GraphicsDevice.WindowTranslucency.*;
 import java.awt.event.ActionEvent;
 import java.awt.event.ComponentAdapter;
 import java.awt.event.ComponentEvent;
@@ -79,16 +76,32 @@
     private static final int F_HEIGHT = 400;
     private static final int F_WIDTH = (int) (F_HEIGHT * 1.618 + 0.5);
 
-    private static void checkTranslucencyMode(WindowTranslucency arg) {
+    private static boolean translucencySupported;
+    private static boolean transparencySupported;
+
+    private static boolean checkTranslucencyMode(WindowTranslucency arg) {
         GraphicsEnvironment ge =
                 GraphicsEnvironment.getLocalGraphicsEnvironment();
         GraphicsDevice gd = ge.getDefaultScreenDevice();
-        if (!gd.isWindowTranslucencySupported(arg)) {
-            System.err.println("'" + arg
-                    + "' translucency mode isn't supported.");
-            System.exit(-1);
-        }
+        return gd.isWindowTranslucencySupported(arg);
     }
+
+    public Shape buildShape() {
+        int h = getHeight();
+        int w = getWidth();
+        float a = (float) Math.hypot(h, w);
+        Float path = new java.awt.geom.Path2D.Float();
+        path.moveTo(0, 0);
+        path.lineTo(w, 0);
+        path.lineTo(0, h);
+        path.closePath();
+        path.moveTo(W, W);
+        path.lineTo(W, h - W * (a + h) / w);
+        path.lineTo(w - W * (a + w) / h, W);
+        path.closePath();
+        return path;
+    }
+
     private final ComponentAdapter componentListener = new ComponentAdapter() {
 
         /**
@@ -97,36 +110,32 @@
          */
         @Override
         public void componentResized(ComponentEvent e) {
-            int h = getHeight();
-            int w = getWidth();
-            float a = (float) Math.hypot(h, w);
-            Float path = new java.awt.geom.Path2D.Float();
-            path.moveTo(0, 0);
-            path.lineTo(w, 0);
-            path.lineTo(0, h);
-            path.closePath();
-            path.moveTo(W, W);
-            path.lineTo(W, h - W * (a + h) / w);
-            path.lineTo(w - W * (a + w) / h, W);
-            path.closePath();
-            setShape(path);
+
+            // We do apply shape only if PERPIXEL_TRANSPARENT is supported
+            if (transparencySupported) {
+                setShape(buildShape());
+            }
         }
     };
+
     private final Action exitAction = new AbstractAction("Exit") {
 
         {
             putValue(Action.MNEMONIC_KEY, KeyEvent.VK_X);
         }
 
+        @Override
         public void actionPerformed(ActionEvent e) {
             System.exit(0);
         }
     };
+
     private final JPopupMenu jPopupMenu = new JPopupMenu();
 
     {
         jPopupMenu.add(new JMenuItem(exitAction));
     }
+
     /**
      * Implements mouse-related behavior: window dragging and popup menu
      * invocation
@@ -157,6 +166,7 @@
             }
         }
     };
+
     /**
      * Implements keyboard navigation. Arrows move by 5 pixels, Ctrl + arrows
      * move by 50 pixels, Alt + arrows move by 1 pixel.
@@ -201,10 +211,22 @@
 
             @Override
             protected void paintComponent(Graphics g) {
-                Graphics gg = g.create();
+                Graphics2D gg = (Graphics2D) g.create();
                 int w = getWidth();
                 int h = getHeight();
                 int hh = gg.getFontMetrics().getAscent();
+
+                // This is an approach to apply shape when PERPIXEL_TRANSPARENT
+                // isn't supported
+                if (!transparencySupported) {
+                    gg.setBackground(new Color(0, 0, 0, 0));
+                    gg.clearRect(0, 0, w, h);
+                    gg.clip(buildShape());
+
+                    gg.setBackground(Ruler.this.getBackground());
+                    gg.clearRect(0, 0, w, h);
+                }
+
                 gg.setColor(FOREGROUND);
                 for (int x = 0; x < w * (h - 8) / h - 5; x += 5) {
                     boolean hi = x % 50 == 0;
@@ -216,6 +238,7 @@
                         gg.drawString(number, x + 5 - ww / 2, 20 + hh);
                     }
                 }
+
                 gg.dispose();
             }
         });
@@ -231,9 +254,17 @@
 
         SwingUtilities.invokeAndWait(new Runnable() {
 
+            @Override
             public void run() {
-                checkTranslucencyMode(WindowTranslucency.PERPIXEL_TRANSLUCENT);
-                checkTranslucencyMode(WindowTranslucency.PERPIXEL_TRANSPARENT);
+                translucencySupported = checkTranslucencyMode(PERPIXEL_TRANSLUCENT);
+                transparencySupported = checkTranslucencyMode(PERPIXEL_TRANSPARENT);
+
+                if (!translucencySupported) {
+                    System.err.println("This application requires "
+                            + "'PERPIXEL_TRANSLUCENT' translucency mode to "
+                            + "be supported.");
+                    System.exit(-1);
+                }
 
                 Ruler ruler = new Ruler();
                 ruler.setVisible(true);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/beans/PropertyChangeSupport/Test7148143.java	Tue Mar 13 20:23:43 2012 -0700
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 7148143
+ * @summary Tests ClassCastException for the PropertyChangeSupport class
+ * @author Sergey Malenkov
+ */
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+import java.util.EventListener;
+import java.util.EventListenerProxy;
+
+public class Test7148143 {
+
+    private static class CustomProxy
+            extends EventListenerProxy<EventListener>
+            implements PropertyChangeListener {
+
+        public CustomProxy() {
+            super(new EventListener() {
+            });
+        }
+
+        public void propertyChange(PropertyChangeEvent event) {
+        }
+    }
+
+    public static void main(String[] args) {
+        PropertyChangeListener listener = new CustomProxy();
+        PropertyChangeSupport support = new PropertyChangeSupport(listener);
+        support.addPropertyChangeListener(listener);
+        support.addPropertyChangeListener("foo", listener); // cast class exception
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/beans/VetoableChangeSupport/Test7148143.java	Tue Mar 13 20:23:43 2012 -0700
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 7148143
+ * @summary Tests ClassCastException for the VetoableChangeSupport class
+ * @author Sergey Malenkov
+ */
+
+import java.beans.PropertyChangeEvent;
+import java.beans.VetoableChangeListener;
+import java.beans.VetoableChangeSupport;
+import java.util.EventListener;
+import java.util.EventListenerProxy;
+
+public class Test7148143 {
+
+    private static class CustomProxy
+            extends EventListenerProxy<EventListener>
+            implements VetoableChangeListener {
+
+        public CustomProxy() {
+            super(new EventListener() {
+            });
+        }
+
+        public void vetoableChange(PropertyChangeEvent event) {
+        }
+    }
+
+    public static void main(String[] args) {
+        VetoableChangeListener listener = new CustomProxy();
+        VetoableChangeSupport support = new VetoableChangeSupport(listener);
+        support.addVetoableChangeListener(listener);
+        support.addVetoableChangeListener("foo", listener); // cast class exception
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JFileChooser/4524490/bug4524490.java	Tue Mar 13 20:23:43 2012 -0700
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 4524490
+ * @summary Tests if in JFileChooser, ALT+L does not bring focus to 'Files' selection list in Motif LAF
+ * @library ../../regtesthelpers
+ * @build Util
+ * @author Konstantin Eremin
+ * @run main bug4524490
+ */
+import java.awt.Robot;
+import java.awt.Toolkit;
+import java.awt.event.KeyEvent;
+import javax.swing.*;
+import sun.awt.OSInfo;
+import sun.awt.SunToolkit;
+
+public class bug4524490 {
+
+    private static JFileChooser fileChooser;
+
+    public static void main(String[] args) throws Exception {
+        SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
+        Robot robot = new Robot();
+        robot.setAutoDelay(50);
+
+        UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
+
+        SwingUtilities.invokeLater(new Runnable() {
+
+            public void run() {
+                fileChooser = new JFileChooser();
+                fileChooser.showOpenDialog(null);
+            }
+        });
+
+        toolkit.realSync();
+
+        if (OSInfo.OSType.MACOSX.equals(OSInfo.getOSType())) {
+            Util.hitKeys(robot, KeyEvent.VK_CONTROL, KeyEvent.VK_ALT, KeyEvent.VK_L);
+        } else {
+            Util.hitKeys(robot, KeyEvent.VK_ALT, KeyEvent.VK_L);
+        }
+        checkFocus();
+    }
+
+    private static void checkFocus() throws Exception {
+        SwingUtilities.invokeAndWait(new Runnable() {
+
+            @Override
+            public void run() {
+                JList list = (JList) Util.findSubComponent(fileChooser, "javax.swing.JList");
+                System.out.println("list focus: " + list.isFocusOwner());
+                if (!list.isFocusOwner()) {
+                    throw new RuntimeException("Focus is not transfered to the Folders list.");
+                }
+            }
+        });
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JMenuItem/6209975/bug6209975.java	Tue Mar 13 20:23:43 2012 -0700
@@ -0,0 +1,172 @@
+/*
+ * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 6209975
+ * @summary regression: JMenuItem icons overimposed on JMenuItem labels under Metal LAF
+ * @library ../../regtesthelpers
+ * @build Util
+ * @author Alexander Zuev
+ * @run main bug6209975
+ */
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.InputEvent;
+import sun.awt.SunToolkit;
+
+public class bug6209975 {
+
+    private static final ReturnObject RO1 = new ReturnObject();
+    private static final ReturnObject RO2 = new ReturnObject();
+
+    private static JMenu menu;
+    private static JButton button;
+
+    public static void main(String[] args) throws Exception {
+
+        SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
+        Robot robot = new Robot();
+        robot.setAutoDelay(500);
+
+
+        SwingUtilities.invokeAndWait(new Runnable() {
+
+            @Override
+            public void run() {
+                createAndShowGUI();
+            }
+        });
+
+        toolkit.realSync();
+
+        Point clickPoint = getButtonClickPoint();
+        robot.mouseMove(clickPoint.x, clickPoint.y);
+        robot.mousePress(InputEvent.BUTTON1_MASK);
+        robot.mouseRelease(InputEvent.BUTTON1_MASK);
+        toolkit.realSync();
+
+        clickPoint = getMenuClickPoint();
+        robot.mouseMove(clickPoint.x, clickPoint.y);
+        robot.mousePress(InputEvent.BUTTON1_MASK);
+        robot.mouseRelease(InputEvent.BUTTON1_MASK);
+        toolkit.realSync();
+
+        if (RO1.itsValue <= RO2.itsValue) {
+            throw new RuntimeException("Offset if the second icon is invalid.");
+        }
+    }
+
+    private static Point getButtonClickPoint() throws Exception {
+        final Point[] result = new Point[1];
+
+        SwingUtilities.invokeAndWait(new Runnable() {
+
+            @Override
+            public void run() {
+                Point p = button.getLocationOnScreen();
+                Dimension size = button.getSize();
+                result[0] = new Point(p.x + size.width / 2, p.y + size.height / 2);
+            }
+        });
+        return result[0];
+    }
+
+    private static Point getMenuClickPoint() throws Exception {
+        final Point[] result = new Point[1];
+
+        SwingUtilities.invokeAndWait(new Runnable() {
+
+            @Override
+            public void run() {
+                Point p = menu.getLocationOnScreen();
+                Dimension size = menu.getSize();
+                result[0] = new Point(p.x + size.width / 2, p.y + size.height / 2);
+            }
+        });
+        return result[0];
+    }
+
+    private static void createAndShowGUI() {
+        JFrame frame = new JFrame("Test6209975");
+        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+        frame.applyComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
+        frame.setLayout(new BorderLayout());
+        button = new JButton("Focus holder");
+        frame.add(button);
+
+        JMenuBar mb = new JMenuBar();
+        menu = new JMenu("File");
+
+        JMenuItem item;
+
+        item = new JMenuItem("Just a menu item");
+        item.setIcon(new MyIcon(RO1));
+        item.setHorizontalTextPosition(SwingConstants.LEADING);
+        menu.add(item);
+
+        item = new JMenuItem("Menu Item with another icon");
+        item.setIcon(new MyIcon(RO2));
+        item.setHorizontalTextPosition(SwingConstants.TRAILING);
+        menu.add(item);
+
+        mb.add(menu);
+
+        frame.setJMenuBar(mb);
+        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+        frame.pack();
+        frame.setLocation(400, 300);
+        frame.setVisible(true);
+    }
+
+    public static class ReturnObject {
+
+        public volatile int itsValue;
+    }
+
+    public static class MyIcon implements Icon {
+
+        ReturnObject thisObject = null;
+
+        public MyIcon(ReturnObject ro) {
+            super();
+            thisObject = ro;
+        }
+
+        public void paintIcon(Component c, Graphics g, int x, int y) {
+            Color color = g.getColor();
+            g.setColor(Color.BLACK);
+            g.fillRect(x, y, 10, 10);
+            g.setColor(color);
+            thisObject.itsValue = x;
+        }
+
+        public int getIconWidth() {
+            return 10;
+        }
+
+        public int getIconHeight() {
+            return 10;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/SwingUtilities/7146377/bug7146377.java	Tue Mar 13 20:23:43 2012 -0700
@@ -0,0 +1,201 @@
+/*
+ * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/* @test
+   @bug 7146377
+   @summary closed/javax/swing/DataTransfer/4876520/bug4876520.java failed since b08 in jdk 8
+   @author Pavel Porvatov
+*/
+
+import sun.awt.SunToolkit;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.InputEvent;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+
+public class bug7146377 {
+    private static JLabel label;
+    private static JFrame frame;
+
+    private static volatile Point point;
+
+    public static void main(String[] args) throws Exception {
+        SwingUtilities.invokeAndWait(new Runnable() {
+            public void run() {
+                frame = new JFrame();
+
+                label = new JLabel("A label");
+
+                label.addMouseListener(new MouseListener() {
+                    @Override
+                    public void mouseClicked(MouseEvent e) {
+                        checkEvent(e);
+                    }
+
+                    @Override
+                    public void mousePressed(MouseEvent e) {
+                        checkEvent(e);
+                    }
+
+                    @Override
+                    public void mouseReleased(MouseEvent e) {
+                        checkEvent(e);
+                    }
+
+                    @Override
+                    public void mouseEntered(MouseEvent e) {
+                        checkEvent(e);
+                    }
+
+                    @Override
+                    public void mouseExited(MouseEvent e) {
+                        checkEvent(e);
+                    }
+                });
+
+                frame.add(label);
+                frame.setSize(200, 100);
+                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+                frame.setVisible(true);
+            }
+        });
+
+        SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
+
+        toolkit.realSync();
+
+        // On Linux platforms realSync doesn't guaranties setSize completion
+        Thread.sleep(1000);
+
+        SwingUtilities.invokeAndWait(new Runnable() {
+            public void run() {
+                point = label.getLocationOnScreen();
+            }
+        });
+
+        Robot robot = new Robot();
+
+        robot.setAutoDelay(200);
+
+        // Move mouse
+        for (int i = 0; i < 20; i++) {
+            robot.mouseMove(point.x + i, point.y + i);
+        }
+
+        for (int button : new int[]{InputEvent.BUTTON1_MASK, InputEvent.BUTTON2_MASK, InputEvent.BUTTON3_MASK}) {
+            robot.mouseMove(point.x, point.y);
+
+            // Mouse Drag
+            robot.mousePress(button);
+
+            for (int i = 0; i < 20; i++) {
+                robot.mouseMove(point.x + i, point.y + i);
+            }
+
+            robot.mouseRelease(button);
+        }
+
+        toolkit.realSync();
+
+        SwingUtilities.invokeAndWait(new Runnable() {
+            public void run() {
+                frame.dispose();
+            }
+        });
+
+        System.out.println("Test passed");
+    }
+
+    private static void checkEvent(MouseEvent e) {
+        String eventAsStr = eventToString(e);
+
+        System.out.println("Checking event " + eventAsStr);
+
+        check("isLeftMouseButton", SwingUtilities.isLeftMouseButton(e), oldIsLeftMouseButton(e), eventAsStr);
+        check("isRightMouseButton", SwingUtilities.isRightMouseButton(e), oldIsRightMouseButton(e), eventAsStr);
+        check("isMiddleMouseButton", SwingUtilities.isMiddleMouseButton(e), oldIsMiddleMouseButton(e), eventAsStr);
+    }
+
+    private static void check(String methodName, boolean newValue, boolean oldValue, String eventAsStr) {
+        if (newValue != oldValue) {
+            throw new RuntimeException("Regression on " + methodName + ", newValue = " + newValue +
+                    ", oldValue = " + oldValue + ", e = " + eventAsStr);
+        }
+    }
+
+    private static String eventToString(MouseEvent e) {
+        StringBuilder result = new StringBuilder();
+
+        switch (e.getID()) {
+            case MouseEvent.MOUSE_PRESSED:
+                result.append("MOUSE_PRESSED");
+                break;
+            case MouseEvent.MOUSE_RELEASED:
+                result.append("MOUSE_RELEASED");
+                break;
+            case MouseEvent.MOUSE_CLICKED:
+                result.append("MOUSE_CLICKED");
+                break;
+            case MouseEvent.MOUSE_ENTERED:
+                result.append("MOUSE_ENTERED");
+                break;
+            case MouseEvent.MOUSE_EXITED:
+                result.append("MOUSE_EXITED");
+                break;
+            case MouseEvent.MOUSE_MOVED:
+                result.append("MOUSE_MOVED");
+                break;
+            case MouseEvent.MOUSE_DRAGGED:
+                result.append("MOUSE_DRAGGED");
+                break;
+            case MouseEvent.MOUSE_WHEEL:
+                result.append("MOUSE_WHEEL");
+                break;
+            default:
+                result.append("unknown type");
+        }
+
+        result.append(", modifiers = " + MouseEvent.getMouseModifiersText(e.getModifiers()));
+        result.append(", modifiersEx = " + MouseEvent.getMouseModifiersText(e.getModifiersEx()));
+        result.append(", button = " + e.getButton());
+
+        return result.toString();
+    }
+
+    // Original implementation of SwingUtilities.isLeftMouseButton
+    private static boolean oldIsLeftMouseButton(MouseEvent e) {
+        return ((e.getModifiers() & InputEvent.BUTTON1_MASK) != 0);
+    }
+
+    // Original implementation of SwingUtilities.isMiddleMouseButton
+    private static boolean oldIsMiddleMouseButton(MouseEvent e) {
+        return ((e.getModifiers() & InputEvent.BUTTON2_MASK) == InputEvent.BUTTON2_MASK);
+    }
+
+    // Original implementation of SwingUtilities.isRightMouseButton
+    private static boolean oldIsRightMouseButton(MouseEvent e) {
+        return ((e.getModifiers() & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK);
+    }
+}