1 /* 2 * Copyright (c) 1997, 2016, 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. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 package org.netbeans.jemmy.drivers.trees; 26 27 import java.awt.Point; 28 import java.awt.event.InputEvent; 29 import java.awt.event.KeyEvent; 30 31 import javax.swing.text.JTextComponent; 32 33 import org.netbeans.jemmy.QueueTool; 34 import org.netbeans.jemmy.Timeout; 35 import org.netbeans.jemmy.drivers.DriverManager; 36 import org.netbeans.jemmy.drivers.LightSupportiveDriver; 37 import org.netbeans.jemmy.drivers.MouseDriver; 38 import org.netbeans.jemmy.drivers.TextDriver; 39 import org.netbeans.jemmy.drivers.TreeDriver; 40 import org.netbeans.jemmy.operators.ComponentOperator; 41 import org.netbeans.jemmy.operators.JTextComponentOperator; 42 import org.netbeans.jemmy.operators.JTreeOperator; 43 import org.netbeans.jemmy.operators.Operator; 44 45 /** 46 * TreeDriver for javax.swing.JTree component type. Uses mouse operations. 47 * 48 * @author Alexandre Iline(alexandre.iline@oracle.com) 49 */ 50 public class JTreeMouseDriver extends LightSupportiveDriver implements TreeDriver { 51 52 QueueTool queueTool; 53 54 /** 55 * Constructs a JTreeMouseDriver. 56 */ JTreeMouseDriver()57 public JTreeMouseDriver() { 58 super(new String[]{"org.netbeans.jemmy.operators.JTreeOperator"}); 59 queueTool = new QueueTool(); 60 } 61 62 @Override selectItem(ComponentOperator oper, int index)63 public void selectItem(ComponentOperator oper, int index) { 64 selectItems(oper, new int[]{index}); 65 } 66 67 @Override selectItems(final ComponentOperator oper, int[] indices)68 public void selectItems(final ComponentOperator oper, int[] indices) { 69 ((JTreeOperator) oper).clearSelection(); 70 checkSupported(oper); 71 final MouseDriver mdriver = DriverManager.getMouseDriver(oper); 72 final JTreeOperator toper = (JTreeOperator) oper; 73 final Timeout clickTime = oper.getTimeouts().create("ComponentOperator.MouseClickTimeout"); 74 for (int i = 0; i < indices.length; i++) { 75 final int index = i; 76 if (!QueueTool.isDispatchThread()) { 77 toper.scrollToRow(indices[i]); 78 } 79 final Point p = toper.getPointToClick(indices[index]); 80 queueTool.invokeSmoothly(new QueueTool.QueueAction<Void>("Path selecting") { 81 @Override 82 public Void launch() { 83 mdriver.clickMouse(oper, p.x, p.y, 1, Operator.getDefaultMouseButton(), 84 (index == 0) ? 0 : InputEvent.CTRL_MASK, clickTime); 85 return null; 86 } 87 }); 88 } 89 //1.5 workaround 90 if (System.getProperty("java.specification.version").compareTo("1.4") > 0) { 91 if (!QueueTool.isDispatchThread()) { 92 queueTool.setOutput(oper.getOutput().createErrorOutput()); 93 queueTool.waitEmpty(10); 94 queueTool.waitEmpty(10); 95 queueTool.waitEmpty(10); 96 } 97 } 98 //end of 1.5 workaround 99 } 100 101 @Override expandItem(ComponentOperator oper, final int index)102 public void expandItem(ComponentOperator oper, final int index) { 103 checkSupported(oper); 104 final JTreeOperator toper = (JTreeOperator) oper; 105 final MouseDriver mdriver = DriverManager.getMouseDriver(oper); 106 if (!toper.isExpanded(index)) { 107 queueTool.invokeSmoothly(new QueueTool.QueueAction<Void>("Path selecting") { 108 @Override 109 public Void launch() { 110 Point p = toper.getPointToClick(index); 111 mdriver.clickMouse(toper, p.x, p.y, 2, Operator.getDefaultMouseButton(), 112 0, toper.getTimeouts(). 113 create("ComponentOperator.MouseClickTimeout")); 114 return null; 115 } 116 }); 117 } 118 } 119 120 @Override collapseItem(ComponentOperator oper, final int index)121 public void collapseItem(ComponentOperator oper, final int index) { 122 checkSupported(oper); 123 final JTreeOperator toper = (JTreeOperator) oper; 124 final MouseDriver mdriver = DriverManager.getMouseDriver(oper); 125 if (toper.isExpanded(index)) { 126 queueTool.invokeSmoothly(new QueueTool.QueueAction<Void>("Path selecting") { 127 @Override 128 public Void launch() { 129 Point p = toper.getPointToClick(index); 130 mdriver.clickMouse(toper, p.x, p.y, 2, Operator.getDefaultMouseButton(), 131 0, toper.getTimeouts(). 132 create("ComponentOperator.MouseClickTimeout")); 133 return null; 134 } 135 }); 136 } 137 } 138 139 @Override editItem(ComponentOperator oper, int index, Object newValue, Timeout waitEditorTime)140 public void editItem(ComponentOperator oper, int index, Object newValue, Timeout waitEditorTime) { 141 JTextComponentOperator textoper = startEditingAndReturnEditor(oper, index, waitEditorTime); 142 final TextDriver text = DriverManager.getTextDriver(JTextComponentOperator.class); 143 text.clearText(textoper); 144 text.typeText(textoper, newValue.toString(), 0); 145 DriverManager.getKeyDriver(oper). 146 pushKey(textoper, KeyEvent.VK_ENTER, 0, 147 oper.getTimeouts(). 148 create("ComponentOperator.PushKeyTimeout")); 149 } 150 151 @Override startEditing(ComponentOperator oper, int index, Timeout waitEditorTime)152 public void startEditing(ComponentOperator oper, int index, Timeout waitEditorTime) { 153 startEditingAndReturnEditor(oper, index, waitEditorTime); 154 } 155 startEditingAndReturnEditor(ComponentOperator oper, final int index, Timeout waitEditorTime)156 private JTextComponentOperator startEditingAndReturnEditor(ComponentOperator oper, final int index, Timeout waitEditorTime) { 157 checkSupported(oper); 158 final JTreeOperator toper = (JTreeOperator) oper; 159 final MouseDriver mdriver = DriverManager.getMouseDriver(oper); 160 queueTool.invokeSmoothly(new QueueTool.QueueAction<Void>("Path selecting") { 161 @Override 162 public Void launch() { 163 Point p = toper.getPointToClick(index); 164 mdriver.clickMouse(toper, p.x, p.y, 1, Operator.getDefaultMouseButton(), 165 0, toper.getTimeouts(). 166 create("ComponentOperator.MouseClickTimeout")); 167 return null; 168 } 169 }); 170 oper.getTimeouts().sleep("JTreeOperator.BeforeEditTimeout"); 171 queueTool.invokeSmoothly(new QueueTool.QueueAction<Void>("Path selecting") { 172 @Override 173 public Void launch() { 174 Point p = toper.getPointToClick(index); 175 mdriver.clickMouse(toper, p.x, p.y, 1, Operator.getDefaultMouseButton(), 176 0, toper.getTimeouts(). 177 create("ComponentOperator.MouseClickTimeout")); 178 return null; 179 } 180 }); 181 toper.getTimeouts(). 182 setTimeout("ComponentOperator.WaitComponentTimeout", waitEditorTime.getValue()); 183 return (new JTextComponentOperator((JTextComponent) toper. 184 waitSubComponent(new JTextComponentOperator.JTextComponentFinder()))); 185 } 186 } 187