| /* |
| * 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." |
| ); |
| } |
| } |
| } |