/******************************************************************************* * Copyright (c) 2013 BREDEX GmbH. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * BREDEX GmbH - initial API and implementation *******************************************************************************/ package org.eclipse.jubula.rc.javafx.tester; import static org.eclipse.jubula.rc.common.driver.CheckWithTimeoutQueuer.invokeAndWait; import java.awt.Point; import java.util.List; import java.util.concurrent.Callable; import org.eclipse.jubula.rc.common.exception.StepExecutionException; import org.eclipse.jubula.rc.common.tester.AbstractTreeTester; import org.eclipse.jubula.rc.javafx.driver.EventThreadQueuerJavaFXImpl; import org.eclipse.jubula.rc.javafx.tester.util.NodeBounds; import org.eclipse.jubula.rc.javafx.tester.util.NodeTraverseHelper; import org.eclipse.jubula.tools.internal.objects.event.EventFactory; import org.eclipse.jubula.tools.internal.objects.event.TestErrorEvent; import javafx.event.EventHandler; import javafx.geometry.Point2D; import javafx.scene.Node; import javafx.scene.control.ScrollToEvent; import javafx.scene.control.TreeCell; import javafx.scene.control.TreeView; /** * Tester Class for the <code>TreeView</code>. If you are looking for more * implemented actions on Trees look at <code>TreeOperationContext</code>. * * @author BREDEX GmbH * @created 19.11.2013 */ public class TreeViewTester extends AbstractTreeTester { /** * EventHandler to consume scroll events during DnD */ private EventHandler<ScrollToEvent> m_scrollConsumer = new EventHandler<ScrollToEvent>() { @Override public void handle(ScrollToEvent event) { event.consume(); } }; @Override public void rcVerifyTextAtMousePosition(final String txt, final String operator, int timeout) { invokeAndWait("rcVerifyTextAtMousePosition", //$NON-NLS-1$ timeout, new Runnable() { @Override public void run() { checkNodeText(new Object[] { getNodeAtMousePosition() }, txt, operator); } }); } @Override public void rcDragByTextPath(int mouseButton, String modifier, String pathType, int preAscend, String treeTextPath, String operator) { //Add event filter to prevent scrolling Node tree = ((Node) getRealComponent()); tree.addEventFilter(ScrollToEvent.ANY, m_scrollConsumer); super.rcDragByTextPath(mouseButton, modifier, pathType, preAscend, treeTextPath, operator); } @Override public void rcDropByTextPath(String pathType, int preAscend, String treeTextPath, String operator, int delayBeforeDrop) { super.rcDropByTextPath(pathType, preAscend, treeTextPath, operator, delayBeforeDrop); //Remove event filter after scrolling Node tree = ((Node) getRealComponent()); tree.removeEventFilter(ScrollToEvent.ANY, m_scrollConsumer); } @Override public void rcDragByIndexPath(int mouseButton, String modifier, String pathType, int preAscend, String treeIndexPath) { // Add event filter to prevent scrolling Node tree = ((Node) getRealComponent()); tree.addEventFilter(ScrollToEvent.ANY, m_scrollConsumer); super.rcDragByIndexPath(mouseButton, modifier, pathType, preAscend, treeIndexPath); } @Override public void rcDropByIndexPath(String pathType, int preAscend, String treeIndexPath, int delayBeforeDrop) { super.rcDropByIndexPath(pathType, preAscend, treeIndexPath, delayBeforeDrop); //Remove event filter after scrolling Node tree = ((Node) getRealComponent()); tree.removeEventFilter(ScrollToEvent.ANY, m_scrollConsumer); } @Override protected Object getNodeAtMousePosition() throws StepExecutionException { Point awtPoint = getRobot().getCurrentMousePosition(); final Point2D point = new Point2D(awtPoint.x, awtPoint.y); Object result = EventThreadQueuerJavaFXImpl.invokeAndWait( "getNodeBounds", new Callable<Object>() { //$NON-NLS-1$ @Override public Object call() throws Exception { // Update the layout coordinates otherwise // we would get old position values TreeView<?> tree = ((TreeView<?>) getRealComponent()); tree.layout(); List<? extends TreeCell> tCells = NodeTraverseHelper .getInstancesOf(tree, TreeCell.class); for (TreeCell<?> cell : tCells) { if (NodeBounds.checkIfContains(point, cell) && NodeTraverseHelper.isVisible(cell)) { return cell.getTreeItem(); } } throw new StepExecutionException( "No tree node found at mouse position: " //$NON-NLS-1$ + "X: " + point.getX() //$NON-NLS-1$ + "Y: " + point.getY(), //$NON-NLS-1$ EventFactory .createActionError( TestErrorEvent.NOT_FOUND)); } }); return result; } }