package org.jboss.tools.fuse.reddeer.utils;
import java.awt.AWTException;
import java.awt.Point;
import java.awt.Robot;
import java.awt.event.InputEvent;
import org.eclipse.swt.widgets.Composite;
import org.jboss.reddeer.common.logging.Logger;
import org.jboss.reddeer.eclipse.jdt.ui.ProjectExplorer;
import org.jboss.reddeer.swt.api.TreeItem;
import org.jboss.reddeer.swt.impl.tree.DefaultTreeItem;
import org.jboss.tools.fuse.reddeer.view.FuseJMXNavigator;
import org.jboss.reddeer.core.util.Display;
import org.jboss.reddeer.core.util.ResultRunnable;
import org.jboss.reddeer.common.wait.AbstractWait;
import org.jboss.reddeer.common.wait.TimePeriod;
/**
* Utilizes sending messages into the Camel Endpoint - drag a message XML file in 'Project Explorer' and drop it on a
* Camel Endpoint in 'JMX Navigator' View.
*
* @author tsedmik
*/
public class TracingDragAndDropManager {
private Logger log = Logger.getLogger(TracingDragAndDropManager.class);
private String[] from = null;
private String[] to = null;
/**
* Constructor
*
* @param from
* path in 'Project Explorer' view to a XML message file
* @param to
* path in 'JMX Navigator' view to an endpoint
*/
public TracingDragAndDropManager(String[] from, String[] to) {
this.from = from;
this.to = to;
}
/**
* Performs Drag&Drop operations via AWT Robot
*/
public void performDragAndDrop() {
if (from == null || to == null) {
log.error("Attribute 'From' or 'To' is null!");
return;
}
final Point fromCoords = getCoords(getFromTreeItem());
final Point toCoords = getCoords(getToTreeItem());
Display.syncExec(new Runnable() {
@Override
public void run() {
Robot robot;
try {
robot = new Robot();
robot.mouseMove(fromCoords.x, fromCoords.y);
robot.delay(100);
robot.mousePress(InputEvent.BUTTON1_MASK);
robot.delay(10);
int i = fromCoords.y;
if (fromCoords.y > toCoords.y) {
while (i > toCoords.y) {
i -= 1;
robot.mouseMove(fromCoords.x, i);
}
} else {
while (i < toCoords.y) {
i += 1;
robot.mouseMove(fromCoords.x, i);
}
}
i = fromCoords.x;
while (i < toCoords.x) {
i += 1;
robot.mouseMove(i, toCoords.y);
}
} catch (AWTException e) {
log.error("Error during AWT Robot manipulation");
}
}
});
AbstractWait.sleep(TimePeriod.SHORT);
Display.syncExec(new Runnable() {
@Override
public void run() {
Robot robot;
try {
robot = new Robot();
robot.mouseRelease(InputEvent.BUTTON1_MASK);
robot.delay(2000);
} catch (AWTException e) {
log.error("Error during AWT Robot manipulation");
}
}
});
}
/**
* Tries to access an item in 'Project Explorer' view
*
* @return item corresponding with given path
*/
private TreeItem getFromTreeItem() {
log.debug("Tries to access 'From' item: " + from);
new ProjectExplorer().open();
return new DefaultTreeItem(from);
}
/**
* Tries to access an item in 'JMX Navigator' view
*
* @return item corresponding with given path
*/
private TreeItem getToTreeItem() {
log.debug("Tries to access 'To' item: " + from);
FuseJMXNavigator jmx = new FuseJMXNavigator();
jmx.open();
jmx.setShouldCollapseLocalProcesses(false);
return jmx.getNode(to);
}
/**
* Retrieves coordinates of given element
*
* @param item
* an item.
* @return absolute coordinates of given element (x + 10, y + 10)
*/
private Point getCoords(TreeItem item) {
item.select();
final org.eclipse.swt.widgets.TreeItem widget = item.getSWTWidget();
return Display.syncExec(new ResultRunnable<Point>() {
@Override
public Point run() {
int x = widget.getBounds().x;
int y = widget.getBounds().y;
Composite parent = widget.getParent();
x += parent.toDisplay(1, 1).x;
y += parent.toDisplay(1, 1).y;
return new Point(x + 10, y + 10);
}
});
}
}