Project: eclim
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 = {00}; 
    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 = {00}; 
        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."); 
    } 
  } 
}