/// <summary>
        /// Move item from source index to destination index.
        /// </summary>
        /// <param name="adaptor">Reorderable list adaptor.</param>
        /// <param name="sourceIndex">Zero-based index of source item.</param>
        /// <param name="destIndex">Zero-based index of destination index.</param>
        protected void MoveItem(IReorderableListAdaptor adaptor, int sourceIndex, int destIndex)
        {
            // Raise event before moving item so that the operation can be cancelled.
            var movingEventArgs = new ItemMovingEventArgs(adaptor, sourceIndex, destIndex);
            OnItemMoving(movingEventArgs);
            if (!movingEventArgs.Cancel) {
                adaptor.Move(sourceIndex, destIndex);

                // Item was actually moved!
                int newIndex = destIndex;
                if (newIndex > sourceIndex)
                    --newIndex;
                OnItemMoved(new ItemMovedEventArgs(adaptor, sourceIndex, newIndex));

                GUI.changed = true;
            }
            ReorderableListGUI.IndexOfChangedItem = -1;
        }
 /// <summary>
 /// Raises event immediately before list item is moved and provides oppertunity to cancel.
 /// </summary>
 /// <param name="args">Event arguments.</param>
 protected virtual void OnItemMoving(ItemMovingEventArgs args)
 {
     if (ItemMoving != null)
         ItemMoving(this, args);
 }