/// <summary>
        /// Handles the <see cref="DialogTerrain"/> form, checks all the directories and builds the <see cref="Terrain"/> object.
        /// </summary>
        public void NewTerrain()
        {
            using (var dialog = new DialogTerrain())
            {
                var result = dialog.ShowDialog();
                if (result != DialogResult.OK) return;

                var name = dialog.TerrainName;
                var type = dialog.TerrainType;
                var tileset = dialog.TilesetID;
                var x = dialog.SelectionX;
                var y = dialog.SelectionY;
                var width = dialog.SelectionWidth;
                var height = dialog.SelectionHeight;

                if (CheckTerrain(name))
                {
                    MessageBox.Show(@"Terrain with this name already exists.", @"New Terrain");
                    return;
                }

                var index = 1;
                while (true)
                {
                    var exit = true;
                    foreach (var tmp in Terrain)
                    {
                        if (tmp.ID == index)
                            exit = false;
                    }

                    if (exit)
                        break;

                    index++;
                }

                var terrain = new TerrainTile(index, name, type, tileset, x, y, width, height);

                Terrain.Add(terrain);

                SaveTerrain(index);

                if (TerrainAdded != null)
                    TerrainAdded.Invoke(this, new TerrainAddedEventArgs(terrain));
            }
        }
        /// <summary>
        /// Handles the <see cref="DialogTerrain"/> form and updates the <see cref="Terrain"/> object with the new data.
        /// </summary>
        public void EditTerrain(int id)
        {
            var terrain = GetTerrain(id);

            if (terrain == null) return;

            using (var dialog = new DialogTerrain(terrain.Name, terrain.Type, terrain.Tileset, terrain.X, terrain.Y, terrain.Width, terrain.Height))
            {
                var result = dialog.ShowDialog();
                if (result != DialogResult.OK) return;

                var name = dialog.TerrainName;
                var type = dialog.TerrainType;
                var tileset = dialog.TilesetID;
                var x = dialog.SelectionX;
                var y = dialog.SelectionY;
                var width = dialog.SelectionWidth;
                var height = dialog.SelectionHeight;

                if (terrain.Name.ToLower() != name.ToLower())
                {
                    if (CheckTerrain(name))
                    {
                        MessageBox.Show(@"A terrain tile with this name already exists.", @"Edit Terrain");
                        return;
                    }
                }

                UpdateTerrain(id, name, type, tileset, x, y, width, height);
            }
        }