public WorldEditorTerrainToolsViewModel(IPackageRepository repository, SpriteLoader spriteLoader)
        {
            this._repository = repository;
            this._spriteLoader = spriteLoader;
            this._isGridVisible = false;

            this._tiles = new ObservableCollection<TileViewModel>();

            foreach (var asset in repository.Assets.Where(x => x.Type == EditorAssetTypes.TerrainTileDefinition).OrderBy(x => x.Key))
            {
                var tileData = _repository.GetAssetData<TerrainTileDefinitionResource>(asset.Id);
                _tiles.Add(new TileViewModel() { Key = tileData.Key, Sprite = _spriteLoader.LoadSprite(tileData.SpriteKey) });
            }

            this.SelectedTile = _tiles.FirstOrDefault();
            this.SelectedTool = TerrainEditorTools.Paint;

            SetToolCommand = new DelegateCommand<String>(x =>
                {
                    if (x == "Fill")
                        SelectedTool = TerrainEditorTools.Fill;
                    else if (x == "Paint")
                        SelectedTool = TerrainEditorTools.Paint;
                    else if (x == "EyeDropper")
                        SelectedTool = TerrainEditorTools.EyeDropper;
                });
        }
        public WorldEditorWorldViewModel(CompositionContainer container, IPackageRepository packageRepository)
        {
            this._objectTypes = new ObservableCollection<WorldObjectTypeViewModel>();
            this._packageRepository = packageRepository;
            this._worldObjects = new ObservableCollection<WorldObjectViewModel>();
            this._worldObjectModelToObjectTypeDefinitionMapping = new Dictionary<Type, WorldObjectDefinition>();

            this.SelectedObjectName = "No Object Selected";

            this._editSelectedObjectCommand = new DelegateCommand(EditSelectedObjectExecute, EditSelectedObjectCanExecute);
            this._deleteSelectedObjectCommand = new DelegateCommand(DeleteSelectedObjectExecute, DeleteSelectedObjectCanExecute);
            this._copyCommand = new DelegateCommand(CopyExecute, CopyCanExecute);
            this._pasteCommand = new DelegateCommand(PasteExecute, PasteCanExecute);

            var worldObjectTypeExports = container.GetExports<IWorldEditorTypeDefinition, IWorldEditorTypeMetaData>();

            foreach (var export in worldObjectTypeExports)
            {
                var definition = new WorldObjectTypeViewModel(this, export.Metadata, export.Value);
                _objectTypes.Add(definition);
                _worldObjectModelToObjectTypeDefinitionMapping[export.Value.WorldObjectType] = definition;
            }

            var archetypeBasedWorldObjectTypeExports = container.GetExports<IArchetypeBasedWorldEditorTypeDefinition, IArchetypeBasedWorldEditorTypeMetaData>();
            foreach (var export in archetypeBasedWorldObjectTypeExports)
            {
                var definition = new ExistingWorldObjectArchetypeViewModel(this, export.Metadata, export.Value);
                _worldObjectModelToObjectTypeDefinitionMapping[export.Value.WorldObjectType] = definition;
            }

            this._archetypes = new ObservableCollection<NewWorldObjectArchetypeViewModel>();
            foreach (var asset in _packageRepository.Assets.Where(x => x.Type == EditorAssetTypes.Archetype).OrderBy(x => x.Key))
            {
                var data = _packageRepository.GetAssetData<ArchetypeResource>(asset.Id);

                if (!(data.Data is WorldObjectArchetypeData))
                    continue;

                IArchetypeBasedWorldEditorTypeDefinition typeDefinition = null;
                IArchetypeBasedWorldEditorTypeMetaData metaData = null;

                foreach (var export in archetypeBasedWorldObjectTypeExports)
                {
                    if (export.Value.ArchetypeDataType == data.Data.GetType())
                    {
                        typeDefinition = export.Value;
                        metaData = export.Metadata;
                        break;
                    }
                }

                var definition = new NewWorldObjectArchetypeViewModel(
                    this, asset.Key.Split('.').Last(),
                    (WorldObjectArchetypeData)data.Data, 
                    asset.Key,
                    metaData,
                    typeDefinition);

                this._archetypes.Add(definition);
            }
        }