1 /*
   2  * Copyright (c) 2007, 2014, 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 
  27 import static jdk.testlibrary.Asserts.*;
  28 
  29 
  30 
  31 public class TestWindow extends Window implements ActionListener,
  32     FocusListener, WindowFocusListener, WindowListener {
  33 
  34     public Button closeButton, openButton, dummyButton;
  35 
  36     public Flag closeClicked, openClicked, dummyClicked;
  37     public Flag closeGained,  openGained,  dummyGained;
  38     public Flag closeLost,    openLost,    dummyLost;
  39     public Flag focusGained, focusLost;
  40     public Flag activated;
  41 
  42     public static int delay = 500;
  43     public static int keyDelay = 100;
  44 
  45     public TestWindow(Frame owner) {
  46         super(owner);
  47         initializeGUI();
  48     }
  49 
  50     public TestWindow(Window window) {
  51         super(window);
  52         initializeGUI();
  53     }
  54 
  55     public void resetStatus() {
  56         activated.reset();
  57         focusGained.reset();
  58         closeGained.reset();
  59         openGained.reset();
  60         closeClicked.reset();
  61         openClicked.reset();
  62     }
  63 
  64     private void initFlags() {
  65         closeClicked = new Flag();
  66         openClicked  = new Flag();
  67         dummyClicked = new Flag();
  68         closeGained  = new Flag();
  69         openGained   = new Flag();
  70         dummyGained  = new Flag();
  71         closeLost    = new Flag();
  72         openLost     = new Flag();
  73         dummyLost    = new Flag();
  74         focusGained  = new Flag();
  75         focusLost    = new Flag();
  76         activated    = new Flag();
  77     }
  78 
  79     private void initializeGUI() {
  80 
  81         initFlags();
  82 
  83         this.addWindowFocusListener(this);
  84         this.addWindowListener(this);
  85 
  86         this.setLayout(new GridLayout(3, 1));
  87 
  88         Panel topPanel;
  89         topPanel = new Panel();
  90         topPanel.setFocusable(false);
  91         this.add(topPanel);
  92 
  93         Panel p = new Panel();
  94         p.setLayout(new GridLayout(1, 3));
  95 
  96         closeButton = new Button("Close");
  97         closeButton.addActionListener(this);
  98         closeButton.addFocusListener(this);
  99 
 100         openButton = new Button("Open");
 101         openButton.addActionListener(this);
 102         openButton.addFocusListener(this);
 103 
 104         dummyButton = new Button("Dummy");
 105         dummyButton.addActionListener(this);
 106         dummyButton.addFocusListener(this);
 107 
 108         p.add(closeButton);
 109         p.add(openButton);
 110         p.add(dummyButton);
 111 
 112         this.add(p);
 113 
 114         Panel bottomPanel = new Panel();
 115         bottomPanel.setFocusable(false);
 116         this.add(bottomPanel);
 117 
 118         setSize(150, 150);
 119     }
 120 
 121     public void doOpenAction()  {}
 122     public void doCloseAction() {}
 123     public void doDummyAction() {}
 124 
 125     @Override
 126     public void actionPerformed(ActionEvent event) {
 127         if (closeButton.equals(event.getSource())) {
 128             closeClicked.flagTriggered();
 129             doCloseAction();
 130         } else if (openButton.equals(event.getSource())) {
 131             openClicked.flagTriggered();
 132             doOpenAction();
 133         } else if (dummyButton.equals(event.getSource())) {
 134             dummyClicked.flagTriggered();
 135             doDummyAction();
 136         }
 137     }
 138 
 139     @Override
 140     public void focusGained(FocusEvent event) {
 141         if (closeButton.equals(event.getSource())) {
 142             closeGained.flagTriggered();
 143         } else if (openButton.equals(event.getSource())) {
 144             openGained.flagTriggered();
 145         } else if (dummyButton.equals(event.getSource())) {
 146             dummyGained.flagTriggered();
 147         }
 148     }
 149 
 150     @Override
 151     public void focusLost(FocusEvent event) {
 152         if (closeButton.equals(event.getSource())) {
 153             closeLost.flagTriggered();
 154         } else if (openButton.equals(event.getSource())) {
 155             openLost.flagTriggered();
 156         } else if (dummyButton.equals(event.getSource())) {
 157             dummyLost.flagTriggered();
 158         }
 159     }
 160 
 161     @Override
 162     public void windowGainedFocus(WindowEvent event) {
 163         focusGained.flagTriggered();
 164     }
 165 
 166     @Override
 167     public void windowLostFocus(WindowEvent event) {
 168         focusLost.flagTriggered();
 169     }
 170 
 171     @Override
 172     public void windowActivated(WindowEvent e) {
 173         activated.flagTriggered();
 174     }
 175 
 176     @Override
 177     public void windowClosed(WindowEvent e) {}
 178 
 179     @Override
 180     public void windowClosing(WindowEvent e) {
 181         System.err.println("User closed window!");
 182         System.exit(1);
 183     }
 184 
 185     @Override
 186     public void windowDeactivated(WindowEvent e) {}
 187 
 188     @Override
 189     public void windowDeiconified(WindowEvent e) {}
 190 
 191     @Override
 192     public void windowIconified(WindowEvent e) {}
 193 
 194     @Override
 195     public void windowOpened(WindowEvent e) {}
 196 
 197     public void clickButton(Button b, ExtendedRobot robot) {
 198         try {
 199             Flag.waitTillShown(b);
 200         } catch (InterruptedException e) {}
 201 
 202         if ((closeButton.equals(b) || openButton.equals(b) ||
 203             dummyButton.equals(b)) && robot != null) {
 204             robot.mouseMove((int) b.getLocationOnScreen().x + b.getSize().width / 2,
 205                             (int) b.getLocationOnScreen().y + b.getSize().height / 2);
 206             robot.delay(delay);
 207             robot.click();
 208             robot.delay(delay);
 209         }
 210     }
 211 
 212     public void clickOpenButton(ExtendedRobot robot) throws Exception {
 213         clickOpenButton(robot, true, "");
 214     }
 215 
 216     public void clickOpenButton(ExtendedRobot robot,
 217                                 boolean       refState,
 218                                 String        message) throws Exception {
 219         openClicked.reset();
 220         clickButton(openButton, robot);
 221         openClicked.waitForFlagTriggered();
 222 
 223         String msg = "Clicking the window Open button " + (refState ?
 224             "did not trigger an action." :
 225             "triggered an action when it should not.");
 226         assertEQ(openClicked.flag(), refState, msg + " " + message);
 227     }
 228 
 229     public void clickCloseButton(ExtendedRobot robot) throws Exception {
 230         clickCloseButton(robot, true, "");
 231     }
 232 
 233     public void clickCloseButton(ExtendedRobot robot,
 234                                  boolean       refState,
 235                                  String        message) throws Exception {
 236         closeClicked.reset();
 237         clickButton(closeButton, robot);
 238         closeClicked.waitForFlagTriggered();
 239 
 240         String msg = "Clicking the window Close button " + (refState ?
 241             "did not trigger an action." :
 242             "triggered an action when it should not.");
 243         assertEQ(closeClicked.flag(), refState, msg + " " + message);
 244     }
 245 
 246     public void clickDummyButton(ExtendedRobot robot) throws Exception {
 247         clickDummyButton(robot, true, "");
 248     }
 249 
 250     public void clickDummyButton(ExtendedRobot robot,
 251                                  boolean       refState,
 252                                  String        message) throws Exception {
 253         dummyClicked.reset();
 254         clickButton(dummyButton, robot);
 255         dummyClicked.waitForFlagTriggered();
 256 
 257         String msg = "Clicking the window Dummy button " + (refState ?
 258             "did not trigger an action." :
 259             "triggered an action when it should not.");
 260         assertEQ(dummyClicked.flag(), refState, msg + " " + message);
 261     }
 262 
 263     public void checkBlockedWindow(ExtendedRobot robot,
 264                                    String message) throws Exception {
 265         dummyGained.reset();
 266         dummyClicked.reset();
 267         focusGained.reset();
 268 
 269         clickButton(dummyButton, robot);
 270 
 271         robot.waitForIdle(delay);
 272 
 273         assertFalse(dummyClicked.flag(),
 274             "DummyButton on blocked Window triggered action when clicked. " + message);
 275 
 276         assertFalse(dummyGained.flag(),
 277             "DummyButton on blocked Window gained focus when clicked. " + message);
 278 
 279         assertFalse(focusGained.flag(),
 280             "A blocked window gained focus when component clicked. " + message);
 281     }
 282 
 283     public void checkUnblockedWindowWithBlockedParent(
 284             ExtendedRobot robot, String message) throws Exception {
 285 
 286         dummyGained.reset();
 287         dummyClicked.reset();
 288         clickButton(dummyButton, robot);
 289 
 290         dummyClicked.waitForFlagTriggered();
 291 
 292         assertTrue(dummyClicked.flag(),
 293             "DummyButton on Window did not trigger action when clicked. " + message);
 294 
 295         assertFalse(dummyGained.flag(),
 296             "DummyButton on Window gained focus " +
 297             "when its parent is non-focusable. "  + message);
 298     }
 299 
 300     public void checkUnblockedWindow(ExtendedRobot robot,
 301                                      String message) throws Exception {
 302         dummyGained.reset();
 303         dummyClicked.reset();
 304         clickButton(dummyButton, robot);
 305 
 306         dummyGained.waitForFlagTriggered();
 307         assertTrue(dummyGained.flag(),
 308             "DummyButton on Window did not gain focus on clicking. " + message);
 309 
 310         assertTrue(dummyClicked.flag(),
 311             "DummyButton on Window did not trigger action on clicking. " + message);
 312 
 313         closeGained.reset();
 314         robot.type(KeyEvent.VK_TAB);
 315 
 316         closeGained.waitForFlagTriggered();
 317         assertTrue(closeGained.flag(),
 318             "Tab navigation did not happen properly on Window. First " +
 319             "button did not gain focus on tab press. " + message);
 320     }
 321 
 322     public void checkCloseButtonFocusGained(boolean refState) {
 323         checkCloseButtonFocusGained(refState, Flag.ATTEMPTS);
 324     }
 325 
 326     public void checkCloseButtonFocusGained(boolean refState, int attempts) {
 327         try {
 328             closeGained.waitForFlagTriggered(attempts);
 329         } catch (InterruptedException e) {}
 330 
 331         String msg = "window Close button ";
 332         msg += (refState ? "did not gain focus" :
 333                 "gained focus when it should not");
 334 
 335         assertTrue(closeGained.flag() == refState, msg);
 336     }
 337 
 338 
 339     public void checkOpenButtonFocusGained(boolean refState) {
 340         checkOpenButtonFocusGained(refState, Flag.ATTEMPTS);
 341     }
 342 
 343     public void checkOpenButtonFocusGained(boolean refState, int attempts) {
 344         try {
 345             openGained.waitForFlagTriggered(attempts);
 346         } catch (InterruptedException e) {}
 347 
 348         String msg = "window Open button ";
 349         msg += (refState ? "did not gain focus" :
 350                 "gained focus when it should not");
 351 
 352         assertTrue(openGained.flag() == refState, msg);
 353     }
 354 
 355     public void checkOpenButtonFocusLost(boolean refState) {
 356         checkOpenButtonFocusLost(refState, Flag.ATTEMPTS);
 357     }
 358 
 359     public void checkOpenButtonFocusLost(boolean refState, int attempts) {
 360         try {
 361             openLost.waitForFlagTriggered(attempts);
 362         } catch (InterruptedException e) {}
 363 
 364         String msg = "window Open button ";
 365         msg += (refState ? "did not lose focus" :
 366                 "lost focus when it should not");
 367         assertTrue(openLost.flag()== refState, msg);
 368     }
 369 }