/* * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ /* @test @key headful @bug 6497109 6734341 @summary TextArea must have selection expanding, and also be autoscrolled, if mouse is dragged from inside. @library ../../regtesthelpers @build Util @author Konstantin Voloshin: area=TextArea @run main SelectionAutoscrollTest */ /** * SelectionAutoscrollTest.java * * summary: TextArea should be auto-scrolled and text should be selected to * the end, if mouse is dragged from inside box-for-text to outside it, and * is hold pressed there. */ import java.awt.Frame; import java.awt.Panel; import java.awt.GridLayout; import java.awt.TextArea; import java.awt.Point; import java.awt.Dimension; import java.awt.event.MouseEvent; import java.awt.Robot; import java.awt.Toolkit; import test.java.awt.regtesthelpers.Util; public class SelectionAutoscrollTest { TextArea textArea; Robot robot; final int desiredSelectionEnd = ('z'-'a'+1)*2; // 52 final static int SCROLL_DELAY = 10; // ms public static void main(String[] args) { SelectionAutoscrollTest selectionAutoscrollTest = new SelectionAutoscrollTest(); selectionAutoscrollTest.createObjects(); selectionAutoscrollTest.manipulateMouse(); selectionAutoscrollTest.checkResults(); } void createObjects() { textArea = new TextArea( bigString() ); robot = Util.createRobot(); Panel panel = new Panel(); panel.setLayout( new GridLayout(3,3) ); for( int y=0; y<3; ++y ) { for( int x=0; x<3; ++x ) { if( x==1 && y==1 ) { panel.add( textArea ); } else { panel.add( new Panel() ); } } } Frame frame = new Frame( "TextArea cursor icon test" ); frame.setSize( 300, 300 ); frame.add( panel ); frame.setVisible( true ); } static String bigString() { String s = ""; for( char c='a'; c<='z'; ++c ) { s += c+"\n"; } return s; } void manipulateMouse() { moveMouseToCenterOfTextArea(); Util.waitForIdle( robot ); robot.mousePress( MouseEvent.BUTTON1_MASK ); Util.waitForIdle( robot ); for( int tremble=0; tremble < 10; ++tremble ) { // Mouse is moved repeatedly here (with conservatively chosen // ammount of times), to give some time/chance for TextArea to // autoscroll and for text-selection to expand to the end. // This is because: // - On Windows, // autoscrolling and selection-expansion happens only once per // each mouse-dragged event received, and only for some ammount, // not to the end. So, we have to drag mouse repeatedly. // - on X, // only 1 mouse-dragged event is required for autoscrolling/ // selection-expanding to commence. Once commenced, it will // continue to the end of text (provided that mouse-button is // hold pressed), but it may take hardly predictable ammount of // time. However, repeatedly dragging mouse seems perfectly help // here, instead of having to use 'Thread.sleep( ??? )'. // Note: It's required here to move mouse 2 times to receive the // 1-st drag-event. After 1-st movement, only mouse-exited event // will be generated. If mouse was released after first movement // here, we would even get mouse-clicked event (at least for now, // and this is probably a bug). But, starting with 2nd iteration, // all events received will be mouse-dragged events. moveMouseBelowTextArea( tremble ); Util.waitForIdle( robot ); // it is needed to add some small delay on Gnome waitUntilScrollIsPerformed(robot); } robot.mouseRelease( MouseEvent.BUTTON1_MASK ); Util.waitForIdle( robot ); } void moveMouseToCenterOfTextArea() { Dimension d = textArea.getSize(); Point l = textArea.getLocationOnScreen(); Util.mouseMove(robot, l, new Point((int) (l.x + d.width * .5), (int) (l.y + d.height * .5))); } void moveMouseBelowTextArea(int tremble) { Dimension d = textArea.getSize(); Point l = textArea.getLocationOnScreen(); Point p1; if (tremble == 0) { p1 = new Point((int) (l.x + d.width * .5), (int) (l.y + d.height * 0.5)); } else { p1 = new Point((int) (l.x + d.width * .5), (int) (l.y + d.height * 1.5)); } Point p2 = new Point((int) (l.x + d.width * .5), (int) (l.y + d.height * 1.5) + 15); if (tremble % 2 == 0) { Util.mouseMove(robot, p1, p2); } else { Util.mouseMove(robot, p2, p1); } } void waitUntilScrollIsPerformed(Robot robot) { try { Thread.sleep( SCROLL_DELAY ); } catch( Exception e ) { throw new RuntimeException( e ); } } void checkResults() { final int currentSelectionEnd = textArea.getSelectionEnd(); System.out.println( "TEST: Selection range after test is: ( " + textArea.getSelectionStart() + ", " + currentSelectionEnd + " )" ); boolean resultOk = ( currentSelectionEnd == desiredSelectionEnd ); String desiredSelectionEndString = "" + desiredSelectionEnd; // On Windows, last empty line is surprisingly not selected. // Even if it's a bug, it's not for this test. // So, we have 2 acceptable results in this case. String toolkitName = Toolkit.getDefaultToolkit().getClass().getName(); if( toolkitName.equals("sun.awt.windows.WToolkit") ) { final int desiredSelectionEnd2 = desiredSelectionEnd-1; // 51 resultOk |= ( currentSelectionEnd == desiredSelectionEnd2 ); desiredSelectionEndString += " or " + desiredSelectionEnd2; } if( resultOk ) { System.out.println( "TEST: passed: Text is selected to the end" + " (expected selection range end is " + desiredSelectionEndString + ")." ); } else { System.out.println( "TEST: FAILED: Text should be selected to the end" + " (selection range end should be " + desiredSelectionEndString + ")." ); throw new RuntimeException( "TEST: FAILED: Text should be selected to the end, but it is not." ); } } }