/// <summary>
        /// Process events for Mouse or Touch input.
        /// </summary>
        /// <param name="inputPos">location of cursor</param>
        /// <param name="inputPressed">down this frame</param>
        /// <param name="inputReleased">up this frame</param>
        /// <param name="inputMoved">cursor in a different location</param>
        /// <param name="lastOver">last element that the cursor was over, ref is saved here for next update</param>
        void updateInputPoint(Vector2 inputPos, bool inputPressed, bool inputReleased, bool inputMoved, ref Element lastOver)
        {
            var over = hit(inputPos);

            CurrentlyOver = over;
            if (over != null)
            {
                handleMouseWheel(over);
            }

            if (inputPressed)
            {
                pressed = true;
                updateInputDown(inputPos, over);
            }
            if (inputMoved)
            {
                DragAndDropSystem.UpdateDrag(inputPos);
                updateInputMoved(inputPos, over, lastOver);
            }
            if (inputReleased)
            {
                pressed = false;
                updateInputReleased(inputPos);
            }

            lastOver = over;
        }
 /// <summary>
 /// Mouse or touch is being released this frame.
 /// </summary>
 /// <param name="inputPos">location under cursor</param>
 void updateInputReleased(Vector2 inputPos)
 {
     for (var i = _inputFocusListeners.Count - 1; i >= 0; i--)
     {
         ((IInputListener)_inputFocusListeners[i]).onMouseUp(_inputFocusListeners[i].stageToLocalCoordinates(inputPos));
         if (DragAndDropSystem.DraggedElement != null)
         {
             IDropTarget myResult = CurrentlyOver as IDropTarget;
             if (myResult != null && myResult.CanAccept(DragAndDropSystem.DraggedElement))
             {
                 DragAndDropSystem.AcceptElement(myResult);
             }
         }
     }
     _inputFocusListeners.Clear();
 }
        /// <summary>
        /// Mouse or touch is being moved.
        /// </summary>
        /// <param name="inputPos">location of cursor</param>
        /// <param name="over">element under cursor</param>
        /// <param name="lastOver">element that was previously under the cursor</param>
        void updateInputMoved(Vector2 inputPos, Element over, Element lastOver)
        {
            for (var i = _inputFocusListeners.Count - 1; i >= 0; i--)
            {
                ((IInputListener)_inputFocusListeners[i]).onMouseMoved(_inputFocusListeners[i].stageToLocalCoordinates(inputPos));
            }
            if (pressed)
            {
                if (over != null)
                {
                    IDraggableElement myOver = over as IDraggableElement;
                    if (myOver != null)
                    {
                        DragAndDropSystem.StartDrag(inputPos, this, myOver);
                    }
                }
            }

            if (over != lastOver)
            {
                (over as IInputListener)?.onMouseEnter();
                (lastOver as IInputListener)?.onMouseExit();
            }
        }
 /// <summary>
 /// this should be called when the Component is removed to ensure all objects are freed
 /// </summary>
 public void dispose()
 {
     root.clear();
     DragAndDropSystem.ResetDragged();
 }