package org.vimplugin;
import org.eclim.logging.Logger;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
/**
* Utility functions for working with the eclipse display.
*/
public class DisplayUtils
{
private static final Logger logger = Logger.getLogger(DisplayUtils.class);
/**
* Performs a click by first moving the mouse to the specified x,y coordinates
* and then issuing a left button mouse click.
*
* @param display The Display instance.
* @param x The x coordinate.
* @param y The y coordinate.
* @param restore boolean indicating whether or not the cursor should be
* restored to its original position after the click is performed.
*/
public static void doClick(
final Display display, final int x, final int y, boolean restore)
{
// save the original cursor location.
final int[] orig = {0, 0};
if (restore){
display.syncExec(new Runnable(){
public void run()
{
Point point = display.getCursorLocation();
orig[0] = point.x;
orig[1] = point.y;
}
});
}
Event event = new Event();
event.x = x;
event.y = y;
event.type = SWT.MouseMove;
post(display, event);
// wait for the cursor to move.
final boolean[] moved = {false};
Thread check = new Thread(){
public void run(){
final int[] cursor = {0, 0};
while(!isInterrupted() && cursor[0] != x || cursor[1] != y){
display.syncExec(new Runnable(){
public void run()
{
Point point = display.getCursorLocation();
cursor[0] = point.x;
cursor[1] = point.y;
if (point.x == x && point.y == y){
moved[0] = true;
}
}
});
try{
Thread.sleep(25);
}catch(InterruptedException ie){
break;
}
}
}
};
check.start();
try{
check.join(2000);
check.interrupt();
}catch(InterruptedException ie){
logger.debug("interrupted while waiting", ie);
}
if (moved[0]){
event = new Event();
event.button = 1;
event.type = SWT.MouseDown;
post(display, event);
event.type = SWT.MouseUp;
post(display, event);
}
// restore cursor to original position.
if (restore){
event = new Event();
event.x = orig[0];
event.y = orig[1];
event.type = SWT.MouseMove;
post(display, event);
}
}
/**
* Perform a keypress using the supplied key and optional modifiers.
*
* @param display The Display instance.
* @param key The SWT key code.
* @param modifiers Optional one or more SWT key modifiers
*/
public static void doKeypress(Display display, int key, int ... modifiers)
{
for (int modifier : modifiers){
Event event = new Event();
event.type = SWT.KeyDown;
event.keyCode = modifier;
post(display, event);
}
Event event = new Event();
event.keyCode = key;
event.type = SWT.KeyDown;
post(display, event);
event.type = SWT.KeyUp;
post(display, event);
for (int modifier : modifiers){
event = new Event();
event.type = SWT.KeyUp;
event.keyCode = modifier;
post(display, event);
}
}
/**
* Perform a keypress using the supplied key and optional modifiers.
*
* @param display The Display instance.
* @param key The SWT character key.
* @param modifiers Optional one or more SWT key modifiers
*/
public static void doKeypress(Display display, char key, int ... modifiers)
{
for (int modifier : modifiers){
Event event = new Event();
event.type = SWT.KeyDown;
event.keyCode = modifier;
post(display, event);
}
Event event = new Event();
event.character = key;
event.type = SWT.KeyDown;
post(display, event);
event.type = SWT.KeyUp;
post(display, event);
for (int modifier : modifiers){
event = new Event();
event.type = SWT.KeyUp;
event.keyCode = modifier;
post(display, event);
}
}
private static void post(Display display, Event event)
{
if (!display.post(event)){
throw new RuntimeException("Failed to post event.");
}
}
}