1 /*
   2  * Copyright (c) 2002, 2007, 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 /*
  25   test
  26   @bug 4092033 4529626
  27   @summary Tests that toFront makes window focused unless it is non-focusable
  28   @author  area=awt.focus
  29   @run applet ToFrontFocus.html
  30 */
  31 
  32 /**
  33  * ToFrontFocus.java
  34  *
  35  * summary:
  36  */
  37 
  38 import java.applet.Applet;
  39 import java.awt.*;
  40 import java.awt.event.*;
  41 import test.java.awt.regtesthelpers.Util;
  42 
  43 public class ToFrontFocus extends Applet
  44  {
  45    //Declare things used in the test, like buttons and labels here
  46 
  47      Frame cover, focus_frame, nonfocus_frame;
  48      Button focus_button, nonfocus_button;
  49      volatile boolean focus_gained = false, nonfocus_gained = false;
  50    public void init()
  51     {
  52       //Create instructions for the user here, as well as set up
  53       // the environment -- set the layout manager, add buttons,
  54       // etc.
  55 
  56       this.setLayout (new BorderLayout ());
  57 
  58       String[] instructions =
  59        {
  60            "This is an AUTOMATIC test",
  61            "simply wait until it is done"
  62        };
  63       Sysout.createDialog( );
  64       Sysout.printInstructions( instructions );
  65       cover = new Frame("Cover frame");
  66       cover.setBounds(100, 100, 200, 200);
  67       focus_frame = new Frame("Focusable frame");
  68       focus_frame.setBounds(150, 100, 250, 150);
  69       nonfocus_frame = new Frame("Non-focusable frame");
  70       nonfocus_frame.setFocusableWindowState(false);
  71       nonfocus_frame.setBounds(150, 150, 250, 200);
  72       focus_button = new Button("Button in focusable frame");
  73       focus_button.addFocusListener(new FocusAdapter() {
  74               public void focusGained(FocusEvent e) {
  75                   focus_gained = true;
  76               }
  77           });
  78       nonfocus_button = new Button("Button in non-focusable frame");
  79       nonfocus_button.addFocusListener(new FocusAdapter() {
  80               public void focusGained(FocusEvent e) {
  81                   nonfocus_gained = true;
  82               }
  83           });
  84     }//End  init()
  85 
  86    public void start ()
  87     {
  88       //Get things going.  Request focus, set size, et cetera
  89       setSize (200,200);
  90       show();
  91       Util.waitForIdle(null);
  92 
  93       focus_frame.setFocusTraversalPolicy(new DefaultFocusTraversalPolicy() {
  94               public Component getInitialComponent(Window w) {
  95                   return null;
  96               }
  97           });
  98       focus_frame.setVisible(true);
  99       nonfocus_frame.setFocusTraversalPolicy(new DefaultFocusTraversalPolicy() {
 100               public Component getInitialComponent(Window w) {
 101                   return null;
 102               }
 103           });
 104       nonfocus_frame.setVisible(true);
 105       cover.setVisible(true);
 106 
 107       Util.waitForIdle(null);
 108 
 109       // So events are no generated at the creation add buttons here.
 110       focus_frame.add(focus_button);
 111       focus_frame.pack();
 112       focus_frame.setFocusTraversalPolicy(new DefaultFocusTraversalPolicy() {
 113               public Component getInitialComponent(Window w) {
 114                   return focus_button;
 115               }
 116           });
 117       nonfocus_frame.add(nonfocus_button);
 118       nonfocus_frame.pack();
 119       nonfocus_frame.setFocusTraversalPolicy(new DefaultFocusTraversalPolicy() {
 120               public Component getInitialComponent(Window w) {
 121                   return nonfocus_button;
 122               }
 123           });
 124 
 125       System.err.println("------------ Starting test ------------");
 126       // Make frame focused - focus_gained will be genereated for button.
 127       focus_frame.toFront();
 128       // focus_gained should not be generated
 129       nonfocus_frame.toFront();
 130 
 131       // Wait for events.
 132       Util.waitForIdle(null);
 133 
 134       if (!focus_gained || nonfocus_gained) {
 135           throw new RuntimeException("ToFront doesn't work as expected");
 136       }
 137     }// start()
 138 
 139  }// class ToFrontFocus
 140 
 141 
 142 /****************************************************
 143  Standard Test Machinery
 144  DO NOT modify anything below -- it's a standard
 145   chunk of code whose purpose is to make user
 146   interaction uniform, and thereby make it simpler
 147   to read and understand someone else's test.
 148  ****************************************************/
 149 
 150 /**
 151  This is part of the standard test machinery.
 152  It creates a dialog (with the instructions), and is the interface
 153   for sending text messages to the user.
 154  To print the instructions, send an array of strings to Sysout.createDialog
 155   WithInstructions method.  Put one line of instructions per array entry.
 156  To display a message for the tester to see, simply call Sysout.println
 157   with the string to be displayed.
 158  This mimics System.out.println but works within the test harness as well
 159   as standalone.
 160  */
 161 
 162 class Sysout
 163  {
 164    private static TestDialog dialog;
 165 
 166    public static void createDialogWithInstructions( String[] instructions )
 167     {
 168       dialog = new TestDialog( new Frame(), "Instructions" );
 169       dialog.printInstructions( instructions );
 170       dialog.show();
 171       println( "Any messages for the tester will display here." );
 172     }
 173 
 174    public static void createDialog( )
 175     {
 176       dialog = new TestDialog( new Frame(), "Instructions" );
 177       String[] defInstr = { "Instructions will appear here. ", "" } ;
 178       dialog.printInstructions( defInstr );
 179       dialog.show();
 180       println( "Any messages for the tester will display here." );
 181     }
 182 
 183 
 184    public static void printInstructions( String[] instructions )
 185     {
 186       dialog.printInstructions( instructions );
 187     }
 188 
 189 
 190    public static void println( String messageIn )
 191     {
 192       dialog.displayMessage( messageIn );
 193     }
 194 
 195  }// Sysout  class
 196 
 197 /**
 198   This is part of the standard test machinery.  It provides a place for the
 199    test instructions to be displayed, and a place for interactive messages
 200    to the user to be displayed.
 201   To have the test instructions displayed, see Sysout.
 202   To have a message to the user be displayed, see Sysout.
 203   Do not call anything in this dialog directly.
 204   */
 205 class TestDialog extends Dialog
 206  {
 207 
 208    TextArea instructionsText;
 209    TextArea messageText;
 210    int maxStringLength = 80;
 211 
 212    //DO NOT call this directly, go through Sysout
 213    public TestDialog( Frame frame, String name )
 214     {
 215       super( frame, name );
 216       int scrollBoth = TextArea.SCROLLBARS_BOTH;
 217       instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
 218       add( "North", instructionsText );
 219 
 220       messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
 221       add("South", messageText);
 222 
 223       pack();
 224 
 225       show();
 226     }// TestDialog()
 227 
 228    //DO NOT call this directly, go through Sysout
 229    public void printInstructions( String[] instructions )
 230     {
 231       //Clear out any current instructions
 232       instructionsText.setText( "" );
 233 
 234       //Go down array of instruction strings
 235 
 236       String printStr, remainingStr;
 237       for( int i=0; i < instructions.length; i++ )
 238        {
 239          //chop up each into pieces maxSringLength long
 240          remainingStr = instructions[ i ];
 241          while( remainingStr.length() > 0 )
 242           {
 243             //if longer than max then chop off first max chars to print
 244             if( remainingStr.length() >= maxStringLength )
 245              {
 246                //Try to chop on a word boundary
 247                int posOfSpace = remainingStr.
 248                   lastIndexOf( ' ', maxStringLength - 1 );
 249 
 250                if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
 251 
 252                printStr = remainingStr.substring( 0, posOfSpace + 1 );
 253                remainingStr = remainingStr.substring( posOfSpace + 1 );
 254              }
 255             //else just print
 256             else
 257              {
 258                printStr = remainingStr;
 259                remainingStr = "";
 260              }
 261 
 262             instructionsText.append( printStr + "\n" );
 263 
 264           }// while
 265 
 266        }// for
 267 
 268     }//printInstructions()
 269 
 270    //DO NOT call this directly, go through Sysout
 271    public void displayMessage( String messageIn )
 272     {
 273       messageText.append( messageIn + "\n" );
 274     }
 275 
 276  }// TestDialog  class