X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.g2d%2Fsrc%2Forg%2Fsimantics%2Fg2d%2Fevent%2Fadapter%2FSWTMouseEventAdapter.java;fp=bundles%2Forg.simantics.g2d%2Fsrc%2Forg%2Fsimantics%2Fg2d%2Fevent%2Fadapter%2FSWTMouseEventAdapter.java;h=4a50d9767958ae19174d19abcae57986837f702e;hp=0000000000000000000000000000000000000000;hb=969bd23cab98a79ca9101af33334000879fb60c5;hpb=866dba5cd5a3929bbeae85991796acb212338a08 diff --git a/bundles/org.simantics.g2d/src/org/simantics/g2d/event/adapter/SWTMouseEventAdapter.java b/bundles/org.simantics.g2d/src/org/simantics/g2d/event/adapter/SWTMouseEventAdapter.java new file mode 100644 index 000000000..4a50d9767 --- /dev/null +++ b/bundles/org.simantics.g2d/src/org/simantics/g2d/event/adapter/SWTMouseEventAdapter.java @@ -0,0 +1,174 @@ +/******************************************************************************* + * Copyright (c) 2007, 2010 Association for Decentralized Information Management + * in Industry THTH ry. + * 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: + * VTT Technical Research Centre of Finland - initial API and implementation + *******************************************************************************/ +/* + * + * @author Toni Kalajainen + */ +package org.simantics.g2d.event.adapter; + +import java.awt.geom.Point2D; + +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.events.MouseListener; +import org.eclipse.swt.events.MouseMoveListener; +import org.eclipse.swt.events.MouseTrackListener; +import org.eclipse.swt.events.MouseWheelListener; +import org.eclipse.swt.graphics.Point; +import org.simantics.scenegraph.g2d.events.EventDebugPolicy; +import org.simantics.scenegraph.g2d.events.IEventHandler; +import org.simantics.scenegraph.g2d.events.IEventQueue; +import org.simantics.scenegraph.g2d.events.MouseEvent.MouseButtonPressedEvent; +import org.simantics.scenegraph.g2d.events.MouseEvent.MouseButtonReleasedEvent; +import org.simantics.scenegraph.g2d.events.MouseEvent.MouseDoubleClickedEvent; +import org.simantics.scenegraph.g2d.events.MouseEvent.MouseEnterEvent; +import org.simantics.scenegraph.g2d.events.MouseEvent.MouseExitEvent; +import org.simantics.scenegraph.g2d.events.MouseEvent.MouseMovedEvent; +import org.simantics.scenegraph.g2d.events.MouseEvent.MouseWheelMovedEvent; +import org.simantics.scenegraph.g2d.events.adapter.AbstractEventAdapter; + +public class SWTMouseEventAdapter extends AbstractEventAdapter implements MouseListener, MouseMoveListener, MouseTrackListener, MouseWheelListener { + + /** Mouse id of the default mouse */ + public static final int MOUSE_ID = 0; + + private long [] pressTime = new long[5]; + + int buttonStatus = 0; + + /** + * create new adapter + * @param sender the sender field in the events + * @param delegator the target of the adapted events + */ + public SWTMouseEventAdapter(Object sender, IEventHandler delegator) { + super(sender, delegator); + } + + /** + * create new adapter + * @param sender the sender field in the events + * @param queue + */ + public SWTMouseEventAdapter(Object sender, IEventQueue queue) { + super(sender, queue); + } + + private Point2D getControlPosition(MouseEvent e) + { + return new Point2D.Double(e.x, e.y); + } + + private Point2D getScreenPosition(MouseEvent e) + { + Point p = e.display.getCursorLocation(); + return new Point2D.Double(p.x, p.y); + + } + + private int getMouseButton(MouseEvent e) + { + switch (e.button) { + case 1: return 1; // LEFT + case 2: return 3; // RIGHT + case 3: return 2; // MIDDLE + case 4: return 4; // BUTTON4 + case 5: return 5; // BUTTON5 + } + return e.button; + } + + static private int getStateMask(MouseEvent e) { + return SWTKeyEventAdapter.adaptSWTModifierToAWTModifier(e.stateMask); + } + + @Override + public void mouseDoubleClick(MouseEvent e) { + if (EventDebugPolicy.SWT_MOUSE_EVENT_ADAPTION) + System.out.println("SWT mouse double clicked: " + e); + handleEvent(new MouseDoubleClickedEvent( + sender, e.time & 0xffffffff, MOUSE_ID, buttonStatus, getStateMask(e), getMouseButton(e), getControlPosition(e), getScreenPosition(e) + )); + } + + @Override + public void mouseDown(MouseEvent e) { + if (EventDebugPolicy.SWT_MOUSE_EVENT_ADAPTION) + System.out.println("SWT mouse down: " + e); + buttonStatus |= 1 << e.button; + if (e.button<=pressTime.length) pressTime[e.button-1] = e.time & 0xffffffff; + handleEvent(new MouseButtonPressedEvent( + sender, e.time & 0xffffffff, MOUSE_ID, buttonStatus, getStateMask(e), getMouseButton(e), getControlPosition(e), getScreenPosition(e) + )); + } + + @Override + public void mouseUp(MouseEvent e) { + if (EventDebugPolicy.SWT_MOUSE_EVENT_ADAPTION) + System.out.println("SWT mouse up: " + e); + buttonStatus &=~ (1<