#region Disclaimer / License // Copyright (C) 2012, Jackie Ng // http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie@gmail.com // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA // #endregion using System; using System.ComponentModel; using System.Drawing; using System.Linq; using System.Windows.Forms; using Maestro.MapViewer; using OSGeo.MapGuide.MaestroAPI.Mapping; using Maestro.Editors.MapDefinition.Live; using OSGeo.MapGuide.MaestroAPI.Resource; using OSGeo.MapGuide.MaestroAPI; using OSGeo.MapGuide.MaestroAPI.Services; using OSGeo.MapGuide.ObjectModels.LayerDefinition; namespace Maestro.Editors.MapDefinition { /// /// A Live Map Editor component that displays the layers of the currently edited map by draw order /// public partial class LiveMapEditorDrawOrder : UserControl { /// /// Initializes a new instance /// public LiveMapEditorDrawOrder() { InitializeComponent(); //HACK: http://social.msdn.microsoft.com/Forums/zh/winformsdatacontrols/thread/2db8e07a-6aa8-4865-9b59-c02025eaf317 lstDrawOrder.CreateControl(); } private RuntimeMap _map; private IMapViewer _viewer; /// /// Gets or sets the viewer instance /// public IMapViewer Viewer { get { return _viewer; } set { if (_viewer != value) { if (_viewer != null) _viewer.MapLoaded -= OnMapLoaded; UnbindMap(); _viewer = value; if (_viewer != null) { _map = _viewer.GetMap(); BindMap(); _viewer.MapLoaded += OnMapLoaded; } } } } void OnMapLoaded(object sender, EventArgs e) { _map = _viewer.GetMap(); BindMap(); } private void OnMapLayersChanged(object sender, EventArgs e) { RefreshLayerList(); } private void UnbindMap() { if (_map == null) return; _map.Layers.CollectionChanged -= OnMapLayersChanged; } private void BindMap() { if (_map == null) return; RefreshLayerList(); _map.Layers.CollectionChanged += OnMapLayersChanged; } private void RefreshLayerList() { try { bSuppressSelectedIndexChanged = true; var item = lstDrawOrder.SelectedItem as RuntimeMapLayer; lstDrawOrder.DataSource = _map.Layers.OrderBy(x => x.DisplayOrder).ToArray(); if (item != null) { var idx = lstDrawOrder.FindStringExact(item.LegendLabel); if (idx >= 0) lstDrawOrder.SelectedIndex = idx; } } finally { bSuppressSelectedIndexChanged = false; } } private bool bSuppressSelectedIndexChanged = false; private void lstDrawOrder_SelectedIndexChanged(object sender, EventArgs e) { if (bSuppressSelectedIndexChanged) return; btnUp.Enabled = btnDown.Enabled = btnDelete.Enabled = false; var layer = lstDrawOrder.SelectedItem as RuntimeMapLayer; if (layer != null) { btnUp.Enabled = btnDown.Enabled = btnDelete.Enabled = true; OnLayerSelected(layer); } } private void OnLayerSelected(RuntimeMapLayer layer) { var h = this.LayerSelected; if (h != null) h(this, layer); } /// /// Raised when a layer has been selected /// public event LayerEventHandler LayerSelected; /// /// Raised when a layer has been removed from this view /// public event LayerEventHandler LayerDeleted; private void btnUp_Click(object sender, EventArgs e) { if (_map == null) return; var layer = lstDrawOrder.SelectedItem as RuntimeMapLayer; if (layer != null) { int idx = _map.Layers.IndexOf(layer); if (idx > 0) idx--; else return; _map.Layers.SetNewIndex(idx, layer); if (lstDrawOrder.SelectedIndex != idx) lstDrawOrder.SelectedIndex = idx; else OnLayerSelected(layer); this.Viewer.RefreshMap(); } } private void btnDown_Click(object sender, EventArgs e) { if (_map == null) return; var layer = lstDrawOrder.SelectedItem as RuntimeMapLayer; if (layer != null) { int idx = _map.Layers.IndexOf(layer); if (idx < _map.Layers.Count - 1) idx++; else return; _map.Layers.SetNewIndex(idx, layer); if (lstDrawOrder.SelectedIndex != idx) lstDrawOrder.SelectedIndex = idx; else OnLayerSelected(layer); this.Viewer.RefreshMap(); } } private void btnDelete_Click(object sender, EventArgs e) { var layer = lstDrawOrder.SelectedItem as RuntimeMapLayer; if (layer != null) { _map.Layers.Remove(layer); this.Viewer.RefreshMap(); } } private void lstDrawOrder_DragOver(object sender, DragEventArgs e) { var res = e.Data.GetData(typeof(ResourceDragMessage)) as ResourceDragMessage; var layer = e.Data.GetData(typeof(RuntimeMapLayer)) as RuntimeMapLayer; if (layer != null) e.Effect = DragDropEffects.Move; else if (res != null && ResourceIdentifier.GetResourceType(res.ResourceID) == ResourceTypes.LayerDefinition) e.Effect = DragDropEffects.Copy; } private void lstDrawOrder_DragEnter(object sender, DragEventArgs e) { } private void lstDrawOrder_DragDrop(object sender, DragEventArgs e) { var pt = lstDrawOrder.PointToClient(new Point(e.X, e.Y)); var index = lstDrawOrder.IndexFromPoint(pt); if (index < 0) index = lstDrawOrder.Items.Count - 1; var res = e.Data.GetData(typeof(ResourceDragMessage)) as ResourceDragMessage; var layer = e.Data.GetData(typeof(RuntimeMapLayer)) as RuntimeMapLayer; if (layer != null) { _map.Layers.SetNewIndex(index, layer); if (lstDrawOrder.SelectedIndex != index) lstDrawOrder.SelectedIndex = index; else OnLayerSelected(layer); this.Viewer.RefreshMap(); } else if (res != null && ResourceIdentifier.GetResourceType(res.ResourceID) == ResourceTypes.LayerDefinition) { var conn = _map.CurrentConnection; var mapSvc = (IMappingService)conn.GetService((int)ServiceType.Mapping); layer = mapSvc.CreateMapLayer(_map, (ILayerDefinition)conn.ResourceService.GetResource(res.ResourceID)); _map.Layers.Insert(0, layer); if (lstDrawOrder.SelectedIndex != 0) lstDrawOrder.SelectedIndex = 0; else OnLayerSelected(layer); this.Viewer.RefreshMap(); } } private void lstDrawOrder_MouseDown(object sender, MouseEventArgs e) { var item = lstDrawOrder.SelectedItem as RuntimeMapLayer; if (item != null) lstDrawOrder.DoDragDrop(item, DragDropEffects.Move); } } /// /// Represents a method that handles events relating to layer manipulation /// /// /// public delegate void LayerEventHandler(object sender, RuntimeMapLayer layer); }