private void OnMouseDown(Event inputEvent)
            {
                if (inputEvent.button == 0)
                {
                    inputEvent.Use();
                    _needsRepaint = true;

                    OnLeftMouseDown(inputEvent);
                }
                else if (inputEvent.button == 1)
                {
                    inputEvent.Use();
                    OnRightMouseDown(inputEvent);
                }
                else if (inputEvent.button == 2)
                {
                    inputEvent.Use();
                    _needsRepaint = true;

                    OnMiddleMouseDown(inputEvent);
                }
                else
                {
                    _dragMode = eDragType.NotDragging;
                }
            }
            protected virtual void OnLeftMouseDown(Event inputEvent)
            {
                JSONObjectEditorGUI <T> clickedOnObject = null;

                Vector2 gridPosition = GetEditorPosition(inputEvent.mousePosition);

                for (int i = 0; i < _editableObjects.Count; i++)
                {
                    JSONObjectEditorGUI <T> evnt = (JSONObjectEditorGUI <T>)_editableObjects[i];
                    if (evnt.GetBounds().Contains(gridPosition))
                    {
                        clickedOnObject = evnt;
                        break;
                    }
                }

                if (inputEvent.shift || inputEvent.control)
                {
                    if (clickedOnObject != null)
                    {
                        if (_selectedObjects.Contains(clickedOnObject))
                        {
                            _selectedObjects.Remove(clickedOnObject);
                            clickedOnObject = null;
                        }
                        else
                        {
                            _selectedObjects.Add(clickedOnObject);
                        }
                    }
                }
                else if (clickedOnObject == null)
                {
                    _selectedObjects.Clear();
                }
                else if (!_selectedObjects.Contains(clickedOnObject))
                {
                    _selectedObjects = new List <ScriptableObject>()
                    {
                        clickedOnObject
                    };
                }

                //Dragging
                {
                    GetEditorWindow().OnSelectObject(clickedOnObject);

                    _draggedObject = clickedOnObject;
                    _dragMode      = eDragType.LeftClick;
                    _dragPos       = inputEvent.mousePosition;
                    _dragAreaRect  = new Rect(-1.0f, -1.0f, 0.0f, 0.0f);

                    //Save state before dragging
                    foreach (JSONObjectEditorGUI <T> evnt in _selectedObjects)
                    {
                        evnt.SaveUndoState();
                    }
                }
            }
            protected virtual void OnStopDragging(Event inputEvent)
            {
                if (_dragMode != eDragType.NotDragging)
                {
                    if (_dragMode == eDragType.LeftClick)
                    {
                        Undo.RegisterCompleteObjectUndo(_selectedObjects.ToArray(), "Move Objects(s)");

                        foreach (JSONObjectEditorGUI <T> evnt in _selectedObjects)
                        {
                            evnt.SaveUndoState();
                        }
                    }

                    SortObjects();
                    inputEvent.Use();
                    _dragMode     = eDragType.NotDragging;
                    _needsRepaint = true;
                }
            }
 protected virtual void OnMiddleMouseDown(Event inputEvent)
 {
     _dragMode     = eDragType.MiddleMouseClick;
     _dragPos      = inputEvent.mousePosition;
     _dragAreaRect = new Rect(-1.0f, -1.0f, 0.0f, 0.0f);
 }