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