]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scenegraph/src/org/simantics/scenegraph/g2d/events/adapter/AWTMouseEventAdapter.java
Trigger all drag start events from single place
[simantics/platform.git] / bundles / org.simantics.scenegraph / src / org / simantics / scenegraph / g2d / events / adapter / AWTMouseEventAdapter.java
index bad131312a337ce33195346fde1d1a6c4888b145..e01876c6d0000dfa1049631cf9d766cf8fbc4713 100644 (file)
  */
 package org.simantics.scenegraph.g2d.events.adapter;
 
  */
 package org.simantics.scenegraph.g2d.events.adapter;
 
+import java.awt.Component;
+import java.awt.dnd.DnDConstants;
+import java.awt.dnd.DragGestureEvent;
+import java.awt.dnd.DragGestureListener;
+import java.awt.dnd.DragSource;
 import java.awt.event.InputEvent;
 import java.awt.event.MouseEvent;
 import java.awt.event.MouseListener;
 import java.awt.event.InputEvent;
 import java.awt.event.MouseEvent;
 import java.awt.event.MouseListener;
@@ -22,6 +27,7 @@ import java.awt.event.MouseMotionListener;
 import java.awt.event.MouseWheelEvent;
 import java.awt.event.MouseWheelListener;
 import java.awt.geom.Point2D;
 import java.awt.event.MouseWheelEvent;
 import java.awt.event.MouseWheelListener;
 import java.awt.geom.Point2D;
+import java.util.function.UnaryOperator;
 
 import org.simantics.scenegraph.g2d.events.EventDebugPolicy;
 import org.simantics.scenegraph.g2d.events.IEventHandler;
 
 import org.simantics.scenegraph.g2d.events.EventDebugPolicy;
 import org.simantics.scenegraph.g2d.events.IEventHandler;
@@ -29,6 +35,7 @@ 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.MouseButtonPressedEvent;
 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseButtonReleasedEvent;
 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseDoubleClickedEvent;
+import org.simantics.scenegraph.g2d.events.MouseEvent.MouseDragBegin;
 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.MouseEnterEvent;
 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseExitEvent;
 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseMovedEvent;
@@ -289,4 +296,38 @@ public class AWTMouseEventAdapter extends AbstractEventAdapter implements MouseL
             System.out.println("AWT mouse clicked: " + e);
     }
 
             System.out.println("AWT mouse clicked: " + e);
     }
 
+    public void initDragGestureListener(Component rootPane, UnaryOperator<Point2D> controlToCanvas) {
+        final DragSource ds = new DragSource();
+        DragGestureListener dgl = new DragGestureListener() {
+            @Override
+            public void dragGestureRecognized(DragGestureEvent dge) {
+                InputEvent ie = dge.getTriggerEvent();
+                if (ie instanceof java.awt.event.MouseEvent) {
+                    java.awt.event.MouseEvent e = (java.awt.event.MouseEvent) ie;
+                    Point2D controlPos = getControlPosition(e);
+                    Point2D canvasPos = controlToCanvas.apply(controlPos);
+
+                    MouseDragBegin event = new MouseDragBegin(this,
+                            e.getWhen(), 0,
+                            getButtonStatus(e),
+                            getStateMask(e),
+                            getMouseButton(e),
+                            canvasPos,
+                            controlPos,
+                            controlPos,
+                            getScreenPosition(e));
+
+                    handleEvent(event);
+
+                    if (event.transferable != null) {
+                        ds.startDrag(dge, null, event.transferable, null);
+                    }
+                }
+            }
+        };
+        ds.createDefaultDragGestureRecognizer(
+                rootPane,
+                DnDConstants.ACTION_COPY_OR_MOVE | DnDConstants.ACTION_LINK,
+                dgl);
+    }
 }
 }