/*******************************************************************************
* Copyright (c) 2014 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 and/or initial documentation
*******************************************************************************/
package org.eclipse.jubula.rc.javafx.tester;
import java.awt.Point;
import java.util.List;
import java.util.concurrent.Callable;
import org.eclipse.jubula.rc.common.driver.DragAndDropHelper;
import org.eclipse.jubula.rc.common.exception.StepExecutionException;
import org.eclipse.jubula.rc.common.tester.ListTester;
import org.eclipse.jubula.rc.javafx.driver.EventThreadQueuerJavaFXImpl;
import org.eclipse.jubula.rc.javafx.tester.adapter.ListViewAdapter;
import org.eclipse.jubula.rc.javafx.tester.util.NodeBounds;
import org.eclipse.jubula.rc.javafx.tester.util.NodeTraverseHelper;
import org.eclipse.jubula.toolkit.enums.ValueSets.BinaryChoice;
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.Parent;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.control.ScrollToEvent;
/**
* @author BREDEX GmbH
*/
public class ListViewTester extends ListTester {
/**
* 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 rcDragValue(int mouseButton, String modifier, String value,
String operator, String searchType) {
final DragAndDropHelper dndHelper = DragAndDropHelper.getInstance();
dndHelper.setModifier(modifier);
dndHelper.setMouseButton(mouseButton);
rcSelectValue(value, operator, searchType, BinaryChoice.no.rcValue(),
mouseButton, 0);
pressOrReleaseModifiers(modifier, true);
getRobot().mousePress(null, null, mouseButton);
// Add event filter to prevent scrolling
Node listView = ((Node) getRealComponent());
listView.addEventFilter(ScrollToEvent.ANY, m_scrollConsumer);
dndHelper.setDragMode(true);
}
@Override
public void rcDropValue(String value, String operator, String searchType,
int delayBeforeDrop) {
final DragAndDropHelper dndHelper = DragAndDropHelper.getInstance();
try {
ListCell<?> targetCell = ((ListViewAdapter<ListView<?>>)
getComponent()).getCell(value);
if (targetCell == null) {
throw new StepExecutionException("Drop target not visible", //$NON-NLS-1$
EventFactory
.createActionError(TestErrorEvent.NOT_VISIBLE));
}
rcSelectValue(value, operator, searchType,
BinaryChoice.no.rcValue(), dndHelper.getMouseButton(), 0);
waitBeforeDrop(delayBeforeDrop);
} finally {
getRobot().mouseRelease(null, null, dndHelper.getMouseButton());
pressOrReleaseModifiers(dndHelper.getModifier(), false);
//Remove event filter
Node listView = ((Node) getRealComponent());
listView.removeEventFilter(ScrollToEvent.ANY, m_scrollConsumer);
dndHelper.setDragMode(false);
}
}
@Override
public void rcDragIndex(int mouseButton, String modifier, int index) {
final DragAndDropHelper dndHelper = DragAndDropHelper.getInstance();
dndHelper.setModifier(modifier);
dndHelper.setMouseButton(mouseButton);
rcSelectIndex(String.valueOf(index), BinaryChoice.no.rcValue(),
mouseButton, 0);
pressOrReleaseModifiers(modifier, true);
getRobot().mousePress(null, null, mouseButton);
//Add event filter to prevent scrolling
Node listView = ((Node) getRealComponent());
listView.addEventFilter(ScrollToEvent.ANY, m_scrollConsumer);
dndHelper.setDragMode(true);
}
@Override
public void rcDropIndex(int index, int delayBeforeDrop) {
final DragAndDropHelper dndHelper = DragAndDropHelper.getInstance();
try {
ListCell<?> targetCell = ((ListViewAdapter<ListView<?>>)
getComponent()).getCell(index);
if (targetCell == null) {
throw new StepExecutionException("Drop target not visible", //$NON-NLS-1$
EventFactory
.createActionError(TestErrorEvent.NOT_VISIBLE));
}
rcSelectIndex(String.valueOf(index), BinaryChoice.no.rcValue(),
dndHelper.getMouseButton(), 0);
waitBeforeDrop(delayBeforeDrop);
} finally {
getRobot().mouseRelease(null, null, dndHelper.getMouseButton());
pressOrReleaseModifiers(dndHelper.getModifier(), false);
// Remove event filter
Node listView = ((Node) getRealComponent());
listView.removeEventFilter(ScrollToEvent.ANY, m_scrollConsumer);
dndHelper.setDragMode(false);
}
}
/** {@inheritDoc} */
protected Object getNodeAtMousePosition() throws StepExecutionException {
Point awtPoint = getRobot().getCurrentMousePosition();
final Point2D point = new Point2D(awtPoint.x, awtPoint.y);
Object result = EventThreadQueuerJavaFXImpl.invokeAndWait(
"getNodeAtMousePosition", new Callable<Object>() { //$NON-NLS-1$
@Override
public Object call() throws Exception {
// Update the layout coordinates otherwise
// we would get old position values
((ListView<?>) getRealComponent()).layout();
List<ListCell> tCells = NodeTraverseHelper
.getInstancesOf((Parent) getRealComponent(),
ListCell.class);
for (ListCell cell : tCells) {
if (NodeBounds.checkIfContains(point, cell)) {
return cell;
}
}
throw new StepExecutionException(
"No table 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;
}
}