/// <summary>
 /// On any item drag start need to disable all items raycast for correct drop operation
 /// </summary>
 /// <param name="item"> dragged item </param>
 private void OnAnyItemDragStart(DragAndDropItem item)
 {
     UpdateMyItem();
     if (myDadItem != null)
     {
         myDadItem.MakeRaycast(false);                                                   // Disable item's raycast for correct drop handling
         if (myDadItem == item)                                                          // If item dragged from this cell
         {
             // Check cell's type
             switch (cellType)
             {
             case CellType.DropOnly:
                 DragAndDropItem.icon.SetActive(false);                                              // Item can not be dragged. Hide icon
                 break;
             }
         }
     }
 }
 /// <summary>
 /// Destroy item in this cell
 /// </summary>
 private void DestroyItem()
 {
     UpdateMyItem();
     if (myDadItem != null)
     {
         DropEventDescriptor desc = new DropEventDescriptor();
         // Fill event descriptor
         desc.triggerType     = TriggerType.ItemWillBeDestroyed;
         desc.item            = myDadItem;
         desc.sourceCell      = this;
         desc.destinationCell = this;
         SendNotification(desc);                                                         // Notify application about item destruction
         if (myDadItem != null)
         {
             Destroy(myDadItem.gameObject);
         }
     }
     myDadItem = null;
     UpdateBackgroundState();
 }
 /// <summary>
 /// Put item into this cell.
 /// </summary>
 /// <param name="item">Item.</param>
 private void PlaceItem(DragAndDropItem item)
 {
     if (item != null)
     {
         DestroyItem();                                                                  // Remove current item from this cell
         myDadItem = null;
         DragAndDropCell cell = item.GetComponentInParent <DragAndDropCell>();
         if (cell != null)
         {
             if (cell.unlimitedSource == true)
             {
                 string itemName = item.name;
                 item      = Instantiate(item);                                                  // Clone item from source cell
                 item.name = itemName;
             }
         }
         item.transform.SetParent(transform, false);
         item.transform.localPosition = Vector3.zero;
         item.MakeRaycast(true);
         myDadItem = item;
     }
     UpdateBackgroundState();
 }
 /// <summary>
 /// Updates my item
 /// </summary>
 public void UpdateMyItem()
 {
     myDadItem = GetComponentInChildren <DragAndDropItem>();
 }
        /// <summary>
        /// Item is dropped in this cell
        /// </summary>
        /// <param name="data"></param>
        public void OnDrop(PointerEventData data)
        {
            if (DragAndDropItem.icon == null)
            {
                return;
            }
            DragAndDropItem item       = DragAndDropItem.draggedItem;
            DragAndDropCell sourceCell = DragAndDropItem.sourceCell;

            if (DragAndDropItem.icon.activeSelf == true)                                // If icon inactive do not need to drop item into cell
            {
                if ((item != null) && (sourceCell != this))
                {
                    if (!section.Equals(item.section))
                    {
                        return;
                    }

                    if ((!slot.Equals(item.slot)) && (!slot.Equals(DragAndDrop.Slot.Everything)))
                    {
                        return;
                    }

                    DropEventDescriptor desc = new DropEventDescriptor();
                    switch (cellType)                                                           // Check this cell's type
                    {
                    case CellType.Swap:                                                         // Item in destination cell can be swapped
                        UpdateMyItem();
                        switch (sourceCell.cellType)
                        {
                        case CellType.Swap:                                                                 // Item in source cell can be swapped
                            // Fill event descriptor
                            desc.item            = item;
                            desc.sourceCell      = sourceCell;
                            desc.destinationCell = this;
                            SendRequest(desc);                                                                  // Send drop request
                            StartCoroutine(NotifyOnDragEnd(desc));                                              // Send notification after drop will be finished
                            if (desc.permission == true)                                                        // If drop permitted by application
                            {
                                if (myDadItem != null)                                                          // If destination cell has item
                                {
                                    // Fill event descriptor
                                    DropEventDescriptor descAutoswap = new DropEventDescriptor();
                                    descAutoswap.item            = myDadItem;
                                    descAutoswap.sourceCell      = this;
                                    descAutoswap.destinationCell = sourceCell;
                                    SendRequest(descAutoswap);                                                                          // Send drop request
                                    StartCoroutine(NotifyOnDragEnd(descAutoswap));                                                      // Send notification after drop will be finished
                                    if (descAutoswap.permission == true)                                                                // If drop permitted by application
                                    {
                                        SwapItems(sourceCell, this);                                                                    // Swap items between cells
                                    }
                                    else
                                    {
                                        PlaceItem(item);                                                                    // Delete old item and place dropped item into this cell
                                    }
                                }
                                else
                                {
                                    PlaceItem(item);                                                                    // Place dropped item into this empty cell
                                }
                            }
                            break;

                        default:                                                                            // Item in source cell can not be swapped
                            // Fill event descriptor
                            desc.item            = item;
                            desc.sourceCell      = sourceCell;
                            desc.destinationCell = this;
                            SendRequest(desc);                                                                  // Send drop request
                            StartCoroutine(NotifyOnDragEnd(desc));                                              // Send notification after drop will be finished
                            if (desc.permission == true)                                                        // If drop permitted by application
                            {
                                PlaceItem(item);                                                                // Place dropped item into this cell
                            }
                            break;
                        }
                        break;

                    case CellType.DropOnly:                                                         // Item only can be dropped into destination cell
                        // Fill event descriptor
                        desc.item            = item;
                        desc.sourceCell      = sourceCell;
                        desc.destinationCell = this;
                        SendRequest(desc);                                                              // Send drop request
                        StartCoroutine(NotifyOnDragEnd(desc));                                          // Send notification after drop will be finished
                        if (desc.permission == true)                                                    // If drop permitted by application
                        {
                            PlaceItem(item);                                                            // Place dropped item in this cell
                        }
                        break;

                    default:
                        break;
                    }
                }
            }
            if (item != null)
            {
                if (item.GetComponentInParent <DragAndDropCell>() == null)                  // If item have no cell after drop
                {
                    Destroy(item.gameObject);                                               // Destroy it
                }
            }
            UpdateMyItem();
            UpdateBackgroundState();
            sourceCell.UpdateMyItem();
            sourceCell.UpdateBackgroundState();
        }