# HG changeset patch # User lana # Date 1331695423 25200 # Node ID 0659ed7951123dcc94ba60f5ce390b54c1f35b89 # Parent 529bdd70a10a7bebaa96dc0a7a72e55a2dacfbcc# Parent 23364b73791c23a1087efd40933190e3e12510a2 Merge diff -r 529bdd70a10a -r 0659ed795112 jdk/.hgtags --- 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 diff -r 529bdd70a10a -r 0659ed795112 jdk/src/share/classes/java/beans/ChangeListenerMap.java --- 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 proxy = (EventListenerProxy) listener; - listener = proxy.getListener(); - } - return listener; - } + public abstract L extract(L listener); } diff -r 529bdd70a10a -r 0659ed795112 jdk/src/share/classes/java/beans/PropertyChangeSupport.java --- 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; + } } } diff -r 529bdd70a10a -r 0659ed795112 jdk/src/share/classes/java/beans/VetoableChangeSupport.java --- 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; + } } } diff -r 529bdd70a10a -r 0659ed795112 jdk/src/share/classes/javax/swing/SwingUtilities.java --- 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); } /** diff -r 529bdd70a10a -r 0659ed795112 jdk/src/share/demo/jfc/TransparentRuler/transparentruler/Ruler.java --- 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); diff -r 529bdd70a10a -r 0659ed795112 jdk/test/java/beans/PropertyChangeSupport/Test7148143.java --- /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 + 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 + } +} diff -r 529bdd70a10a -r 0659ed795112 jdk/test/java/beans/VetoableChangeSupport/Test7148143.java --- /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 + 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 + } +} diff -r 529bdd70a10a -r 0659ed795112 jdk/test/javax/swing/JFileChooser/4524490/bug4524490.java --- /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."); + } + } + }); + } +} diff -r 529bdd70a10a -r 0659ed795112 jdk/test/javax/swing/JMenuItem/6209975/bug6209975.java --- /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; + } + } +} diff -r 529bdd70a10a -r 0659ed795112 jdk/test/javax/swing/SwingUtilities/7146377/bug7146377.java --- /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); + } +}