0N/A/*
2362N/A * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved.
0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0N/A *
0N/A * This code is free software; you can redistribute it and/or modify it
0N/A * under the terms of the GNU General Public License version 2 only, as
0N/A * published by the Free Software Foundation.
0N/A *
0N/A * This code is distributed in the hope that it will be useful, but WITHOUT
0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0N/A * version 2 for more details (a copy is included in the LICENSE file that
0N/A * accompanied this code).
0N/A *
0N/A * You should have received a copy of the GNU General Public License version
0N/A * 2 along with this work; if not, write to the Free Software Foundation,
0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0N/A *
2362N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2362N/A * or visit www.oracle.com if you need additional information or have any
2362N/A * questions.
0N/A */
0N/A
0N/A /*
0N/A test
0N/A @bug 5039416 6404008
0N/A @summary REGRESSION: Extra mouse click dispatched after press-drag- release sequence.
0N/A @library ../../regtesthelpers
0N/A @build Util
0N/A @author andrei.dmitriev area=awt.event
0N/A @run applet ExtraMouseClick.html
0N/A */
0N/A
0N/Aimport java.applet.Applet;
0N/Aimport java.awt.*;
0N/Aimport java.awt.event.*;
0N/Aimport test.java.awt.regtesthelpers.Util;
0N/A
0N/A//**
0N/A// Here are two values of smugde used in this test (2 and 5). They should be on
0N/A// different sides from value 4 (smudge distance on both toolkits).
0N/A// Note that this test may not fail easily. But it must always pass on
0N/A// patched workspace.
0N/A//**
0N/A
0N/Apublic class ExtraMouseClick extends Applet
0N/A{
0N/A Frame frame = new Frame("Extra Click After MouseDrag");
0N/A final int TRIALS = 10;
0N/A final int SMUDGE_WIDTH = 4;
0N/A final int SMUDGE_HEIGHT = 4;
0N/A Robot robot;
0N/A Point fp; //frame's location on screen
0N/A boolean dragged = false;
0N/A boolean clicked = false;
0N/A boolean pressed = false;
0N/A boolean released = false;
0N/A
0N/A public void init()
0N/A {
0N/A this.setLayout (new BorderLayout ());
0N/A
0N/A frame.addMouseListener(new MouseAdapter() {
0N/A public void mousePressed(MouseEvent e) {
0N/A System.out.println("MousePressed");
0N/A pressed = true;
0N/A }
0N/A
0N/A public void mouseReleased(MouseEvent e) {
0N/A System.out.println("MouseReleased");
0N/A released = true;
0N/A }
0N/A
0N/A public void mouseClicked(MouseEvent e) {
0N/A System.out.println("MouseClicked!!!!");
0N/A clicked = true;
0N/A }
0N/A });
0N/A frame.addMouseMotionListener(new MouseMotionAdapter() {
0N/A public void mouseDragged(MouseEvent e) {
0N/A System.out.println("MouseDragged--"+e);
0N/A dragged = true;
0N/A }
0N/A public void mouseMoved(MouseEvent e) {
0N/A }
0N/A });
0N/A
0N/A }//End init()
0N/A
0N/A
0N/A public void start ()
0N/A {
0N/A frame.setSize(480, 300);
0N/A frame.setVisible(true);
0N/A try{
0N/A robot = new Robot();
0N/A }catch(AWTException e){
0N/A throw new RuntimeException(e);
0N/A }
0N/A
0N/A Util.waitForIdle(robot); //a time to show Frame
0N/A
0N/A fp = frame.getLocationOnScreen();
0N/A
0N/A for (int i = 0; i< TRIALS; i++){
0N/A checkClicked();
0N/A clearFlags();
0N/A }
0N/A
0N/A for (int i = 0; i< TRIALS; i++){
0N/A oneDrag(2);
0N/A clearFlags();
0N/A }
0N/A
0N/A for (int i = 0; i< TRIALS; i++){
0N/A oneDrag(5);
0N/A clearFlags();
0N/A }
0N/A
0N/A for (int i = 0; i< TRIALS; i++){
0N/A oneDrag(70);
0N/A clearFlags();
0N/A }
0N/A
0N/A //Check that no Drag event occur in the SMUDGE area
0N/A String sToolkit = Toolkit.getDefaultToolkit().getClass().getName();
0N/A System.out.println("Toolkit == "+sToolkit);
0N/A if ("sun.awt.windows.WToolkit".equals(sToolkit)){
0N/A int dragWidth = ((Integer)Toolkit.getDefaultToolkit().
0N/A getDesktopProperty("win.drag.width")).intValue();
0N/A int dragHeight = ((Integer)Toolkit.getDefaultToolkit().
0N/A getDesktopProperty("win.drag.height")).intValue();
0N/A System.out.println("dragWidth=="+dragWidth+":: dragHeight=="+dragHeight);
0N/A // DragWidth and dragHeight may be equal to 1. In that case the SMUDGE rectangle
0N/A // narrowed into 1x1 pixel and we can't drag a mouse in it.
0N/A // In that case we may skip following testcase but I'd prefer if we move mouse on 1 pixel only.
0N/A // And that should pass as well.
0N/A dragWidth = dragWidth > 1? dragWidth/2:1;
0N/A dragHeight = dragHeight > 1? dragHeight/2:1;
0N/A for (int i = 0; i< TRIALS; i++){
0N/A smallWin32Drag(dragWidth, dragHeight);
0N/A clearFlags();
0N/A }
0N/A }else{
0N/A for (int i = 0; i< TRIALS; i++){
0N/A smallDrag(SMUDGE_WIDTH - 1, SMUDGE_HEIGHT - 1); //on Motif and XAWT SMUDGE area is 4-pixels wide
0N/A clearFlags();
0N/A }
0N/A }
0N/A System.out.println("Test passed.");
0N/A }// start()
0N/A
0N/A public void oneDrag(int pixels){
0N/A robot.mouseMove(fp.x + frame.getWidth()/2, fp.y + frame.getHeight()/2 );
0N/A //drag for a short distance
0N/A robot.mousePress(InputEvent.BUTTON1_MASK );
0N/A for (int i = 1; i<pixels;i++){
0N/A robot.mouseMove(fp.x + frame.getWidth()/2 + i, fp.y + frame.getHeight()/2 );
0N/A }
0N/A robot.mouseRelease(InputEvent.BUTTON1_MASK );
0N/A robot.delay(1000);
0N/A if (dragged && clicked){
0N/A throw new RuntimeException("Test failed. Clicked event follows by Dragged. Dragged = "+dragged +". Clicked = "+clicked + " : distance = "+pixels);
0N/A }
0N/A }
0N/A
0N/A public void smallDrag(int pixelsX, int pixelsY){
0N/A // by the X-axis
0N/A robot.mouseMove(fp.x + frame.getWidth()/2, fp.y + frame.getHeight()/2 );
0N/A //drag for a short distance
0N/A robot.mousePress(InputEvent.BUTTON1_MASK );
0N/A for (int i = 1; i<pixelsX;i++){
0N/A robot.mouseMove(fp.x + frame.getWidth()/2 + i, fp.y + frame.getHeight()/2 );
0N/A }
0N/A robot.mouseRelease(InputEvent.BUTTON1_MASK );
0N/A robot.delay(1000);
0N/A if (dragged){
0N/A throw new RuntimeException("Test failed. Dragged event (by the X-axis) occured in SMUDGE area. Dragged = "+dragged +". Clicked = "+clicked);
0N/A }
0N/A
0N/A // the same with Y-axis
0N/A robot.mouseMove(fp.x + frame.getWidth()/2, fp.y + frame.getHeight()/2 );
0N/A robot.mousePress(InputEvent.BUTTON1_MASK );
0N/A for (int i = 1; i<pixelsY;i++){
0N/A robot.mouseMove(fp.x + frame.getWidth()/2, fp.y + frame.getHeight()/2 + i );
0N/A }
0N/A robot.mouseRelease(InputEvent.BUTTON1_MASK );
0N/A robot.delay(1000);
0N/A if (dragged){
0N/A throw new RuntimeException("Test failed. Dragged event (by the Y-axis) occured in SMUDGE area. Dragged = "+dragged +". Clicked = "+clicked);
0N/A }
0N/A
0N/A }
0N/A
0N/A // The difference between X-system and Win32: on Win32 Dragged event start to be generated after any mouse drag.
0N/A // On X-systems Dragged event first fired when mouse has left the SMUDGE area
0N/A public void smallWin32Drag(int pixelsX, int pixelsY){
0N/A // by the X-axis
0N/A robot.mouseMove(fp.x + frame.getWidth()/2, fp.y + frame.getHeight()/2 );
0N/A //drag for a short distance
0N/A robot.mousePress(InputEvent.BUTTON1_MASK );
0N/A System.out.println(" pixelsX = "+ pixelsX +" pixelsY = " +pixelsY);
0N/A for (int i = 1; i<=pixelsX;i++){
0N/A System.out.println("Moving a mouse by X");
0N/A robot.mouseMove(fp.x + frame.getWidth()/2 + i, fp.y + frame.getHeight()/2 );
0N/A }
0N/A robot.mouseRelease(InputEvent.BUTTON1_MASK );
0N/A robot.delay(1000);
0N/A if (!dragged){
0N/A throw new RuntimeException("Test failed. Dragged event (by the X-axis) didn't occur in the SMUDGE area. Dragged = "+dragged);
0N/A }
0N/A
0N/A // the same with Y-axis
0N/A robot.mouseMove(fp.x + frame.getWidth()/2, fp.y + frame.getHeight()/2 );
0N/A robot.mousePress(InputEvent.BUTTON1_MASK );
0N/A for (int i = 1; i<=pixelsY;i++){
0N/A System.out.println("Moving a mouse by Y");
0N/A robot.mouseMove(fp.x + frame.getWidth()/2, fp.y + frame.getHeight()/2 + i );
0N/A }
0N/A robot.mouseRelease(InputEvent.BUTTON1_MASK );
0N/A robot.delay(1000);
0N/A if (!dragged){
0N/A throw new RuntimeException("Test failed. Dragged event (by the Y-axis) didn't occur in the SMUDGE area. Dragged = "+dragged);
0N/A }
0N/A }
0N/A
0N/A public void checkClicked(){
0N/A robot.mouseMove(fp.x + frame.getWidth()/2, fp.y + frame.getHeight()/2 );
0N/A robot.mousePress(InputEvent.BUTTON1_MASK );
0N/A robot.delay(10);
0N/A robot.mouseRelease(InputEvent.BUTTON1_MASK );
0N/A robot.delay(1000);
0N/A if (!clicked || !pressed || !released || dragged){
0N/A throw new RuntimeException("Test failed. Some of Pressed/Released/Clicked events are missed or dragged occured. Pressed/Released/Clicked/Dragged = "+pressed + ":"+released+":"+clicked +":" +dragged);
0N/A }
0N/A }
0N/A
0N/A public void clearFlags(){
0N/A clicked = false;
0N/A pressed = false;
0N/A released = false;
0N/A dragged = false;
0N/A }
0N/A}// class