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