private void Reset()
 {
     this.m_Active                  = false;
     this.m_Edge                    = null;
     this.m_ConnectedPort           = null;
     this.m_ConnectedEdgeDragHelper = null;
     this.m_DetachedPort            = null;
     this.m_DetachedFromInputPort   = false;
 }
 protected void OnMouseMove(MouseMoveEvent evt)
 {
     if (this.m_Edge != null)
     {
         evt.StopPropagation();
         if (this.m_DetachedPort == null)
         {
             float magnitude = (evt.mousePosition - this.m_PressPos).magnitude;
             if (magnitude < (float)EdgeManipulator.s_StartDragDistance)
             {
                 return;
             }
             Vector2 b          = new Vector2(this.m_Edge.output.GetGlobalCenter().x, this.m_Edge.output.GetGlobalCenter().y);
             Vector2 b2         = new Vector2(this.m_Edge.input.GetGlobalCenter().x, this.m_Edge.input.GetGlobalCenter().y);
             float   magnitude2 = (this.m_PressPos - b).magnitude;
             float   magnitude3 = (this.m_PressPos - b2).magnitude;
             this.m_DetachedFromInputPort = (magnitude3 < magnitude2);
             if (this.m_DetachedFromInputPort)
             {
                 this.m_ConnectedPort = this.m_Edge.output;
                 this.m_DetachedPort  = this.m_Edge.input;
                 this.m_DetachedPort.Disconnect(this.m_Edge);
                 this.m_Edge.input = null;
                 if (this.m_EdgePresenter != null)
                 {
                     this.m_EdgePresenter.input = null;
                 }
             }
             else
             {
                 this.m_ConnectedPort = this.m_Edge.input;
                 this.m_DetachedPort  = this.m_Edge.output;
                 this.m_DetachedPort.Disconnect(this.m_Edge);
                 this.m_Edge.output = null;
                 if (this.m_EdgePresenter != null)
                 {
                     this.m_EdgePresenter.output = null;
                 }
             }
             this.m_ConnectedEdgeDragHelper               = this.m_ConnectedPort.edgeConnector.edgeDragHelper;
             this.m_ConnectedEdgeDragHelper.draggedPort   = this.m_ConnectedPort;
             this.m_ConnectedEdgeDragHelper.edgeCandidate = this.m_Edge;
             this.m_Edge.candidatePosition = evt.mousePosition;
             if (this.m_ConnectedEdgeDragHelper.HandleMouseDown(this.m_LastMouseDownEvent))
             {
                 this.m_Active = true;
             }
             else
             {
                 this.Reset();
             }
             this.m_LastMouseDownEvent = null;
         }
         if (this.m_Active)
         {
             if (this.m_EdgePresenter != null)
             {
                 this.m_EdgePresenter.candidatePosition = evt.mousePosition;
             }
             this.m_ConnectedEdgeDragHelper.HandleMouseMove(evt);
         }
     }
 }
        protected void OnMouseMove(MouseMoveEvent evt)
        {
            /// If the left mouse button is not down then return
            if (m_Edge == null)
            {
                return;
            }

            evt.StopPropagation();

            bool alreadyDetached = (m_DetachedPort != null);

            // If one end of the edge is not already detached then
            if (!alreadyDetached)
            {
                float delta = (evt.mousePosition - m_PressPos).magnitude;

                if (delta < s_StartDragDistance)
                {
                    return;
                }

                /// Determine which end is the nearest to the mouse position then detach it.
                Vector2 outputPos = new Vector2(m_Edge.output.GetGlobalCenter().x, m_Edge.output.GetGlobalCenter().y);
                Vector2 inputPos  = new Vector2(m_Edge.input.GetGlobalCenter().x, m_Edge.input.GetGlobalCenter().y);

                float distanceFromOutput = (m_PressPos - outputPos).magnitude;
                float distanceFromInput  = (m_PressPos - inputPos).magnitude;

                m_DetachedFromInputPort = distanceFromInput < distanceFromOutput;

                if (m_DetachedFromInputPort)
                {
                    m_ConnectedPort = m_Edge.output;
                    m_DetachedPort  = m_Edge.input;
                    m_DetachedPort.Disconnect(m_Edge);

                    m_Edge.input = null;
                    if (m_EdgePresenter != null)
                    {
                        m_EdgePresenter.input = null;
                    }
                }
                else
                {
                    m_ConnectedPort = m_Edge.input;
                    m_DetachedPort  = m_Edge.output;
                    m_DetachedPort.Disconnect(m_Edge);

                    m_Edge.output = null;
                    if (m_EdgePresenter != null)
                    {
                        m_EdgePresenter.output = null;
                    }
                }

                // Use the edge drag helper of the still connected port
                m_ConnectedEdgeDragHelper               = m_ConnectedPort.edgeConnector.edgeDragHelper;
                m_ConnectedEdgeDragHelper.draggedPort   = m_ConnectedPort;
                m_ConnectedEdgeDragHelper.edgeCandidate = m_Edge;
                m_Edge.candidatePosition = evt.mousePosition;

                // Redirect the last mouse down event to active the drag helper

                if (m_ConnectedEdgeDragHelper.HandleMouseDown(m_LastMouseDownEvent))
                {
                    m_Active = true;
                }
                else
                {
                    Reset();
                }
                m_LastMouseDownEvent = null;
            }

            if (m_Active)
            {
                if (m_EdgePresenter != null)
                {
                    m_EdgePresenter.candidatePosition = evt.mousePosition;
                }
                m_ConnectedEdgeDragHelper.HandleMouseMove(evt);
            }
        }