cleaned up connection routing, connections that share the same endpoint no longer collide - this requires unfortunately copying massive amounts of code from the graph library, ticket 99054 has been filed so that hopefully the graph library can be modified to pass in context to the collisions collector. Until then, this copy and pasted code is necessary. versionability_89629_base_1
authorjsandusky@netbeans.org
Mon, 26 Mar 2007 22:48:13 +0000
changeset 194f4c290914d18
parent 193 94d72363875e
child 195 53504a3ddbca
cleaned up connection routing, connections that share the same endpoint no longer collide - this requires unfortunately copying massive amounts of code from the graph library, ticket 99054 has been filed so that hopefully the graph library can be modified to pass in context to the collisions collector. Until then, this copy and pasted code is necessary.
compapp.casaeditor/src/org/netbeans/modules/compapp/casaeditor/design/CasaModelGraphUtilities.java
compapp.casaeditor/src/org/netbeans/modules/compapp/casaeditor/graph/layout/CasaCollisionCollector.java
     1.1 --- a/compapp.casaeditor/src/org/netbeans/modules/compapp/casaeditor/design/CasaModelGraphUtilities.java	Mon Mar 26 20:59:13 2007 +0000
     1.2 +++ b/compapp.casaeditor/src/org/netbeans/modules/compapp/casaeditor/design/CasaModelGraphUtilities.java	Mon Mar 26 22:48:13 2007 +0000
     1.3 @@ -25,17 +25,14 @@
     1.4  import java.util.ArrayList;
     1.5  import java.util.HashMap;
     1.6  import java.util.Map;
     1.7 -import javax.swing.SwingUtilities;
     1.8 -import org.netbeans.api.visual.router.RouterFactory;
     1.9 -import org.netbeans.api.visual.widget.LabelWidget;
    1.10  import org.netbeans.api.visual.widget.Widget;
    1.11 -import org.netbeans.api.visual.widget.Widget.Dependency;
    1.12  import org.netbeans.modules.compapp.casaeditor.Constants;
    1.13  import org.netbeans.modules.compapp.casaeditor.graph.CasaNodeWidget;
    1.14  import org.netbeans.modules.compapp.casaeditor.graph.CasaPinWidget;
    1.15  import org.netbeans.modules.compapp.casaeditor.graph.CasaRegionWidget;
    1.16  import org.netbeans.modules.compapp.casaeditor.graph.RegionUtilities;
    1.17  import org.netbeans.modules.compapp.casaeditor.graph.layout.CasaCollisionCollector;
    1.18 +import org.netbeans.modules.compapp.casaeditor.graph.layout.CasaOrthogonalSearchRouter;
    1.19  import org.netbeans.modules.compapp.casaeditor.graph.layout.ModelLoadLayoutInfo;
    1.20  import org.netbeans.modules.compapp.casaeditor.model.casa.CasaWrapperModel;
    1.21  import org.netbeans.modules.compapp.casaeditor.model.casa.CasaComponent;
    1.22 @@ -159,7 +156,11 @@
    1.23          externalRegionWidget.setPreferredBounds(new Rectangle(externalWidth, RegionUtilities.DEFAULT_HEIGHT));
    1.24  
    1.25          // Set up a new connection router to account for the widgets in our regions.
    1.26 -        scene.setRouter(RouterFactory.createOrthogonalSearchRouter(new CasaCollisionCollector(
    1.27 +        // We, temporarily, do not use the standard OrthogonalSearchRouter. We used a slightly
    1.28 +        // modified version that can support passing in the context ConnectionWidget so that
    1.29 +        // connections that share endpoints do not collide with each other.
    1.30 +//        scene.setRouter(RouterFactory.createOrthogonalSearchRouter(new CasaCollisionCollector(
    1.31 +        scene.setRouter(new CasaOrthogonalSearchRouter(new CasaCollisionCollector(
    1.32                  bindingRegionWidget,
    1.33                  engineRegionWidget,
    1.34                  externalRegionWidget,
     2.1 --- a/compapp.casaeditor/src/org/netbeans/modules/compapp/casaeditor/graph/layout/CasaCollisionCollector.java	Mon Mar 26 20:59:13 2007 +0000
     2.2 +++ b/compapp.casaeditor/src/org/netbeans/modules/compapp/casaeditor/graph/layout/CasaCollisionCollector.java	Mon Mar 26 22:48:13 2007 +0000
     2.3 @@ -18,22 +18,33 @@
     2.4   */
     2.5  package org.netbeans.modules.compapp.casaeditor.graph.layout;
     2.6  
     2.7 -import org.netbeans.api.visual.router.CollisionsCollector;
     2.8 +import java.awt.Point;
     2.9 +import java.awt.Rectangle;
    2.10  import org.netbeans.api.visual.widget.ConnectionWidget;
    2.11  import org.netbeans.api.visual.widget.LayerWidget;
    2.12  import org.netbeans.api.visual.widget.Widget;
    2.13  
    2.14 -import java.awt.*;
    2.15  import java.util.ArrayList;
    2.16  import java.util.Collection;
    2.17 +import java.util.List;
    2.18 +import org.netbeans.modules.compapp.casaeditor.design.CasaModelGraphScene;
    2.19  import org.netbeans.modules.compapp.casaeditor.graph.CasaNodeWidget;
    2.20 +import org.netbeans.modules.compapp.casaeditor.model.casa.CasaConnection;
    2.21 +import org.netbeans.modules.compapp.casaeditor.model.casa.CasaEndpointRef;
    2.22 +import org.netbeans.modules.compapp.casaeditor.model.casa.CasaWrapperModel;
    2.23  
    2.24  /**
    2.25   * Modified to only register CasaNodeWidget widgets as being collisions.
    2.26 + * This is no longer an actual org.netbeans.api.visual.router.CollisionsCollector.
    2.27 + * We need to prevent connections that share the same endpoints from colliding,
    2.28 + * and in order to do so, the collisions collector must have some context - which
    2.29 + * is not by default provided by the graph library. Thus, the orthogonal
    2.30 + * search routing code has been copied, *temporarily*, until the graph library
    2.31 + * can be modified to pass in context into the collisions collector.
    2.32   *
    2.33 - * @author David Kaspar
    2.34 + * @author Josh Sandusky
    2.35   */
    2.36 -public class CasaCollisionCollector implements CollisionsCollector {
    2.37 +public class CasaCollisionCollector {
    2.38  
    2.39      private static final int SPACING_EDGE = 8;
    2.40      private static final int SPACING_NODE = 16;
    2.41 @@ -45,15 +56,36 @@
    2.42      }
    2.43  
    2.44      
    2.45 -    public void collectCollisions (java.util.List<Rectangle> verticalCollisions, java.util.List<Rectangle> horizontalCollisions) {
    2.46 +    public void collectCollisions (
    2.47 +            ConnectionWidget connectionWidget, 
    2.48 +            List<Rectangle> verticalCollisions, 
    2.49 +            List<Rectangle> horizontalCollisions)
    2.50 +    {
    2.51 +        CasaEndpointRef[] connectionEndpoints = getEndpoints(connectionWidget);
    2.52 +        
    2.53          for (Widget widget : getWidgets ()) {
    2.54 -            if (! widget.isValidated ())
    2.55 +            
    2.56 +            if (!widget.isValidated ()) {
    2.57                  continue;
    2.58 +            }
    2.59 +            
    2.60 +            if (widget == connectionWidget) {
    2.61 +                continue;
    2.62 +            }
    2.63 +            
    2.64              if (widget instanceof ConnectionWidget) {
    2.65 -                ConnectionWidget conn = (ConnectionWidget) widget;
    2.66 -                if (! conn.isRouted ())
    2.67 +                ConnectionWidget iterConnection = (ConnectionWidget) widget;
    2.68 +                if (!iterConnection.isRouted ()) {
    2.69                      continue;
    2.70 -                java.util.List<Point> controlPoints = conn.getControlPoints ();
    2.71 +                }
    2.72 +                
    2.73 +                if (
    2.74 +                        connectionEndpoints.length > 0 && 
    2.75 +                        sharesEndpoints(connectionEndpoints, iterConnection)) {
    2.76 +                    continue;
    2.77 +                }
    2.78 +                
    2.79 +                List<Point> controlPoints = iterConnection.getControlPoints ();
    2.80                  int last = controlPoints.size () - 1;
    2.81                  for (int i = 0; i < last; i ++) {
    2.82                      Point point1 = controlPoints.get (i);
    2.83 @@ -88,4 +120,37 @@
    2.84          return list;
    2.85      }
    2.86  
    2.87 +    private CasaEndpointRef[] getEndpoints(ConnectionWidget connectionWidget) {
    2.88 +        CasaModelGraphScene scene = (CasaModelGraphScene) connectionWidget.getScene();
    2.89 +        CasaConnection connection = (CasaConnection) scene.findObject(connectionWidget);
    2.90 +        if (connection == null) {
    2.91 +            return new CasaEndpointRef[0];
    2.92 +        }
    2.93 +        
    2.94 +        CasaWrapperModel model = scene.getModel();
    2.95 +        CasaEndpointRef consumes = model.getCasaEndpointRef(connection, true);
    2.96 +        CasaEndpointRef provides = model.getCasaEndpointRef(connection, false);
    2.97 +        if (consumes != null && provides != null) {
    2.98 +            return new CasaEndpointRef[] { consumes, provides };
    2.99 +        } else if (consumes != null) {
   2.100 +            return new CasaEndpointRef[] { consumes };
   2.101 +        } else if (provides != null) {
   2.102 +            return new CasaEndpointRef[] { provides };
   2.103 +        }
   2.104 +        return new CasaEndpointRef[0];
   2.105 +    }
   2.106 +    
   2.107 +    private boolean sharesEndpoints(CasaEndpointRef[] endpoints, ConnectionWidget connectionWidget) {
   2.108 +        CasaEndpointRef[] otherEndpoints = getEndpoints(connectionWidget);
   2.109 +        if (otherEndpoints.length > 0) {
   2.110 +            for (CasaEndpointRef endpoint : endpoints) {
   2.111 +                for (CasaEndpointRef iterEndpoint : otherEndpoints) {
   2.112 +                    if (endpoint == iterEndpoint) {
   2.113 +                        return true;
   2.114 +                    }
   2.115 +                }
   2.116 +            }
   2.117 +        }
   2.118 +        return false;
   2.119 +    }
   2.120  }