private T[] ShowDropButton <T>(bool isEnabled, IsValidAssetDelegate IsValidAsset) where T : UnityEngine.Object
        {
            T[] returnValue = null;

            Rect drop_area = GUILayoutUtility.GetRect(0.0f, 80.0f, GUILayout.ExpandWidth(true));

            GUI.enabled = isEnabled;
            GUI.Box(drop_area, "Drop Animation files here", _dropBoxStyle);
            GUI.enabled = true;

            if (!isEnabled)
            {
                return(null);
            }

            Event evt = Event.current;

            switch (evt.type)
            {
            case EventType.DragUpdated:
            case EventType.DragPerform:

                if (!drop_area.Contains(evt.mousePosition) ||
                    !DraggedObjectsContainValidObject <T>(IsValidAsset))
                {
                    return(null);
                }

                DragAndDrop.visualMode = DragAndDropVisualMode.Copy;

                if (evt.type == EventType.DragPerform)
                {
                    DragAndDrop.AcceptDrag();

                    List <T> validObjects = new List <T>();

                    foreach (UnityEngine.Object dragged_object in DragAndDrop.objectReferences)
                    {
                        var assetPath = AssetDatabase.GetAssetPath(dragged_object);

                        if (dragged_object is T && IsValidAsset(assetPath))
                        {
                            validObjects.Add(dragged_object as T);
                        }
                    }

                    returnValue = validObjects.ToArray();
                }

                evt.Use();

                break;
            }

            return(returnValue);
        }
        private bool DraggedObjectsContainValidObject <T>(IsValidAssetDelegate IsValidAsset) where T : UnityEngine.Object
        {
            foreach (UnityEngine.Object dragged_object in DragAndDrop.objectReferences)
            {
                var assetPath = AssetDatabase.GetAssetPath(dragged_object);

                if (dragged_object is T && IsValidAsset(assetPath))
                {
                    return(true);
                }
            }

            return(false);
        }