Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[gef-dev] ChopboxAnchor/AutomaticRouter bug?

My problem:

"My polyline connection uses ChopboxAnchors and
FanRouter+BendpointConnectionRouter like in the Logic example. However, if i
move a node with two or more connections, one one of the connections move
along with the node. The others stay hanging in the original place. If i
click on any of these dangling connections, they refresh and fix themselves
to the node automatically."

I debugged a little and found that ChopboxAnchor and AutomaticRouter have 
certain behaviors that might be leading to the above problem: 
1. The automatic router (FanRouter in my case) groups together all anchors on 
mulitple connections that are at the same "location" using a HashKey. This is 
so that it can take approriate handleCollision action. In the case of 
FanRouter, it inserts an additional bendpoint inorder to fan out. It order to 
find out if 2 anchors on different connections are at the same location, the 
router expexts the Anchor class to implement the equals method and the 
getHashCode method. 
2. The equals method in ChopboxAnchor returns true if the two chopbox anchors 
belong to the same figure irrespective of the location of the anchor on the 
figure.So, two anchors may be at opposite sides of the figure, but will still 
return true. This should not be the case, in my opinion. Only a new anchor 
that is at the exact location as an exisiting one should return true. A new 
anchor at the opposite side of the figure should return false.

So, I modified ChopboxAnchor behavior to as follows and there is some 
improvement:

protected Point locationPoint; // new variable to store anchor location.

public Point getLocation(Point reference) { // super class is ChopboxAnchor
  locationPoint = super.getLocation(reference);
  return locationPoint;
 }

public boolean equals(Object obj) { // returns true only if the location of 
both anchors
                                                    // is exactly the same.
  if (obj instanceof MyChopboxAnchor ) {
   MyChopboxAnchor other = (MyChopboxAnchor )obj;
   if (getLocationPoint() != null && other.getLocationPoint() != null)
    return other.getOwner() == getOwner() && 
other.getLocationPoint().equals(getLocationPoint());
  }
  return false;
 }

After implementing this, the above dangling problem is not caused for ALL 
connections on a node. It is caused for ONLY those connections using anchors 
at the same location on the node boundary. i.e. if the node has 2 connections 
on two opposite sides, moving the node WILL NOT leave some connections 
dangling.

For those connections that DO have anchors at the exact same location, Here's 
what is causing the dangling problem. But i have no idea where it is being 
caused and how to fix it:

At some point, by some class, the connection figures get removed from the list 
of AnchorListeners in the ChopboxAnchor. This occurs for all connections 
except the last one added to the figure. I found this by moving the node 
figure and debugging ancestorMoved(IFigure figure) method in 
AbstractConnectionAnchor class. Inspecting the variables in the class shows 
that all anchors except one, on the figure had AnchorListener = null even 
though they have connections associated with them. Therefore if the node 
figure is moved, the connections do not receive anchorMoved events and the 
connections are left dangling!

I tried a lot to find out where this was occuring, but i was unsuccesful. Can 
any of the experts help?

thanks



Back to the top