// ========================================
        // method
        // ========================================
        public void Route(IEdge edge)
        {
            var bendPts = default(Point[]);

            if (!edge.IsSourceConnected && !edge.IsTargetConnected)
            {
                bendPts = BothDisconnected(edge);
            }
            else if (edge.IsSourceConnected && !edge.IsTargetConnected)
            {
                bendPts = SourceConnected(edge);
                if (_NeedMoveSourcePoint)
                {
                    edge.SourcePoint = GetSourceLocation(edge);
                }
            }
            else if (!edge.IsSourceConnected && edge.IsTargetConnected)
            {
                bendPts = TargetConnected(edge);
                if (_NeedMoveTargetPoint)
                {
                    edge.TargetPoint = GetTargetLocation(edge);
                }
            }
            else if (edge.IsSourceConnected && edge.IsTargetConnected)
            {
                bendPts = BothConnected(edge);
                if (_NeedMoveSourcePoint)
                {
                    edge.SourcePoint = GetSourceLocation(edge);
                }
                if (_NeedMoveTargetPoint)
                {
                    edge.TargetPoint = GetTargetLocation(edge);
                }
            }

            edge.ClearBendPoints();
            foreach (var pt in bendPts)
            {
                // todo: constraintでptをずらせるようにする
                edge.AddBendPoint(pt);
            }
        }