/// <summary>
    /// Every input key should go through this method first.
    /// Input depend on Editmode enum Tiles/Entities
    /// </summary>
    private void HandleMouseEvents()
    {
        switch (editMode)
        {
        case EditMode.Tiles:
            // Do not process if no tile is selected
            if (m_setTileID <= 0)
            {
                return;
            }

            if (Input.GetKey(KeyCode.LeftControl) && Input.GetMouseButtonDown(0))
            {
                if (UpdateMouseHit())
                {
                    Vector2Int p1 = new Vector2Int(Mathf.FloorToInt(m_mouseHitPos.x), Mathf.FloorToInt(m_mouseHitPos.y));

                    StartCoroutine(SelectWhileDragging(p1));
                }
            }

            else if (Input.GetKey(KeyCode.LeftShift) && Input.GetMouseButtonDown(0))
            {
                if (UpdateMouseHit())
                {
                    Vector2Int p1 = new Vector2Int(Mathf.FloorToInt(m_mouseHitPos.x), Mathf.FloorToInt(m_mouseHitPos.y));

                    Fill(p1.x, p1.y, m_setTileID);
                }
            }

            else if (Input.GetMouseButton(0))
            {
                if (UpdateMouseHit())
                {
                    int tileX = Mathf.FloorToInt(m_mouseHitPos.x);
                    int tileY = Mathf.FloorToInt(m_mouseHitPos.y);

                    m_tileMap[tileX, tileY] = m_setTileID;
                }
            }

            else if (Input.GetMouseButtonDown(1))
            {
                if (UpdateMouseHit())
                {
                    Vector2Int tileSelected = new Vector2Int(Mathf.FloorToInt(m_mouseHitPos.x), Mathf.FloorToInt(m_mouseHitPos.y));
                    if (lastMapTileSelected != tileSelected)
                    {
                        lastMapTileSelected = tileSelected;
                    }
                    else
                    {
                        lastMapTileSelected = null;
                    }
                }
            }
            break;

        case EditMode.Entities:
            if (Input.GetKeyDown(KeyCode.LeftShift) || Input.GetMouseButton(0))
            {
                if (UpdateMouseHit())
                {
                    Vector2Int pos = new Vector2Int(Mathf.FloorToInt(m_mouseHitPos.x), Mathf.FloorToInt(m_mouseHitPos.y));

                    if (m_setEntityID == (int)EntitiesData.EntityID.Tool_Eraser)
                    {
                        m_tileMap.RemoveEntity(pos);
                    }
                    else
                    {
                        m_tileMap.AddEntity(pos, (EntitiesData.EntityID)Mathf.Abs(m_setEntityID));

                        GameObject entity = Instantiate(m_tileMap.entities[m_setEntityID]);
                        entity.tag = "Entity";
                        entity.transform.position = pos.ToTileVector2();
                    }
                }
            }
            else if (Input.GetMouseButtonDown(1))
            {
                if (UpdateMouseHit())
                {
                    Vector2Int tileSelected = new Vector2Int(Mathf.FloorToInt(m_mouseHitPos.x), Mathf.FloorToInt(m_mouseHitPos.y));
                    if (lastMapTileSelected != tileSelected)
                    {
                        lastMapTileSelected = tileSelected;
                    }
                    else
                    {
                        lastMapTileSelected = null;
                    }
                }
            }
            break;
        }
    }