# HG changeset patch # User dcherepanov # Date 1237816059 14400 # Node ID adaee95315043e19000a2d1a466311380d61c8c5 # Parent 55f02057dc3716ff4fe4cc7ab963783897c286a0 6730447: Support for high resolution mouse wheel is still incomplete. AWT panel needs to be supported Reviewed-by: art, dav diff -r 55f02057dc37 -r adaee9531504 src/windows/native/sun/windows/awt_Component.cpp --- a/src/windows/native/sun/windows/awt_Component.cpp Mon Mar 23 11:59:55 2009 +0300 +++ b/src/windows/native/sun/windows/awt_Component.cpp Mon Mar 23 09:47:39 2009 -0400 @@ -205,8 +205,6 @@ CriticalSection windowMoveLock; BOOL windowMoveLockHeld = FALSE; -int AwtComponent::sm_wheelRotationAmount = 0; - /************************************************************************ * AwtComponent methods */ @@ -246,6 +244,7 @@ m_bSubclassed = FALSE; m_MessagesProcessing = 0; + m_wheelRotationAmount = 0; } AwtComponent::~AwtComponent() @@ -2014,13 +2013,13 @@ MsgRouting AwtComponent::WmSetFocus(HWND hWndLostFocus) { - sm_wheelRotationAmount = 0; + m_wheelRotationAmount = 0; return mrDoDefault; } MsgRouting AwtComponent::WmKillFocus(HWND hWndGotFocus) { - sm_wheelRotationAmount = 0; + m_wheelRotationAmount = 0; return mrDoDefault; } @@ -2431,11 +2430,11 @@ BOOL result; UINT platformLines; - sm_wheelRotationAmount += wheelRotation; + m_wheelRotationAmount += wheelRotation; // AWT interprets wheel rotation differently than win32, so we need to // decode wheel amount. - jint roundedWheelRotation = sm_wheelRotationAmount / (-1 * WHEEL_DELTA); + jint roundedWheelRotation = m_wheelRotationAmount / (-1 * WHEEL_DELTA); jdouble preciseWheelRotation = (jdouble) wheelRotation / (-1 * WHEEL_DELTA); MSG msg; @@ -2461,7 +2460,9 @@ eventPt.x, eventPt.y, GetJavaModifiers(), 0, 0, scrollType, scrollLines, roundedWheelRotation, preciseWheelRotation, &msg); - sm_wheelRotationAmount %= WHEEL_DELTA; + m_wheelRotationAmount %= WHEEL_DELTA; + // this message could be propagated up to the parent chain + // by the mouse message post processors return mrConsume; } diff -r 55f02057dc37 -r adaee9531504 src/windows/native/sun/windows/awt_Component.h --- a/src/windows/native/sun/windows/awt_Component.h Mon Mar 23 11:59:55 2009 +0300 +++ b/src/windows/native/sun/windows/awt_Component.h Mon Mar 23 09:47:39 2009 -0400 @@ -807,7 +807,7 @@ int windowMoveLockPosCY; // 6524352: support finer-resolution - static int sm_wheelRotationAmount; + int m_wheelRotationAmount; /* * The association list of children's IDs and corresponding components. diff -r 55f02057dc37 -r adaee9531504 test/java/awt/event/MouseEvent/AWTPanelSmoothWheel/AWTPanelSmoothWheel.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/awt/event/MouseEvent/AWTPanelSmoothWheel/AWTPanelSmoothWheel.html Mon Mar 23 09:47:39 2009 -0400 @@ -0,0 +1,20 @@ + + + + AWTPanelSmoothWheel + + + +

AWTPanelSmoothWheel
Bug ID: 6730447

+ +

See the dialog box (usually in upper left corner) for instructions

