Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[platform-swt-dev] Display mouse events

Fellow SWTers,
   I wrote a simple widget similar to the Windows
"magnifier" (see source at the end of the email). My
problem is that I want my application to listen to
MouseMove events globally to the display. Is that
possible in SWT? I've tried adding a MouseMove listener
to an instance of display obtained using
Display.getDefault() but that doesn't seem to work. 

Thanks,
  Brian

Here's the code:

package com.integrallis.ui.custom;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseMoveListener;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;

/**
 * @author Brian Sam-Bodden
 */
public class Magnifier extends Canvas {

	private Display display;
	private int zoom = 2;
	private Image buffer;
	private GC screenGC;
    private Point previousCursorPosition;
    private boolean alwaysRepaint = false;

	/**
	 * @param parent
	 * @param style
	 */
	public Magnifier(Composite parent, int style) {
		super(parent, style);

		// create a GC for the display
		display = Display.getDefault();
		screenGC = new GC(display);

		zoom = 2;

		addPaintListener(new PaintListener() {
			public void paintControl(PaintEvent e) {
				Magnifier.this.onPaint(e);
			}
		});

		addDisposeListener(new DisposeListener() {
			public void widgetDisposed(DisposeEvent e) {
				Magnifier.this.onDispose(e);
			}
		});
        
        // this doesn't work :(
		display.addListener(SWT.MouseMove, new Listener() {
			public void handleEvent(Event event) {
                System.out.println("display MouseMove
event");
				redraw();
			}
		});
        
        // .. and this doesn't help
		addMouseMoveListener(new MouseMoveListener() {
			public void mouseMove(MouseEvent e) {
				redraw();
			}
		});
        
	}

	/**
	 * @param e
	 */
	protected void onDispose(DisposeEvent e) {
		if (screenGC != null) {
			screenGC.dispose();
		}
	}

	/**
	 * @param e
	 */
	protected void onPaint(PaintEvent e) {
		// get the cursor position
		Point cp = display.getCursorLocation();
        
        // don't repaint if the mouse hasn't moved
        if (!alwaysRepaint &&
(cp.equals(previousCursorPosition))) {
            return;
        }
        
        previousCursorPosition = cp;

        // get the size of the control  
		Point size = getSize();
        
        // determine the area to capture
		Point capture = new Point(size.x / zoom, size.y /
zoom);

		// determine the area to get
		Rectangle screen = display.getBounds();   
		Point copyPos = new Point(0, 0);

		if ((cp.x - capture.x / 2) < 0) {
			copyPos.x = 0;
		} else if ((cp.x + capture.x / 2) > screen.width) {
			copyPos.x = screen.width - capture.x;
		} else {
			copyPos.x = cp.x - (capture.x / 2);
		}

		if ((cp.y - capture.y / 2) < 0) {
			copyPos.y = 0;
		} else if ((cp.y + capture.y / 2) > screen.height) {
			copyPos.y = screen.height - capture.y;
		} else {
			copyPos.y = cp.y - (capture.y / 2);
		}

		// Copy rectangle from screen to memory...  
		buffer = new Image(display, capture.x, capture.y);
		screenGC.copyArea(buffer, copyPos.x, copyPos.y);

		// zoom the memory image
		final Image scaled =
			new Image(
				display,
				buffer.getImageData().scaledTo(size.x, size.y));

		// paint scaled image on the canvas
		e.gc.drawImage(scaled, 0, 0);
        
        // clean up
        buffer.dispose();
        scaled.dispose();
	}

	public Point computeSize(int wHint, int hHint, boolean
changed) {
		checkWidget();
		Point e = new Point(0, 0);

		if (wHint == SWT.DEFAULT) {
			e.x = 100;
		} else {
			e.x = wHint;
		}
		if (hHint == SWT.DEFAULT) {
			e.y = 100;
		} else {
			e.y = hHint;
		}

		return e;
	}

	/**
	 * @return
	 */
	public int getZoom() {
		return zoom;
	}

	/**
	 * @param i
	 */
	public void setZoom(int i) {
        if (i == zoom) return;
		zoom = i;
	}

	/**
	 * @return
	 */
	public boolean getAlwaysRepaint() {
		return alwaysRepaint;
	}

	/**
	 * @param b
	 */
	public void setAlwaysRepaint(boolean b) {
		alwaysRepaint = b;
	}

}


Back to the top