1 /*
   2  * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 /*
  25   @test
  26   @bug 6317481 8012325
  27   @summary REG:Pressing the mouse, dragging and releasing it outside the button triggers ActionEvent, XAWT
  28   @author Dmitry.Cherepanov@SUN.COM area=awt.event
  29   @run main EnterAsGrabbedEvent
  30 */
  31 
  32 import javax.swing.*;
  33 import java.awt.*;
  34 import java.awt.event.*;
  35 
  36 public class EnterAsGrabbedEvent
  37 {
  38     //Declare things used in the test, like buttons and labels here
  39     private static Frame frame;
  40     private static Button button;
  41     private static volatile boolean enterTriggered = false;
  42     private static volatile boolean actionTriggered = false;
  43 
  44     private static void init()
  45     {
  46         frame = new Frame();
  47         frame.setLayout(new FlowLayout());
  48         button = new Button("button");
  49         button.addActionListener(actionEvent -> {
  50             actionTriggered = true;
  51         });
  52         frame.add(button);
  53         frame.setBounds(100, 100, 200, 200);
  54         frame.setVisible(true);
  55         frame.validate();
  56       }
  57 
  58     public static void main(String[] args) throws Exception {
  59         try {
  60             Robot r = new Robot();
  61             r.setAutoDelay(200);
  62             r.setAutoWaitForIdle(true);
  63             SwingUtilities.invokeAndWait(EnterAsGrabbedEvent::init);
  64             r.waitForIdle();
  65 
  66             Point loc = button.getLocationOnScreen();
  67             r.mouseMove(loc.x+button.getWidth()/2, loc.y+button.getHeight()/2);
  68             r.mousePress(InputEvent.BUTTON1_MASK);
  69 
  70             // in this case (drag mouse outside the button):
  71             // NotifyEnter (->MouseEnter) should be dispatched to the top-level
  72             // event if the grabbed window is the component (button)
  73             frame.addMouseListener(
  74                     new MouseAdapter() {
  75                         public void mouseEntered(MouseEvent me) {
  76                             System.out.println(me);
  77                             enterTriggered = true;
  78                         }
  79 
  80                         // Just for tracing
  81                         public void mouseExited(MouseEvent me) {
  82                             System.out.println(me);
  83                         }
  84                     });
  85 
  86             // Just for tracing
  87             button.addMouseListener(
  88                     new MouseAdapter(){
  89                         public void mouseEntered(MouseEvent me){
  90                             System.out.println(me);
  91                         }
  92                         public void mouseExited(MouseEvent me){
  93                             System.out.println(me);
  94                         }
  95                     });
  96 
  97             r.mouseMove(loc.x+button.getWidth() + 1, loc.y+button.getHeight()/2);
  98 
  99             r.mouseRelease(InputEvent.BUTTON1_MASK);
 100 
 101             if (!enterTriggered) {
 102                 throw new RuntimeException("Test failed. MouseEntered was not triggered");
 103             }
 104 
 105             if (actionTriggered) {
 106                 throw new RuntimeException("Test failed. ActionEvent triggered");
 107             }
 108         } finally {
 109             if (frame != null) {
 110                 frame.dispose();
 111             }
 112         }
 113     }
 114 }