+ + + + diff -r 55f02057dc37 -r adaee9531504 test/java/awt/event/MouseEvent/AWTPanelSmoothWheel/AWTPanelSmoothWheel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/awt/event/MouseEvent/AWTPanelSmoothWheel/AWTPanelSmoothWheel.java Mon Mar 23 09:47:39 2009 -0400 @@ -0,0 +1,251 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + test + @bug 6730447 + @summary Support for high resolution mouse wheel is still incomplete. AWT panel needs to be supported + @author dmitry.cherepanov@...: area=awt.mouse + @run applet/manual=yesno AWTPanelSmoothWheel.html +*/ + +/** + * AWTPanelSmoothWheel.java + * + * summary: + */ + +import java.applet.Applet; +import java.awt.*; +import java.awt.event.*; + +//Manual tests should run as applet tests if possible because they +// get their environments cleaned up, including AWT threads, any +// test created threads, and any system resources used by the test +// such as file descriptors. (This is normally not a problem as +// main tests usually run in a separate VM, however on some platforms +// such as the Mac, separate VMs are not possible and non-applet +// tests will cause problems). Also, you don't have to worry about +// synchronisation stuff in Applet tests the way you do in main +// tests... + + +public class AWTPanelSmoothWheel extends Applet +{ + //Declare things used in the test, like buttons and labels here + + public void init() + { + //Create instructions for the user here, as well as set up + // the environment -- set the layout manager, add buttons, + // etc. + this.setLayout (new BorderLayout ()); + + String[] instructions = + { + " the test is relevant for windows platforms and ", + " mouses with high-resolution wheel, please just press pass if it's not the case ", + " place the mouse cursor above the green panel and rotate the mouse wheel " , + " the test will print all mouse wheel messages into the logging panel, ", + " please make sure that some of the messages have non-zero 'wheelRotation' value ", + " in this case the test passes, otherwise it fails, ", + " please make sure the test works OK if the mouse wheel is rotated very slow " + }; + Sysout.createDialogWithInstructions( instructions ); + + }//End init() + + public void start () + { + Panel panel = new Panel(); + panel.setBackground(Color.green); + panel.addMouseWheelListener(new MouseWheelListener() { + public void mouseWheelMoved(MouseWheelEvent e) { + Sysout.println(e.toString()); + } + }); + + //Get things going. Request focus, set size, et cetera + setSize (200,200); + setLayout(new BorderLayout()); + add(panel, BorderLayout.CENTER); + setVisible(true); + validate(); + + //What would normally go into main() will probably go here. + //Use System.out.println for diagnostic messages that you want + // to read after the test is done. + //Use Sysout.println for messages you want the tester to read. + + }// start() + + //The rest of this class is the actions which perform the test... + + //Use Sysout.println to communicate with the user NOT System.out!! + //Sysout.println ("Something Happened!"); + +}// class ManualYesNoTest + +/* Place other classes related to the test after this line */ + + + + + +/**************************************************** + Standard Test Machinery + DO NOT modify anything below -- it's a standard + chunk of code whose purpose is to make user + interaction uniform, and thereby make it simpler + to read and understand someone else's test. + ****************************************************/ + +/** + This is part of the standard test machinery. + It creates a dialog (with the instructions), and is the interface + for sending text messages to the user. + To print the instructions, send an array of strings to Sysout.createDialog + WithInstructions method. Put one line of instructions per array entry. + To display a message for the tester to see, simply call Sysout.println + with the string to be displayed. + This mimics System.out.println but works within the test harness as well + as standalone. + */ + +class Sysout +{ + private static TestDialog dialog; + + public static void createDialogWithInstructions( String[] instructions ) + { + dialog = new TestDialog( new Frame(), "Instructions" ); + dialog.printInstructions( instructions ); + dialog.setVisible(true); + println( "Any messages for the tester will display here." ); + } + + public static void createDialog( ) + { + dialog = new TestDialog( new Frame(), "Instructions" ); + String[] defInstr = { "Instructions will appear here. ", "" } ; + dialog.printInstructions( defInstr ); + dialog.setVisible(true); + println( "Any messages for the tester will display here." ); + } + + + public static void printInstructions( String[] instructions ) + { + dialog.printInstructions( instructions ); + } + + + public static void println( String messageIn ) + { + dialog.displayMessage( messageIn ); + } + +}// Sysout class + +/** + This is part of the standard test machinery. It provides a place for the + test instructions to be displayed, and a place for interactive messages + to the user to be displayed. + To have the test instructions displayed, see Sysout. + To have a message to the user be displayed, see Sysout. + Do not call anything in this dialog directly. + */ +class TestDialog extends Dialog +{ + + TextArea instructionsText; + TextArea messageText; + int maxStringLength = 80; + + //DO NOT call this directly, go through Sysout + public TestDialog( Frame frame, String name ) + { + super( frame, name ); + int scrollBoth = TextArea.SCROLLBARS_BOTH; + instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth ); + add( "North", instructionsText ); + + messageText = new TextArea( "", 5, maxStringLength, scrollBoth ); + add("Center", messageText); + + pack(); + + setVisible(true); + }// TestDialog() + + //DO NOT call this directly, go through Sysout + public void printInstructions( String[] instructions ) + { + //Clear out any current instructions + instructionsText.setText( "" ); + + //Go down array of instruction strings + + String printStr, remainingStr; + for( int i=0; i < instructions.length; i++ ) + { + //chop up each into pieces maxSringLength long + remainingStr = instructions[ i ]; + while( remainingStr.length() > 0 ) + { + //if longer than max then chop off first max chars to print + if( remainingStr.length() >= maxStringLength ) + { + //Try to chop on a word boundary + int posOfSpace = remainingStr. + lastIndexOf( ' ', maxStringLength - 1 ); + + if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1; + + printStr = remainingStr.substring( 0, posOfSpace + 1 ); + remainingStr = remainingStr.substring( posOfSpace + 1 ); + } + //else just print + else + { + printStr = remainingStr; + remainingStr = ""; + } + + instructionsText.append( printStr + "\n" ); + + }// while + + }// for + + }//printInstructions() + + //DO NOT call this directly, go through Sysout + public void displayMessage( String messageIn ) + { + messageText.append( messageIn + "\n" ); + System.out.println(messageIn); + } + +}// TestDialog class +