1 /*
   2  * Copyright (c) 1999, 2010, 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 4118621 8149636
  27   @summary Test the selection scrolling in TextField.
  28   @run applet/manual=yesno ScrollSelectionTest.html
  29 */
  30 
  31 import java.applet.Applet;
  32 import java.awt.Dialog;
  33 import java.awt.Frame;
  34 import java.awt.TextField;
  35 import java.awt.TextArea;
  36 import java.awt.FlowLayout;
  37 
  38 public class ScrollSelectionTest extends Applet
  39  {
  40 
  41    Frame frame = new Frame("ScrollSelectionTest frame");
  42    TextField tf = new TextField(40);
  43 
  44    public void init()
  45     {
  46       tf.setText("abcdefghijklmnopqrstuvwxyz");
  47       frame.add(tf);
  48       frame.setLayout(new FlowLayout());
  49       tf.select(0, 20);
  50 
  51       String[] instructions = {
  52           "INSTRUCTIONS: There are 2 Tests",
  53           "Test1: Text visibility with Scroll",
  54           "This is a test for a win32 specific problem",
  55           "If you see all the letters from 'a' to 'z' and",
  56           "letters from 'a' to 't' are selected then test passes.",
  57           "You may have to activate the frame to see the selection",
  58           "highlighted (e.g. by clicking on frame's title).",
  59           ".",
  60           "Test2: Flicker with selection scroll",
  61           "Mouse press on the TextField text.",
  62           "Move mouse towards left or right with selecting text.",
  63           "Move mouse away outside the bounds of TextField.",
  64           "No flicker should be observed.",
  65       };
  66       Sysout.createDialogWithInstructions( instructions );
  67 
  68     }// init()
  69 
  70    public void start ()
  71     {
  72       setSize (300, 500);
  73       setVisible(true);
  74 
  75       frame.setVisible(true);
  76       frame.setBounds (400, 0, 400, 300);
  77 
  78     }// start()
  79 
  80  }// class ScrollSelectionTest
  81 
  82 /****************************************************
  83  Standard Test Machinery
  84  DO NOT modify anything below -- it's a standard
  85   chunk of code whose purpose is to make user
  86   interaction uniform, and thereby make it simpler
  87   to read and understand someone else's test.
  88  ****************************************************/
  89 
  90 /**
  91  This is part of the standard test machinery.
  92  It creates a dialog (with the instructions), and is the interface
  93   for sending text messages to the user.
  94  To print the instructions, send an array of strings to Sysout.createDialog
  95   WithInstructions method.  Put one line of instructions per array entry.
  96  To display a message for the tester to see, simply call Sysout.println
  97   with the string to be displayed.
  98  This mimics System.out.println but works within the test harness as well
  99   as standalone.
 100  */
 101 
 102 class Sysout
 103  {
 104    private static TestDialog dialog;
 105 
 106    public static void createDialogWithInstructions( String[] instructions )
 107     {
 108       dialog = new TestDialog( new Frame(), "Instructions" );
 109       dialog.printInstructions( instructions );
 110       dialog.show();
 111       println( "Any messages for the tester will display here." );
 112     }
 113 
 114    public static void createDialog( )
 115     {
 116       dialog = new TestDialog( new Frame(), "Instructions" );
 117       String[] defInstr = { "Instructions will appear here. ", "" } ;
 118       dialog.printInstructions( defInstr );
 119       dialog.show();
 120       println( "Any messages for the tester will display here." );
 121     }
 122 
 123 
 124    public static void printInstructions( String[] instructions )
 125     {
 126       dialog.printInstructions( instructions );
 127     }
 128 
 129 
 130    public static void println( String messageIn )
 131     {
 132       dialog.displayMessage( messageIn );
 133     }
 134 
 135  }// Sysout  class
 136 
 137 /**
 138   This is part of the standard test machinery.  It provides a place for the
 139    test instructions to be displayed, and a place for interactive messages
 140    to the user to be displayed.
 141   To have the test instructions displayed, see Sysout.
 142   To have a message to the user be displayed, see Sysout.
 143   Do not call anything in this dialog directly.
 144   */
 145 class TestDialog extends Dialog
 146  {
 147 
 148    TextArea instructionsText;
 149    TextArea messageText;
 150    int maxStringLength = 80;
 151 
 152    //DO NOT call this directly, go through Sysout
 153    public TestDialog( Frame frame, String name )
 154     {
 155       super( frame, name );
 156       int scrollBoth = TextArea.SCROLLBARS_BOTH;
 157       instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
 158       add( "North", instructionsText );
 159 
 160       messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
 161       add("South", messageText);
 162 
 163       pack();
 164 
 165       show();
 166     }// TestDialog()
 167 
 168    //DO NOT call this directly, go through Sysout
 169    public void printInstructions( String[] instructions )
 170     {
 171       //Clear out any current instructions
 172       instructionsText.setText( "" );
 173 
 174       //Go down array of instruction strings
 175 
 176       String printStr, remainingStr;
 177       for( int i=0; i < instructions.length; i++ )
 178        {
 179          //chop up each into pieces maxSringLength long
 180          remainingStr = instructions[ i ];
 181          while( remainingStr.length() > 0 )
 182           {
 183             //if longer than max then chop off first max chars to print
 184             if( remainingStr.length() >= maxStringLength )
 185              {
 186                //Try to chop on a word boundary
 187                int posOfSpace = remainingStr.
 188                   lastIndexOf( ' ', maxStringLength - 1 );
 189 
 190                if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
 191 
 192                printStr = remainingStr.substring( 0, posOfSpace + 1 );
 193                remainingStr = remainingStr.substring( posOfSpace + 1 );
 194              }
 195             //else just print
 196             else
 197              {
 198                printStr = remainingStr;
 199                remainingStr = "";
 200              }
 201 
 202             instructionsText.append( printStr + "\n" );
 203 
 204           }// while
 205 
 206        }// for
 207 
 208     }//printInstructions()
 209 
 210    //DO NOT call this directly, go through Sysout
 211    public void displayMessage( String messageIn )
 212     {
 213       messageText.append( messageIn + "\n" );
 214     }
 215 
 216  }// TestDialog  class