TrayIconEventsTest.java revision 16177:89ef4b822745
1/*
2 * Copyright (c) 2007, 2015, 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.*;
26import java.awt.image.BufferedImage;
27
28
29/*
30 * @test
31 * @summary Check for MouseEvents with all mouse buttons
32 * @author Dmitriy Ermashov (dmitriy.ermashov@oracle.com)
33 * @modules java.desktop/java.awt:open
34 * @library /java/awt/patchlib
35 * @library ../../../../lib/testlibrary ../
36 * @build java.desktop/java.awt.Helper
37 * @build ExtendedRobot SystemTrayIconHelper
38 * @run main TrayIconEventsTest
39 */
40
41public class TrayIconEventsTest {
42
43    private static boolean isOEL7;
44    TrayIcon icon;
45    ExtendedRobot robot;
46
47    boolean actionPerformed = false;
48    Object actionLock = new Object();
49    Object pressLock = new Object();
50    Object releaseLock = new Object();
51    Object clickLock = new Object();
52    Object moveLock = new Object();
53
54    String caption = "Sample Icon";
55    boolean mousePressed = false;
56    boolean mouseReleased = false;
57    boolean mouseClicked = false;
58    boolean mouseMoved = false;
59
60    int[] buttonTypes = {
61        InputEvent.BUTTON1_MASK,
62        InputEvent.BUTTON2_MASK,
63        InputEvent.BUTTON3_MASK
64    };
65
66    String[] buttonNames = {
67        "BUTTON1",
68        "BUTTON2",
69        "BUTTON3"
70    };
71
72    public static void main(String[] args) throws Exception {
73        if (! SystemTray.isSupported()) {
74            System.out.println("SystemTray not supported on the platform under test. " +
75                               "Marking the test passed");
76        } else {
77            if (System.getProperty("os.name").toLowerCase().startsWith("win"))
78                System.err.println("Test can fail if the icon hides to a tray icons pool " +
79                        "in Windows 7, which is behavior by default.\n" +
80                        "Set \"Right mouse click\" -> \"Customize notification icons\" -> " +
81                        "\"Always show all icons and notifications on the taskbar\" true " +
82                        "to avoid this problem. Or change behavior only for Java SE " +
83                        "tray icon.");
84            isOEL7 = SystemTrayIconHelper.isOel7();
85            new TrayIconEventsTest().doTest();
86        }
87    }
88
89    public TrayIconEventsTest() throws Exception {
90        robot = new ExtendedRobot();
91        EventQueue.invokeAndWait(this::initializeGUI);
92    }
93
94    private void initializeGUI(){
95        SystemTray tray = SystemTray.getSystemTray();
96        icon = new TrayIcon(new BufferedImage(20, 20, BufferedImage.TYPE_INT_RGB), caption);
97        icon.addActionListener(event -> {
98            actionPerformed = true;
99            synchronized (actionLock) {
100                try {
101
102                    actionLock.notifyAll();
103                } catch (Exception e) {
104                }
105            }
106        });
107        icon.addMouseListener(new MouseAdapter() {
108            public void mousePressed(MouseEvent event) {
109                mousePressed = true;
110                Point p = event.getPoint();
111                if (p.x != event.getX() || p.y != event.getY())
112                    throw new RuntimeException("FAIL: MouseEvent.getPoint() did " +
113                            "not return the same value as getX/getY " +
114                            "for mousePressed");
115
116                if (! icon.equals(event.getSource()))
117                    throw new RuntimeException("FAIL: mousePressed: MouseEvent.getSource " +
118                            "did not return TrayIcon object");
119
120                synchronized (pressLock) {
121                    try {
122                        pressLock.notifyAll();
123                    } catch (Exception e) {
124                    }
125                }
126            }
127
128            public void mouseReleased(MouseEvent event) {
129                mouseReleased = true;
130                Point p = event.getPoint();
131                if (p.x != event.getX() || p.y != event.getY())
132                    throw new RuntimeException("FAIL: MouseEvent.getPoint() did " +
133                            "not return the same value as getX/getY " +
134                            "for mouseReleased");
135
136                if (! icon.equals(event.getSource()))
137                    throw new RuntimeException("FAIL: mouseReleased: MouseEvent.getSource " +
138                            "did not return TrayIcon object");
139
140                synchronized (releaseLock) {
141                    try {
142                        releaseLock.notifyAll();
143                    } catch (Exception e) {
144                    }
145                }
146            }
147
148            public void mouseClicked(MouseEvent event) {
149                mouseClicked = true;
150                Point p = event.getPoint();
151                if (p.x != event.getX() || p.y != event.getY())
152                    throw new RuntimeException("FAIL: MouseEvent.getPoint() did " +
153                            "not return the same value as getX/getY " +
154                            "for mouseClicked");
155
156                if (! icon.equals(event.getSource()))
157                    throw new RuntimeException("FAIL: mouseClicked: MouseEvent.getSource " +
158                                       "did not return TrayIcon object");
159
160                synchronized (clickLock) {
161                    try {
162                        clickLock.notifyAll();
163                    } catch (Exception e) {
164                    }
165                }
166            }
167        });
168
169        icon.addMouseMotionListener(new MouseMotionAdapter() {
170            public void mouseMoved(MouseEvent event) {
171                mouseMoved = true;
172                Point p = event.getPoint();
173                if (p.x != event.getX() || p.y != event.getY())
174                    throw new RuntimeException("FAIL: MouseEvent.getPoint() did " +
175                            "not return the same value as getX/getY " +
176                            "for mouseMoved");
177
178                if (! icon.equals(event.getSource()))
179                    throw new RuntimeException("FAIL: mouseMoved: MouseEvent.getSource " +
180                            "did not return TrayIcon object");
181
182                synchronized (moveLock) {
183                    try {
184                        moveLock.notifyAll();
185                    } catch (Exception e) {
186                    }
187                }
188            }
189        });
190
191        try {
192            tray.add(icon);
193        } catch (AWTException e) {
194            throw new RuntimeException(e);
195        }
196    }
197
198    void doTest() throws Exception {
199
200        Point iconPosition = SystemTrayIconHelper.getTrayIconLocation(icon);
201        if (iconPosition == null)
202            throw new RuntimeException("Unable to find the icon location!");
203        if (isOEL7) {
204            // close tray
205            robot.mouseMove(100,100);
206            robot.click(InputEvent.BUTTON1_MASK);
207            robot.waitForIdle(2000);
208        }
209
210        robot.mouseMove(iconPosition.x, iconPosition.y);
211        robot.waitForIdle();
212        if(!isOEL7) {
213            SystemTrayIconHelper.doubleClick(robot);
214
215            if (!actionPerformed) {
216                synchronized (actionLock) {
217                    try {
218                        actionLock.wait(10000);
219                    } catch (Exception e) {
220                    }
221                }
222            }
223            if (!actionPerformed)
224                throw new RuntimeException("FAIL: ActionEvent not triggered when TrayIcon is double clicked");
225        }
226
227        for (int i = 0; i < buttonTypes.length; i++) {
228            mousePressed = false;
229            if(isOEL7) {
230                SystemTrayIconHelper.openTrayIfNeeded(robot);
231                robot.mouseMove(iconPosition.x, iconPosition.y);
232                robot.click(buttonTypes[i]);
233            } else {
234                robot.mousePress(buttonTypes[i]);
235            }
236
237            if (! mousePressed) {
238                synchronized (pressLock) {
239                    try {
240                        pressLock.wait(6000);
241                    } catch (Exception e) {
242                    }
243                }
244            }
245            if (! mousePressed)
246                if (! SystemTrayIconHelper.skip(buttonTypes[i]) )
247                    throw new RuntimeException("FAIL: mousePressed not triggered when " +
248                            buttonNames[i] + " pressed");
249
250            mouseReleased = false;
251            mouseClicked = false;
252            if(isOEL7) {
253                SystemTrayIconHelper.openTrayIfNeeded(robot);
254                robot.mouseMove(iconPosition.x, iconPosition.y);
255                robot.click(buttonTypes[i]);
256            } else {
257                robot.mouseRelease(buttonTypes[i]);
258            }
259
260            if (! mouseReleased) {
261                synchronized (releaseLock) {
262                    try {
263                        releaseLock.wait(6000);
264                    } catch (Exception e) {
265                    }
266                }
267            }
268            if (! mouseReleased)
269                throw new RuntimeException("FAIL: mouseReleased not triggered when " +
270                        buttonNames[i] + " released");
271
272            if (! mouseClicked) {
273                synchronized (clickLock) {
274                    try {
275                        clickLock.wait(6000);
276                    } catch (Exception e) {
277                    }
278                }
279            }
280            if (! mouseClicked)
281                throw new RuntimeException("FAIL: mouseClicked not triggered when " +
282                        buttonNames[i] + " pressed & released");
283        }
284
285        if (!isOEL7) {
286            mouseMoved = false;
287            robot.mouseMove(iconPosition.x + 100, iconPosition.y);
288            robot.glide(iconPosition.x, iconPosition.y);
289
290            if (!mouseMoved)
291                if (!SystemTrayIconHelper.skip(0))
292                    throw new RuntimeException("FAIL: mouseMoved not triggered even when mouse moved over the icon");
293        }
294    }
295}
296