]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.diagram/src/org/simantics/diagram/participant/RouteGraphConnectTool.java
Simplified diagram connection creation
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / participant / RouteGraphConnectTool.java
index 4cccea938270b6b8ac0b50baf6ac91d2b190528a..8f99207e19c77cb00f55288f8bd4d218aca06cdf 100644 (file)
@@ -85,6 +85,7 @@ import org.simantics.scenegraph.g2d.events.KeyEvent.KeyPressedEvent;
 import org.simantics.scenegraph.g2d.events.MouseEvent;
 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseButtonEvent;
 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseButtonPressedEvent;
+import org.simantics.scenegraph.g2d.events.MouseEvent.MouseButtonReleasedEvent;
 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseMovedEvent;
 import org.simantics.scenegraph.g2d.events.command.CommandEvent;
 import org.simantics.scenegraph.g2d.events.command.Commands;
@@ -477,6 +478,10 @@ public class RouteGraphConnectTool extends AbstractMode {
         if (me instanceof MouseButtonPressedEvent)
             return processMouseButtonPress((MouseButtonPressedEvent) me);
 
+        // #7653: Support creating connections between terminals without lifting mouse button in between.
+        if (me instanceof MouseButtonReleasedEvent)
+            return processMouseButtonRelease((MouseButtonReleasedEvent) me);
+
         return false;
     }
 
@@ -566,10 +571,8 @@ public class RouteGraphConnectTool extends AbstractMode {
     protected void disconnect(Point2D mouseCanvasPos) {
         setEndTerminal(mouseCanvasPos.getX(), mouseCanvasPos.getY(), null, 0xf);
     }
-    
-    protected boolean processMouseButtonPress(MouseButtonPressedEvent e) {
-        MouseButtonEvent me = e;
 
+    protected boolean processMouseButtonPress(MouseButtonEvent me) {
         // Do nothing before the mouse has moved at least a little.
         // This prevents the user from ending the connection right where
         // it started.
@@ -585,9 +588,7 @@ public class RouteGraphConnectTool extends AbstractMode {
                 snapAdvisor.snap(mouseCanvasPos);
 
             // Clicked on an allowed end terminal. End connection & end mode.
-            if (isEndTerminalDefined()) {
-                createConnection();
-                remove();
+            if (tryEndConnection()) {
                 return true;
             } else {
                 // Finish connection in thin air only if the
@@ -617,6 +618,28 @@ public class RouteGraphConnectTool extends AbstractMode {
         return false;
     }
 
+    private int mouseLeftReleaseCount = 0;
+
+    protected boolean processMouseButtonRelease(MouseButtonReleasedEvent me) {
+        if (me.button == MouseEvent.LEFT_BUTTON
+                && ++mouseLeftReleaseCount == 1) {
+            return tryEndConnection();
+        }
+        return false;
+    }
+
+    /**
+     * @return <code>true</code> if connection was successfully ended
+     */
+    private boolean tryEndConnection() {
+        if (isEndTerminalDefined()) {
+            createConnection();
+            remove();
+            return true;
+        }
+        return false;
+    }
+
     protected boolean cancelPreviousBend() {
         if (!routePointsAllowed())
             return false;