void CancelDrag()
        {
            _isDragging = false;
            //If it's a clone, delete it
            if (_reorderableList.CloneDraggedObject)
            {
                Destroy(_draggingObject.gameObject);
            }
            //Else replace the draggedObject to his first place
            else
            {
                RefreshSizes();
                _draggingObject.SetParent(_reorderableList.Content, false);
                _draggingObject.rotation = _reorderableList.Content.transform.rotation;
                _draggingObject.SetSiblingIndex(_fromIndex);

                var args = new ReorderableList.ReorderableListEventStruct
                {
                    DroppedObject = _draggingObject.gameObject,
                    IsAClone      = _reorderableList.CloneDraggedObject,
                    SourceObject  = _reorderableList.CloneDraggedObject ? gameObject : _draggingObject.gameObject,
                    FromList      = _reorderableList,
                    FromIndex     = _fromIndex,
                    ToList        = _reorderableList,
                    ToIndex       = _fromIndex
                };

                _reorderableList.OnElementAdded.Invoke(args);

                if (!isValid)
                {
                    throw new Exception("Transfer is already Cancelled.");
                }
            }

            //Delete fake element
            if (_fakeElement != null)
            {
                Destroy(_fakeElement.gameObject);
            }
        }
        public void OnEndDrag(PointerEventData eventData)
        {
            if (_parentHeader != null)
            {
                _parentHeader.Dragging = false;
            }

            _isDragging = false;

            if (_draggingObject != null)
            {
                //If we have a, ReorderableList that is dropable
                //Put the dragged object into the content and at the right index
                if (_reorderableList != null && _reorderableList.IsDropable)
                {
                    var args = new ReorderableList.ReorderableListEventStruct
                    {
                        DroppedObject = _draggingObject.gameObject,
                        IsAClone      = _reorderableList.CloneDraggedObject,
                        SourceObject  = _reorderableList.CloneDraggedObject ? gameObject : _draggingObject.gameObject,
                        FromList      = _reorderableList,
                        FromIndex     = _fromIndex,
                        ToList        = _reorderableList,
                        ToIndex       = _fakeElement.GetSiblingIndex()
                    };
                    //Send OnelementDropped Event
                    if (_reorderableList && _reorderableList.OnElementDropped != null)
                    {
                        _reorderableList.OnElementDropped.Invoke(args);
                    }
                    if (!isValid)
                    {
                        CancelDrag();
                        return;
                    }
                    RefreshSizes();
                    _draggingObject.SetParent(_reorderableList.Content, false);
                    _draggingObject.rotation = _reorderableList.transform.rotation;
                    _draggingObject.SetSiblingIndex(_fakeElement.GetSiblingIndex());

                    _reorderableList.OnElementAdded.Invoke(args);

                    int index = _draggingObject.GetSiblingIndex();
                    int old   = -1;

                    if (index > 0)
                    {
                        if (_draggingObject.parent != null && _draggingObject.parent.childCount > 1)
                        {
                            var above = _draggingObject.parent.GetChild(index - 1);

                            var group = above.GetComponent <VesselGroup>();

                            if (group != null)
                            {
                                old = group.Index;
                            }
                        }
                    }

                    if (_parentHeader != null)
                    {
                        _parentHeader.UpdatePosition(index, old);
                    }

                    if (!isValid)
                    {
                        throw new Exception("It's too late to cancel the Transfer! Do so in OnElementDropped!");
                    }
                }
                //We don't have an ReorderableList
                else
                {
                    if (this.isDroppableInSpace)
                    {
                        _reorderableList.OnElementDropped.Invoke(new ReorderableList.ReorderableListEventStruct
                        {
                            DroppedObject = _draggingObject.gameObject,
                            IsAClone      = _reorderableList.CloneDraggedObject,
                            SourceObject  =
                                _reorderableList.CloneDraggedObject ? gameObject : _draggingObject.gameObject,
                            FromList  = _reorderableList,
                            FromIndex = _fromIndex
                        });
                    }
                    else
                    {
                        CancelDrag();
                    }
                }
            }

            //Delete fake element
            if (_fakeElement != null)
            {
                Destroy(_fakeElement.gameObject);
            }
        }