private void CurrentLayerChanged(object sender, PropertyChangedEventArgs e)
        {
            this.CurrentLayer.Value = GetNewValue(sender, e) as ILayer;

            ILayerListNodeViewModel layerEntry = this.LayerNodes.FirstOrDefault(entry => entry.Layer == this.CurrentLayer.Value);

            ChangeCurrentLayer(layerEntry);
        }
        private void HandleDropCommand(DragEventArgs args)
        {
            IDataObject data = args.Data;

            if (data.GetDataPresent(SerializableNameUtils.GetName(DragDataType.LayerListNode)))
            {
                ILayer draggedLayer = data.GetData(SerializableNameUtils.GetName(DragDataType.LayerListNode)) as ILayer;
                this.Session.CurrentMap.Value.AddLayer(draggedLayer);
            }
            args.Handled = true;

            ILayerListNodeViewModel lastLayertNode = this.LayerNodes.Last <ILayerListNodeViewModel>();

            lastLayertNode.IsDragBelow.Value = false;
        }
        private void LayersChanged(object sender, NotifyCollectionChangedEventArgs args)
        {
            switch (args.Action)
            {
            case NotifyCollectionChangedAction.Add:
                foreach (ILayer layer in args.NewItems)
                {
                    ILayerListNodeViewModel entry = LayerListMethods.Generate(this.eventAggregator, this.session, this.actionHandler, layer);
                    int insertIndex = args.NewStartingIndex;
                    if (insertIndex < this.LayerNodes.Count)
                    {
                        this.LayerNodes.Insert(insertIndex++, entry);
                    }
                    else
                    {
                        this.LayerNodes.Add(entry);
                    }
                }
                break;

            case NotifyCollectionChangedAction.Remove:
                foreach (ILayer layer in args.OldItems)
                {
                    IEnumerable <ILayerListNodeViewModel> toRemove = new ObservableCollection <ILayerListNodeViewModel>(this.LayerNodes.Where(entry => entry.Layer == layer));
                    foreach (ILayerListNodeViewModel entry in toRemove)
                    {
                        this.LayerNodes.Remove(entry);
                    }
                }
                break;

            case NotifyCollectionChangedAction.Move:
                int oldIndex = args.OldStartingIndex;
                int newIndex = args.NewStartingIndex;
                if (oldIndex != -1 && newIndex != -1)
                {
                    ILayerListNodeViewModel entry = this.LayerNodes[oldIndex];
                    this.LayerNodes[oldIndex] = this.LayerNodes[newIndex];
                    this.LayerNodes[newIndex] = entry;
                }
                break;

            default:
                break;
            }
        }
        private void UpdateLayers(object sender, NotifyCollectionChangedEventArgs e)
        {
            switch (e.Action)
            {
            case NotifyCollectionChangedAction.Add:
                foreach (ILayer layer in e.NewItems)
                {
                    ILayerListNodeViewModel entry = LayerListMethods.Generate(this.eventAggregator, this.Session, this.actionHandler, layer);
                    int insertIndex = e.NewStartingIndex;
                    if (insertIndex < this.LayerNodes.Count)
                    {
                        this.LayerNodes.Insert(insertIndex++, entry);
                    }
                    else
                    {
                        this.LayerNodes.Add(entry);
                    }
                }
                break;

            case NotifyCollectionChangedAction.Remove:
                foreach (ILayer layer in e.OldItems)
                {
                    ILayerListNodeViewModel toRemove = this.LayerNodes.FirstOrDefault(entry => entry.Layer == layer);
                    this.LayerNodes.Remove(toRemove);
                }
                break;

            case NotifyCollectionChangedAction.Move:
                int oldIndex = e.OldStartingIndex;
                int newIndex = e.NewStartingIndex;
                if (oldIndex != -1 && newIndex != -1)
                {
                    ILayerListNodeViewModel entry = this.LayerNodes[oldIndex];
                    this.LayerNodes[oldIndex] = this.LayerNodes[newIndex];
                    this.LayerNodes[newIndex] = entry;
                }
                break;

            default:
                break;
            }
        }
        public void ChangeCurrentLayer(ILayerListNodeViewModel layerEntry)
        {
            if (layerEntry == null)
            {
                return;
            }
            if (layerEntry == this.selectedNode)
            {
                return;
            }
            if (this.selectedNode != null)
            {
                this.selectedNode.IsSelected.Value = false;
            }
            this.selectedNode = layerEntry;
            this.selectedNode.IsSelected.Value = true;

            this.Session.CurrentLayer.Value = this.selectedNode.Layer;
        }
        private void LoadLayers(ObservableCollection <ILayer> layers)
        {
            this.LayerNodes.Clear();
            if (layers == null)
            {
                return;
            }

            foreach (ILayer layer in layers)
            {
                ILayerListNodeViewModel node = LayerListMethods.Generate(this.eventAggregator, this.Session, this.actionHandler, layer);
                this.LayerNodes.Add(node);

                if (this.Session.CurrentLayer.Value == layer)
                {
                    node.IsSelected.Value = true;
                    this.selectedNode     = node;
                }
            }
        }
        public static ILayerListNodeViewModel Generate(IEventAggregator eventAggregator, IAmeSession session, IActionHandler handler, ILayer layer)
        {
            ILayerListNodeViewModel entry = null;

            if (typeof(Layer).IsInstanceOfType(layer))
            {
                entry = new LayerListNodeViewModel(eventAggregator, session, handler, layer as Layer);
            }
            else if (typeof(LayerGroup).IsInstanceOfType(layer))
            {
                LayerGroup layerGroup = layer as LayerGroup;
                LayerListGroupViewModel groupEntry = new LayerListGroupViewModel(eventAggregator, session, handler, layerGroup);
                foreach (ILayer childLayer in layerGroup.Layers)
                {
                    ILayerListNodeViewModel childEntry = Generate(eventAggregator, session, handler, childLayer);
                    groupEntry.LayerNodes.Add(childEntry);
                }
                entry = groupEntry;
            }
            return(entry);
        }
        private void HandleDragLeaveCommand(DragEventArgs args)
        {
            ILayerListNodeViewModel lastLayertNode = this.LayerNodes.Last <ILayerListNodeViewModel>();

            lastLayertNode.IsDragBelow.Value = false;
        }