From 1b26c1e4b4124d6e5c9f293a0950505cb03ccc1f Mon Sep 17 00:00:00 2001 From: bagiras Date: Mon, 11 Jul 2011 15:59:29 +0400 Subject: [PATCH] 7050935: closed/java/awt/Choice/WheelEventsConsumed/WheelEventsConsumed.html fails on win32 Reviewed-by: art, dcherepanov --- src/windows/native/sun/windows/awt_Choice.cpp | 6 - .../native/sun/windows/awt_Component.cpp | 1 + .../native/sun/windows/awt_Toolkit.cpp | 7 +- .../ChoiceMouseWheelTest.java | 149 ++++++++++++++++++ 4 files changed, 153 insertions(+), 10 deletions(-) create mode 100644 test/java/awt/Choice/ChoiceMouseWheelTest/ChoiceMouseWheelTest.java diff --git a/src/windows/native/sun/windows/awt_Choice.cpp b/src/windows/native/sun/windows/awt_Choice.cpp index 0d014ac56..dfd9a6de6 100644 --- a/src/windows/native/sun/windows/awt_Choice.cpp +++ b/src/windows/native/sun/windows/awt_Choice.cpp @@ -396,12 +396,6 @@ LRESULT CALLBACK AwtChoice::ListWindowProc(HWND hwnd, UINT message, DASSERT(::IsWindow(hwnd)); - // This branch is required for the proper work of AwtComponent::GetComponent() method - // while hovering drop-down list - if (message == WmAwtIsComponent) { - return (LRESULT)TRUE; - } - switch (message) { case WM_LBUTTONDOWN: { DWORD curPos = ::GetMessagePos(); diff --git a/src/windows/native/sun/windows/awt_Component.cpp b/src/windows/native/sun/windows/awt_Component.cpp index 3b72baed5..a6ada9cb9 100644 --- a/src/windows/native/sun/windows/awt_Component.cpp +++ b/src/windows/native/sun/windows/awt_Component.cpp @@ -364,6 +364,7 @@ AwtComponent* AwtComponent::GetComponentImpl(HWND hWnd) { AwtComponent *component = (AwtComponent *)::GetWindowLongPtr(hWnd, GWLP_USERDATA); DASSERT(!component || !IsBadReadPtr(component, sizeof(AwtComponent)) ); + DASSERT(!component || component->GetHWnd() == hWnd ); return component; } diff --git a/src/windows/native/sun/windows/awt_Toolkit.cpp b/src/windows/native/sun/windows/awt_Toolkit.cpp index 0329e950f..00f9b325a 100644 --- a/src/windows/native/sun/windows/awt_Toolkit.cpp +++ b/src/windows/native/sun/windows/awt_Toolkit.cpp @@ -1444,7 +1444,6 @@ BOOL AwtToolkit::PreProcessMouseMsg(AwtComponent* p, MSG& msg) AwtComponent* mouseComp = AwtComponent::GetComponent(hWndFromPoint); // Need extra copies for non-client area issues - AwtComponent* mouseWheelComp = mouseComp; HWND hWndForWheel = hWndFromPoint; // If the point under the mouse isn't in the client area, @@ -1510,9 +1509,9 @@ BOOL AwtToolkit::PreProcessMouseMsg(AwtComponent* p, MSG& msg) */ if (msg.message == WM_MOUSEWHEEL && - mouseWheelComp != NULL) { //i.e. mouse is over client area for this - //window - msg.hwnd = hWndForWheel; + AwtToolkit::MainThread() == ::GetWindowThreadProcessId(hWndForWheel, NULL)) { + //i.e. mouse is over client area for this window + msg.hwnd = hWndForWheel; } /* diff --git a/test/java/awt/Choice/ChoiceMouseWheelTest/ChoiceMouseWheelTest.java b/test/java/awt/Choice/ChoiceMouseWheelTest/ChoiceMouseWheelTest.java new file mode 100644 index 000000000..2c147102b --- /dev/null +++ b/test/java/awt/Choice/ChoiceMouseWheelTest/ChoiceMouseWheelTest.java @@ -0,0 +1,149 @@ +/* + * 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 7050935 + @summary closed/java/awt/Choice/WheelEventsConsumed/WheelEventsConsumed.html fails on win32 + @author Oleg Pekhovskiy: area=awt-choice + @run main ChoiceMouseWheelTest +*/ + +import test.java.awt.regtesthelpers.Util; + +import java.awt.*; +import java.awt.event.*; + +public class ChoiceMouseWheelTest extends Frame { + + private volatile boolean itemChanged = false; + private volatile boolean wheelMoved = false; + private volatile boolean frameExited = false; + + public static void main(String[] args) { + new ChoiceMouseWheelTest(); + } + + ChoiceMouseWheelTest() { + super("ChoiceMouseWheelTest"); + setLayout(new FlowLayout()); + + Choice choice = new Choice(); + + addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) { + System.exit(0); + } + }); + + for(Integer i = 0; i < 50; i++) { + choice.add(i.toString()); + } + + choice.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + itemChanged = true; + } + }); + choice.addMouseWheelListener(new MouseWheelListener() { + public void mouseWheelMoved(MouseWheelEvent e) { + wheelMoved = true; + } + }); + + addMouseListener(new MouseAdapter() { + @Override + public void mouseExited(MouseEvent e) { + frameExited = true; + } + }); + + add(choice); + setSize(200, 300); + setVisible(true); + toFront(); + + try { + Robot robot = new Robot(); + robot.setAutoDelay(20); + Util.waitForIdle(robot); + + Point pt = choice.getLocationOnScreen(); + Dimension size = choice.getSize(); + int x = pt.x + size.width / 3; + robot.mouseMove(x, pt.y + size.height / 2); + + // Test mouse wheel over the choice + String name = Toolkit.getDefaultToolkit().getClass().getName(); + if(!name.equals("sun.awt.X11.XToolkit")) { // mouse wheel doesn't work for the choice on X11, so skip it + robot.mouseWheel(1); + Util.waitForIdle(robot); + + if(!wheelMoved || !itemChanged) { + throw new RuntimeException("Mouse Wheel over the choice failed!"); + } + } + + // Test mouse wheel over the drop-down list + robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); + Util.waitForIdle(robot); + robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); + Util.waitForIdle(robot); + + int y = getLocationOnScreen().y + getSize().height; + while(!frameExited && y >= 0) { // move to the bottom of drop-down list + robot.mouseMove(x, --y); + Util.waitForIdle(robot); + } + + if(x < 0) { + throw new RuntimeException("Could not enter drop-down list!"); + } + + y -= choice.getHeight() / 2; + robot.mouseMove(x, y); // move to the last visible item in the drop-down list + Util.waitForIdle(robot); + + robot.mouseWheel(choice.getItemCount()); // wheel to the last item + Util.waitForIdle(robot); + + // click the last item + itemChanged = false; + robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); + Util.waitForIdle(robot); + robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); + Util.waitForIdle(robot); + + if(!itemChanged || choice.getSelectedIndex() != choice.getItemCount() - 1) { + throw new RuntimeException("Mouse Wheel scroll position error!"); + } + + System.exit(0); + + } catch (AWTException e) { + throw new RuntimeException("AWTException occurred - problem creating robot!"); + } + } +} + -- GitLab