1/*
2 * Copyright (c) 1998, 2017, 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
24import java.awt.*;
25import java.awt.event.*;
26
27/**
28 * @test
29 * @key headful
30 * @bug 4449139
31 * @summary test MouseWheelEvent generation by Scrollbar component
32 */
33
34public final class ScrollbarMouseWheelTest
35        implements MouseWheelListener, WindowListener {
36
37    final static String tk = Toolkit.getDefaultToolkit().getClass().getName();
38    final static int REPS = 5;
39    // There is a bug on Windows: 4616935.
40    // Wheel events comes to every component in the hierarchy so we should
41    // check a platform.
42    // There are two scrollbars within one Panel and both accept 5 clicks, so
43    // Panel would accept 5*2 clicks on Windows.
44    final static int PANEL_REPS = tk.equals("sun.awt.windows.WToolkit")? REPS * 2: REPS;
45
46    Scrollbar sb1;
47    Scrollbar sb2;
48    Panel pnl;
49    class Sema {
50        boolean flag;
51        boolean getVal() { return flag;}
52        void setVal(boolean b) { flag = b;}
53    }
54    Sema sema = new Sema();
55
56    Robot robot;
57
58    int sb1upevents, sb2upevents, pnlupevents;
59    int sb1downevents, sb2downevents, pnldownevents;
60
61    public static void main(final String[] args) {
62        new ScrollbarMouseWheelTest().test();
63    }
64
65    public void test() {
66        // Move mouse to upper-right area
67        try {
68            robot = new Robot();
69        } catch (AWTException e) {
70            System.out.println("Problem creating Robot.  FAIL.");
71            throw new RuntimeException("Problem creating Robot.  FAIL.");
72
73        }
74
75        robot.setAutoDelay(500);
76        robot.setAutoWaitForIdle(true);
77
78        // Show test Frame
79        Frame frame = new Frame("ScrollbarMouseWheelTest");
80        frame.addWindowListener(this);
81        pnl = new Panel();
82        pnl.setLayout(new GridLayout(1, 2));
83        pnl.addMouseWheelListener(this);
84        sb1 = new Scrollbar();
85        sb1.addMouseWheelListener(this);
86        pnl.add(sb1);
87        sb2 = new Scrollbar();
88        pnl.add(sb2);
89        frame.add(pnl);
90        frame.setSize(200, 400);
91        frame.setLocationRelativeTo(null);
92        frame.setVisible(true);
93        frame.toFront();
94
95        // When Frame is active, start testing (handled in windowActivated())
96        while (true) {
97            synchronized (sema) {
98                if (sema.getVal()) {
99                    break;
100                }
101            }
102        }
103        // up on sb1
104        testComp(sb1, true);
105        // down on sb1
106        testComp(sb1, false);
107        // up on sb2
108        testComp(sb2, true);
109        // down on sb2
110        testComp(sb2, false);
111        frame.dispose();
112        System.out.println("Test done.");
113        if (sb1upevents == REPS &&
114                sb2upevents == 0 &&
115                pnlupevents == PANEL_REPS &&
116                sb1downevents == REPS &&
117                sb2downevents == 0 &&
118                pnldownevents == PANEL_REPS) {
119            System.out.println("PASSED.");
120        } else {
121            System.out.println("Test Failed:" +
122                                       "\n\tsb1upevents =" + sb1upevents +
123                                       "\n\tsb2upevents = " + sb2upevents +
124                                       "\n\tpnlupevents = " + pnlupevents +
125                                       "\n\tsb1downevents =" + sb1downevents +
126                                       "\n\tsb2downevents = " + sb2downevents +
127                                       "\n\tpnldownevents = " + pnldownevents);
128            throw new RuntimeException("Test FAILED.");
129        }
130    }
131
132    public void testComp(Component comp, boolean up) {
133        Point loc = comp.getLocationOnScreen();
134        robot.mouseMove(loc.x + comp.getWidth() / 2,
135                        loc.y + comp.getHeight() / 2);
136        for (int loop = 0; loop < REPS; loop++) {
137            System.out.println("Robot.mouseWheel() on " + comp.getName());
138            robot.mouseWheel(up ? -1 : 1);
139        }
140    }
141
142    public void mouseWheelMoved(MouseWheelEvent mwe) {
143        Component src = mwe.getComponent();
144        System.out.println("mouseWheelMoved() on " + src.getName());
145        if (mwe.getWheelRotation() == -1) {
146            if (src == sb1) {
147                sb1upevents++;
148            } else if (src == sb2) {
149                sb2upevents++;
150            } else if (src == pnl) {
151                pnlupevents++;
152            } else {
153                System.out.println("weird source component");
154            }
155        } else if (mwe.getWheelRotation() == 1) {
156            if (src == sb1) {
157                sb1downevents++;
158            } else if (src == sb2) {
159                sb2downevents++;
160            } else if (src == pnl) {
161                pnldownevents++;
162            } else {
163                System.out.println("weird source component");
164            }
165        } else {
166            System.out.println("weird wheel rotation");
167        }
168    }
169
170    public void windowActivated(WindowEvent we) {
171        synchronized (sema) {
172            sema.setVal(true);
173        }
174    }
175
176    public void windowClosed(WindowEvent we) {}
177    public void windowClosing(WindowEvent we) {}
178    public void windowDeactivated(WindowEvent we) {}
179    public void windowDeiconified(WindowEvent we) {}
180    public void windowIconified(WindowEvent we) {}
181    public void windowOpened(WindowEvent we) {}
182}// class ScrollbarMouseWheelTest
183