From 3cfef23dffbf1ed4ff9501aa55d40aac987b6f3a Mon Sep 17 00:00:00 2001 From: Pavel Porvatov Date: Mon, 26 Sep 2011 17:37:08 +0400 Subject: [PATCH] 7088744: SwingUtilities.isMiddleMouseButton does not work with ALT/Meta keys Reviewed-by: alexp --- .../classes/javax/swing/SwingUtilities.java | 6 +- .../SwingUtilities/7088744/bug7088744.java | 221 ++++++++++++++++++ 2 files changed, 224 insertions(+), 3 deletions(-) create mode 100644 jdk/test/javax/swing/SwingUtilities/7088744/bug7088744.java diff --git a/jdk/src/share/classes/javax/swing/SwingUtilities.java b/jdk/src/share/classes/javax/swing/SwingUtilities.java index 1602eff0101..656644424bb 100644 --- a/jdk/src/share/classes/javax/swing/SwingUtilities.java +++ b/jdk/src/share/classes/javax/swing/SwingUtilities.java @@ -792,7 +792,7 @@ public class SwingUtilities implements SwingConstants * @return true if the left mouse button was active */ public static boolean isLeftMouseButton(MouseEvent anEvent) { - return ((anEvent.getModifiers() & InputEvent.BUTTON1_MASK) != 0); + return (anEvent.getButton() == MouseEvent.BUTTON1); } /** @@ -802,7 +802,7 @@ public class SwingUtilities implements SwingConstants * @return true if the middle mouse button was active */ public static boolean isMiddleMouseButton(MouseEvent anEvent) { - return ((anEvent.getModifiers() & InputEvent.BUTTON2_MASK) == InputEvent.BUTTON2_MASK); + return (anEvent.getButton() == MouseEvent.BUTTON2); } /** @@ -812,7 +812,7 @@ public class SwingUtilities implements SwingConstants * @return true if the right mouse button was active */ public static boolean isRightMouseButton(MouseEvent anEvent) { - return ((anEvent.getModifiers() & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK); + return (anEvent.getButton() == MouseEvent.BUTTON3); } /** diff --git a/jdk/test/javax/swing/SwingUtilities/7088744/bug7088744.java b/jdk/test/javax/swing/SwingUtilities/7088744/bug7088744.java new file mode 100644 index 00000000000..9d2962c8f36 --- /dev/null +++ b/jdk/test/javax/swing/SwingUtilities/7088744/bug7088744.java @@ -0,0 +1,221 @@ +/* + * Copyright (c) 2011, 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 7088744 + @summary SwingUtilities.isMiddleMouseButton does not work with ALT/Meta keys + @author Pavel Porvatov +*/ + +import sun.awt.SunToolkit; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.InputEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +public class bug7088744 { + private static volatile JLabel label; + + private static volatile Point point; + + private static final int MOUSE_CLICKED = 1; + private static final int MOUSE_PRESSED = 2; + private static final int MOUSE_RELEASED = 3; + + // Pair with (EventType, Mouse Button) + private static final int[][] BUTTON_EVENTS_SEQUENCE = { + {MOUSE_PRESSED, 1}, + {MOUSE_PRESSED, 2}, + {MOUSE_PRESSED, 3}, + {MOUSE_RELEASED, 1}, + {MOUSE_CLICKED, 1}, + {MOUSE_RELEASED, 2}, + {MOUSE_CLICKED, 2}, + {MOUSE_RELEASED, 3}, + {MOUSE_CLICKED, 3} + }; + + private static int eventCount; + + public static void main(String[] args) throws Exception { + SwingUtilities.invokeAndWait(new Runnable() { + public void run() { + Component source = new JLabel(); + + MouseEvent mouseEventNoButtons = new MouseEvent(source, 0, System.currentTimeMillis(), + Event.ALT_MASK | Event.META_MASK | InputEvent.ALT_DOWN_MASK | InputEvent.META_DOWN_MASK, + 0, 0, 0, false, MouseEvent.NOBUTTON); + + // isLeftMouseButton + if (SwingUtilities.isLeftMouseButton(mouseEventNoButtons)) { + throw new RuntimeException("SwingUtilities.isLeftMouseButton fails 1"); + } + + if (!SwingUtilities.isLeftMouseButton(new MouseEvent(source, 0, System.currentTimeMillis(), + InputEvent.BUTTON1_MASK, 0, 0, 1, false, MouseEvent.BUTTON1))) { + throw new RuntimeException("SwingUtilities.isLeftMouseButton fails 2"); + } + + if (!SwingUtilities.isLeftMouseButton(new MouseEvent(source, 0, System.currentTimeMillis(), + InputEvent.BUTTON1_DOWN_MASK, 0, 0, 1, false, MouseEvent.BUTTON1))) { + throw new RuntimeException("SwingUtilities.isLeftMouseButton fails 3"); + } + + // isMiddleMouseButton + if (SwingUtilities.isMiddleMouseButton(mouseEventNoButtons)) { + throw new RuntimeException("SwingUtilities.isMiddleMouseButton fails 1"); + } + + if (!SwingUtilities.isMiddleMouseButton(new MouseEvent(source, 0, System.currentTimeMillis(), + InputEvent.BUTTON2_MASK, 0, 0, 1, false, MouseEvent.BUTTON2))) { + throw new RuntimeException("SwingUtilities.isMiddleMouseButton fails 2"); + } + + if (!SwingUtilities.isMiddleMouseButton(new MouseEvent(source, 0, System.currentTimeMillis(), + InputEvent.BUTTON2_DOWN_MASK, 0, 0, 1, false, MouseEvent.BUTTON2))) { + throw new RuntimeException("SwingUtilities.isMiddleMouseButton fails 3"); + } + + // isRightMouseButton + if (SwingUtilities.isRightMouseButton(mouseEventNoButtons)) { + throw new RuntimeException("SwingUtilities.isRightMouseButton fails 1"); + } + + if (!SwingUtilities.isRightMouseButton(new MouseEvent(source, 0, System.currentTimeMillis(), + InputEvent.BUTTON3_MASK, 0, 0, 1, false, MouseEvent.BUTTON3))) { + throw new RuntimeException("SwingUtilities.isRightMouseButton fails 2"); + } + + if (!SwingUtilities.isRightMouseButton(new MouseEvent(source, 0, System.currentTimeMillis(), + InputEvent.BUTTON3_DOWN_MASK, 0, 0, 1, false, MouseEvent.BUTTON3))) { + throw new RuntimeException("SwingUtilities.isRightMouseButton fails 3"); + } + } + }); + + SwingUtilities.invokeAndWait(new Runnable() { + public void run() { + JFrame frame = new JFrame(); + + label = new JLabel("A label"); + + label.addMouseListener(new MouseAdapter() { + public void mouseClicked(MouseEvent e) { + processEvent(MOUSE_CLICKED, e); + } + + public void mousePressed(MouseEvent e) { + processEvent(MOUSE_PRESSED, e); + } + + public void mouseReleased(MouseEvent e) { + processEvent(MOUSE_RELEASED, 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(100); + robot.mouseMove(point.x, point.y); + robot.mousePress(InputEvent.BUTTON1_MASK); + robot.mousePress(InputEvent.BUTTON2_MASK); + robot.mousePress(InputEvent.BUTTON3_MASK); + robot.mouseRelease(InputEvent.BUTTON1_MASK); + robot.mouseRelease(InputEvent.BUTTON2_MASK); + robot.mouseRelease(InputEvent.BUTTON3_MASK); + + toolkit.realSync(); + + SwingUtilities.invokeAndWait(new Runnable() { + public void run() { + if (eventCount != BUTTON_EVENTS_SEQUENCE.length) { + throw new RuntimeException("Not all events received"); + } + + } + }); + + System.out.println("Test passed"); + } + + private static void processEvent(int eventType, MouseEvent e) { + if (eventCount >= BUTTON_EVENTS_SEQUENCE.length) { + throw new RuntimeException("Unexpected event " + e); + } + + int[] arr = BUTTON_EVENTS_SEQUENCE[eventCount]; + + if (arr[0] != eventType) { + throw new RuntimeException("Unexpected eventType " + eventType + "on step " + eventCount); + } + + boolean result; + + switch (arr[1]) { + case 1: + result = SwingUtilities.isLeftMouseButton(e); + + break; + + case 2: + result = SwingUtilities.isMiddleMouseButton(e); + + break; + + case 3: + result = SwingUtilities.isRightMouseButton(e); + + break; + + default: + throw new RuntimeException("Incorrect arr[1] on step " + eventCount); + } + + if (!result) { + throw new RuntimeException("Test failed on step " + eventCount); + } + + eventCount++; + } +}