5124N/A/*
5124N/A * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved.
5124N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5124N/A *
5124N/A * This code is free software; you can redistribute it and/or modify it
5124N/A * under the terms of the GNU General Public License version 2 only, as
5124N/A * published by the Free Software Foundation.
5124N/A *
5124N/A * This code is distributed in the hope that it will be useful, but WITHOUT
5124N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
5124N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
5124N/A * version 2 for more details (a copy is included in the LICENSE file that
5124N/A * accompanied this code).
5124N/A *
5124N/A * You should have received a copy of the GNU General Public License version
5124N/A * 2 along with this work; if not, write to the Free Software Foundation,
5124N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
5124N/A *
5124N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
5124N/A * or visit www.oracle.com if you need additional information or have any
5124N/A * questions.
5124N/A */
5124N/A
5124N/A/*
5124N/A * @test
5124N/A * @bug 7154048
5124N/A * @summary Window created under a mouse does not receive mouse enter event.
5124N/A * Mouse Entered/Exited events should be generated during dragging the window
5124N/A * out of the frame and to the frame.
5124N/A * @library ../../regtesthelpers
5124N/A * @build Util
5124N/A * @author alexandr.scherbatiy area=awt.event
5124N/A * @run main DragWindowOutOfFrameTest
5124N/A */
5124N/Aimport java.awt.*;
5124N/Aimport java.awt.event.*;
5124N/Aimport javax.swing.*;
5124N/A
5124N/Aimport java.util.concurrent.*;
5124N/Aimport sun.awt.SunToolkit;
5124N/A
5124N/Aimport test.java.awt.regtesthelpers.Util;
5124N/A
5124N/Apublic class DragWindowOutOfFrameTest {
5124N/A
5124N/A private static volatile int dragWindowMouseEnteredCount = 0;
5124N/A private static volatile int dragWindowMouseExitedCount = 0;
5124N/A private static volatile int dragWindowMouseReleasedCount = 0;
5124N/A private static volatile int buttonMouseEnteredCount = 0;
5124N/A private static volatile int buttonMouseExitedCount = 0;
5124N/A private static volatile int labelMouseEnteredCount = 0;
5124N/A private static volatile int labelMouseExitedCount = 0;
5124N/A private static volatile int labelMouseReleasedCount = 0;
5124N/A private static MyDragWindow dragWindow;
5124N/A private static JLabel label;
5124N/A private static JButton button;
5124N/A
5124N/A public static void main(String[] args) throws Exception {
5124N/A
5124N/A SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
5124N/A Robot robot = new Robot();
5124N/A robot.setAutoDelay(50);
5124N/A
5124N/A SwingUtilities.invokeAndWait(new Runnable() {
5124N/A
5124N/A @Override
5124N/A public void run() {
5124N/A createAndShowGUI();
5124N/A }
5124N/A });
5124N/A
5124N/A toolkit.realSync();
5124N/A
5124N/A Point pointToClick = Util.invokeOnEDT(new Callable<Point>() {
5124N/A
5124N/A @Override
5124N/A public Point call() throws Exception {
5124N/A return getCenterPoint(label);
5124N/A }
5124N/A });
5124N/A
5124N/A
5124N/A robot.mouseMove(pointToClick.x, pointToClick.y);
5124N/A robot.mousePress(InputEvent.BUTTON1_MASK);
5124N/A toolkit.realSync();
5124N/A
5124N/A if (dragWindowMouseEnteredCount != 1 && dragWindowMouseExitedCount != 0) {
5124N/A throw new RuntimeException(
5124N/A "Wrong number mouse Entered/Exited events on Drag Window!");
5124N/A }
5124N/A
5124N/A Point pointToDrag = Util.invokeOnEDT(new Callable<Point>() {
5124N/A
5124N/A @Override
5124N/A public Point call() throws Exception {
5124N/A label.addMouseListener(new LabelMouseListener());
5124N/A button.addMouseListener(new ButtonMouseListener());
5124N/A return getCenterPoint(button);
5124N/A }
5124N/A });
5124N/A
5124N/A robot.mouseMove(450, pointToClick.y);
5124N/A toolkit.realSync();
5124N/A
5124N/A if (labelMouseEnteredCount != 0 && labelMouseExitedCount != 1) {
5124N/A throw new RuntimeException(
5124N/A "Wrong number Mouse Entered/Exited events on label!");
5124N/A }
5124N/A
5124N/A robot.mouseMove(450, pointToDrag.y);
5124N/A toolkit.realSync();
5124N/A
5124N/A if (labelMouseEnteredCount != 0 && labelMouseExitedCount != 1) {
5124N/A throw new RuntimeException(
5124N/A "Wrong number Mouse Entered/Exited events on label!");
5124N/A }
5124N/A
5124N/A if (buttonMouseEnteredCount != 0 && buttonMouseExitedCount != 0) {
5124N/A throw new RuntimeException(
5124N/A "Wrong number Mouse Entered/Exited events on button!");
5124N/A }
5124N/A
5124N/A robot.mouseMove(pointToDrag.y, pointToDrag.y);
5124N/A toolkit.realSync();
5124N/A
5124N/A if (buttonMouseEnteredCount != 1 && buttonMouseExitedCount != 0) {
5124N/A throw new RuntimeException(
5124N/A "Wrong number Mouse Entered/Exited events on button!");
5124N/A }
5124N/A
5124N/A robot.mouseRelease(InputEvent.BUTTON1_MASK);
5124N/A toolkit.realSync();
5124N/A
5124N/A if (labelMouseReleasedCount != 1) {
5124N/A throw new RuntimeException("No MouseReleased event on label!");
5124N/A }
5124N/A }
5124N/A
5124N/A private static Point getCenterPoint(Component comp) {
5124N/A Point p = comp.getLocationOnScreen();
5124N/A Rectangle rect = comp.getBounds();
5124N/A return new Point(p.x + rect.width / 2, p.y + rect.height / 2);
5124N/A }
5124N/A
5124N/A private static void createAndShowGUI() {
5124N/A
5124N/A JFrame frame = new JFrame("Main Frame");
5124N/A frame.setLocation(100, 100);
5124N/A frame.setSize(300, 200);
5124N/A frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
5124N/A
5124N/A label = new JLabel("Label");
5124N/A
5124N/A DragWindowCreationMouseListener listener = new DragWindowCreationMouseListener(frame);
5124N/A label.addMouseListener(listener);
5124N/A label.addMouseMotionListener(listener);
5124N/A
5124N/A button = new JButton("Button");
5124N/A Panel panel = new Panel(new BorderLayout());
5124N/A
5124N/A panel.add(label, BorderLayout.NORTH);
5124N/A panel.add(button, BorderLayout.CENTER);
5124N/A
5124N/A frame.getContentPane().add(panel);
5124N/A frame.setVisible(true);
5124N/A
5124N/A }
5124N/A
5124N/A private static Point getAbsoluteLocation(MouseEvent e) {
5124N/A return new Point(e.getXOnScreen(), e.getYOnScreen());
5124N/A }
5124N/A
5124N/A static class MyDragWindow extends Window {
5124N/A
5124N/A public MyDragWindow(Window parent, Point location) {
5124N/A super(parent);
5124N/A setSize(500, 300);
5124N/A setVisible(true);
5124N/A JPanel panel = new JPanel();
5124N/A add(panel);
5124N/A setLocation(location.x - 250, location.y - 150);
5124N/A addMouseListener(new DragWindowMouseListener());
5124N/A }
5124N/A
5124N/A void dragTo(Point point) {
5124N/A setLocation(point.x - 250, point.y - 150);
5124N/A }
5124N/A }
5124N/A
5124N/A static class DragWindowCreationMouseListener extends MouseAdapter {
5124N/A
5124N/A Point origin;
5124N/A Window parent;
5124N/A
5124N/A public DragWindowCreationMouseListener(Window parent) {
5124N/A this.parent = parent;
5124N/A }
5124N/A
5124N/A @Override
5124N/A public void mousePressed(MouseEvent e) {
5124N/A if (dragWindow == null) {
5124N/A dragWindow = new MyDragWindow(parent, getAbsoluteLocation(e));
5124N/A } else {
5124N/A dragWindow.setVisible(true);
5124N/A dragWindow.dragTo(getAbsoluteLocation(e));
5124N/A }
5124N/A }
5124N/A
5124N/A @Override
5124N/A public void mouseReleased(MouseEvent e) {
5124N/A labelMouseReleasedCount++;
5124N/A if (dragWindow != null) {
5124N/A dragWindow.setVisible(false);
5124N/A }
5124N/A }
5124N/A
5124N/A public void mouseDragged(MouseEvent e) {
5124N/A if (dragWindow != null) {
5124N/A dragWindow.dragTo(getAbsoluteLocation(e));
5124N/A }
5124N/A }
5124N/A }
5124N/A
5124N/A static class DragWindowMouseListener extends MouseAdapter {
5124N/A
5124N/A @Override
5124N/A public void mouseEntered(MouseEvent e) {
5124N/A dragWindowMouseEnteredCount++;
5124N/A }
5124N/A
5124N/A @Override
5124N/A public void mouseExited(MouseEvent e) {
5124N/A dragWindowMouseExitedCount++;
5124N/A }
5124N/A
5124N/A @Override
5124N/A public void mouseReleased(MouseEvent e) {
5124N/A dragWindowMouseReleasedCount++;
5124N/A }
5124N/A }
5124N/A
5124N/A static class LabelMouseListener extends MouseAdapter {
5124N/A
5124N/A @Override
5124N/A public void mouseEntered(MouseEvent e) {
5124N/A labelMouseEnteredCount++;
5124N/A }
5124N/A
5124N/A @Override
5124N/A public void mouseExited(MouseEvent e) {
5124N/A labelMouseExitedCount++;
5124N/A }
5124N/A }
5124N/A
5124N/A static class ButtonMouseListener extends MouseAdapter {
5124N/A
5124N/A @Override
5124N/A public void mouseEntered(MouseEvent e) {
5124N/A buttonMouseEnteredCount++;
5124N/A }
5124N/A
5124N/A @Override
5124N/A public void mouseExited(MouseEvent e) {
5124N/A buttonMouseExitedCount++;
5124N/A }
5124N/A }
5124N/A}