--- /dev/null 2016-02-01 12:22:10.684854000 +0530 +++ new/test/java/awt/LightweightComponent/LightweightEventTest/LightweightEventTest.java 2016-02-01 15:58:51.820603718 +0530 @@ -0,0 +1,304 @@ +/* + * Copyright (c) 2016 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 + * @summary Test of mouse move messages to lightweight components + * @library ../../regtesthelpers + * @build Util + * @compile LightweightEventTest.java + * @run main LightweightEventTest + */ +import java.awt.BorderLayout; +import java.awt.Button; +import java.awt.Color; +import java.awt.Component; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.FontMetrics; +import java.awt.Frame; +import java.awt.Graphics; +import java.awt.Insets; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.Robot; +import java.awt.AWTException; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import javax.swing.SwingUtilities; +import test.java.awt.regtesthelpers.Util; + + +/* +There are 3 steps to this test : +1. Two frames are created one with heavy weight component and + another with light weight component. Each frame has a centrally placed + button +2. Mouse is dragged along diagonals of each window using Robot object +3. Events are noted for mouse in and out of frames & buttons and asserted +*/ + +public class LightweightEventTest { + + private static EventBug HeavyComponent; + private static EventBug LightComponent; + private static Robot testRobot; + + public static void main(String[] args) throws Throwable { + + SwingUtilities.invokeAndWait(new Runnable() { + @Override + public void run() { + constructTestUI(); + } + }); + + try { + testRobot = new Robot(); + } catch (AWTException ex) { + throw new RuntimeException("Could not initiate a drag operation"); + } + + testRobot.waitForIdle(); + + // Method performing auto test operation + boolean result = test(); + + disposeTestUI(); + + if (result == false) { + throw new RuntimeException("Test FAILED!"); + } + } + + private static boolean test() { + // Test events for HeavyComponent + Point loc = HeavyComponent.getLocationOnScreen(); + Dimension size = HeavyComponent.getSize(); + + Util.mouseMove(testRobot, + new Point((int) loc.x + 4, (int) loc.y + 4), + new Point((int) loc.x + size.width, (int) loc.y + size.height)); + + testRobot.waitForIdle(); + + boolean HeavyComponentAssert = HeavyComponent.assertEvents(2, 1); + + // Test events for LightComponent + loc = LightComponent.getLocationOnScreen(); + size = LightComponent.getSize(); + + Util.mouseMove(testRobot, + new Point((int) loc.x + 4, (int) loc.y + 4), + new Point((int) loc.x + size.width, (int) loc.y + size.height)); + + testRobot.waitForIdle(); + + boolean LightComponentAssert = LightComponent.assertEvents(2, 1); + + return (HeavyComponentAssert && LightComponentAssert); + } + + private static void constructTestUI() { + // here, create the items that will be tested for correct behavior + HeavyComponent = new EventBug(); + Button b = (Button) HeavyComponent.add("Center", new Button("Heavy")); + + LightComponent = new EventBug(); + BorderedLabel b1 = (BorderedLabel) LightComponent.add("Center", + new BorderedLabel("Lite")); + + HeavyComponent.addListeners(b); + LightComponent.addListeners(b1); + + LightComponent.setLocation(200, 0); + HeavyComponent.setVisible(true); + LightComponent.setVisible(true); + } + + private static void disposeTestUI() { + HeavyComponent.setVisible(false); + LightComponent.setVisible(false); + + HeavyComponent.dispose(); + LightComponent.dispose(); + } +} + +/* + * Lightweight component + */ +class BorderedLabel extends Component { + + boolean superIsButton = false; + String labelString; + + BorderedLabel(String labelString) { + this.labelString = labelString; + + Component thisComponent = this; + superIsButton = (thisComponent instanceof Button); + if (superIsButton) { + ((Button) thisComponent).setLabel(labelString); + } + } + + @Override + public Dimension getMinimumSize() { + Dimension minSize = new Dimension(); + + if (superIsButton) { + minSize = super.getMinimumSize(); + } else { + + Graphics g = getGraphics(); + FontMetrics metrics = g.getFontMetrics(); + + minSize.width = metrics.stringWidth(labelString) + 14; + minSize.height = metrics.getMaxAscent() + + metrics.getMaxDescent() + 9; + + g.dispose(); + g = null; + } + return minSize; + } + + @Override + public Dimension getPreferredSize() { + Dimension prefSize; + if (superIsButton) { + prefSize = super.getPreferredSize(); + } else { + prefSize = getMinimumSize(); + } + return prefSize; + } + + @Override + public void paint(Graphics g) { + + super.paint(g); + Rectangle bounds = getBounds(); + if (superIsButton) { + return; + } + Dimension size = getSize(); + Color oldColor = g.getColor(); + + // draw border + g.setColor(getBackground()); + g.fill3DRect(0, 0, size.width, size.height, false); + g.fill3DRect(3, 3, size.width - 6, size.height - 6, true); + + // draw text + FontMetrics metrics = g.getFontMetrics(); + int centerX = size.width / 2; + int centerY = size.height / 2; + int textX = centerX - (metrics.stringWidth(labelString) / 2); + int textY = centerY + + ((metrics.getMaxAscent() + metrics.getMaxDescent()) / 2); + g.setColor(getForeground()); + g.drawString(labelString, textX, textY); + + g.setColor(oldColor); + } +} // class BorderedLabel + +class EventBug extends Container { + + Frame testFrame; + int frameEnters = 0; + int frameExits = 0; + int buttonEnters = 0; + int buttonExits = 0; + + public EventBug() { + super(); + testFrame = new Frame(); + testFrame.setLayout(new BorderLayout()); + this.setLayout(new BorderLayout()); + testFrame.add("Center", this); + testFrame.pack(); + testFrame.setVisible(true); + } + + @Override + public Dimension getPreferredSize() { + return new Dimension(100, 100); + } + + @Override + public Insets getInsets() { + return new Insets(20, 20, 20, 20); + } + + public boolean assertEvents(int expectedFrameEnterEvents, + int expectedButtonEnterEvents) { + return (frameEnters == expectedFrameEnterEvents) + && (buttonEnters == expectedButtonEnterEvents); + } + + // Forward to the Window + @Override + public void setLocation(int x, int y) { + testFrame.setLocation(x, y); + } + + @Override + public void setVisible(boolean b) { + testFrame.setVisible(b); + } + + public void dispose() { + testFrame.dispose(); + } + + // Add listeners to Frame and button + public void addListeners(Component b) { + b.setName("Button"); + b.addMouseListener(new MouseAdapter() { + @Override + public void mouseEntered(MouseEvent e) { + buttonEnters++; + } + + @Override + public void mouseExited(MouseEvent e) { + buttonExits++; + } + + }); + testFrame.addMouseListener(new MouseAdapter() { + @Override + public void mouseEntered(MouseEvent e) { + frameEnters++; + } + + @Override + public void mouseExited(MouseEvent e) { + frameExits++; + } + }); + } +} // class EventBug