#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.Windows.Forms;
using Maestro.MapViewer;
using OSGeo.MapGuide.MaestroAPI.Services;
using Maestro.Editors.Generic;
using OSGeo.MapGuide.MaestroAPI;
using OSGeo.MapGuide.MaestroAPI.Mapping;
using OSGeo.MapGuide.MaestroAPI.Resource;
using OSGeo.MapGuide.ObjectModels.LayerDefinition;
using Maestro.MapViewer.Model;
using System.Diagnostics;
using Maestro.Editors.MapDefinition.Live;
namespace Maestro.Editors.MapDefinition
{
///
/// A Live Map Editor component that displays the legend of the currently edited map
///
public partial class LiveMapEditorLegend : UserControl
{
///
/// Initializes a new instance
///
public LiveMapEditorLegend()
{
InitializeComponent();
legendCtrl.NodeSelected += new NodeEventHandler(OnInnerNodeSelected);
}
private void OnInnerNodeSelected(object sender, TreeNode e)
{
var h = this.NodeSelected;
if (h != null)
h(this, e);
}
///
/// Raised when a node in the legend is deleted
///
public event NodeEventHandler NodeDeleted;
///
/// Raised when a node in the legend is selected
///
public event NodeEventHandler NodeSelected;
///
/// Gets or sets the associated map viewer
///
public IMapViewer Viewer
{
get { return legendCtrl.Viewer; }
set { legendCtrl.Viewer = value; }
}
private void btnAddGroup_Click(object sender, EventArgs e)
{
var map = this.Viewer.GetMap();
if (map != null)
{
var diag = new Live.NewGroupDialog(map);
if (diag.ShowDialog() == DialogResult.OK)
{
var mapSvc = (IMappingService)map.CurrentConnection.GetService((int)ServiceType.Mapping);
var group = mapSvc.CreateMapGroup(map, diag.GroupName);
group.LegendLabel = diag.GroupLabel;
group.Visible = true;
group.ShowInLegend = true;
map.Groups.Add(group);
legendCtrl.Viewer.RefreshMap();
}
}
}
internal static string GenerateUniqueName(string prefix, RuntimeMapLayerCollection layers)
{
int counter = 0;
string name = prefix;
while (layers[name] != null)
{
counter++;
name = prefix + counter;
}
return name;
}
private void btnAddLayer_Click(object sender, EventArgs e)
{
var map = this.Viewer.GetMap();
if (map != null)
{
using (var picker = new ResourcePicker(map.CurrentConnection.ResourceService, ResourceTypes.LayerDefinition, ResourcePickerMode.OpenResource))
{
if (picker.ShowDialog() == DialogResult.OK)
{
var mapSvc = (IMappingService)map.CurrentConnection.GetService((int)ServiceType.Mapping);
var layer = mapSvc.CreateMapLayer(map, ((ILayerDefinition)map.CurrentConnection.ResourceService.GetResource(picker.ResourceID)));
layer.Name = GenerateUniqueName(ResourceIdentifier.GetName(picker.ResourceID), map.Layers);
layer.LegendLabel = ResourceIdentifier.GetName(picker.ResourceID);
layer.Visible = true;
layer.ShowInLegend = true;
map.Layers.Insert(0, layer);
legendCtrl.Viewer.RefreshMap();
}
}
}
}
private void addLayerToolStripMenuItem_Click(object sender, EventArgs e)
{
var map = this.Viewer.GetMap();
if (map != null)
{
var node = legendCtrl.SelectedNode;
if (node != null)
{
var grp = node.Tag as GroupNodeMetadata;
if (grp != null)
{
using (var picker = new ResourcePicker(map.CurrentConnection.ResourceService, ResourceTypes.LayerDefinition, ResourcePickerMode.OpenResource))
{
if (picker.ShowDialog() == DialogResult.OK)
{
var mapSvc = (IMappingService)map.CurrentConnection.GetService((int)ServiceType.Mapping);
var layer = mapSvc.CreateMapLayer(map, ((ILayerDefinition)map.CurrentConnection.ResourceService.GetResource(picker.ResourceID)));
layer.Name = GenerateUniqueName(ResourceIdentifier.GetName(picker.ResourceID), map.Layers);
layer.LegendLabel = ResourceIdentifier.GetName(picker.ResourceID);
layer.Group = grp.Name;
layer.Visible = true;
layer.ShowInLegend = true;
map.Layers.Insert(0, layer);
legendCtrl.Viewer.RefreshMap();
}
}
}
}
}
}
private void removeThisGroupToolStripMenuItem_Click(object sender, EventArgs e)
{
var map = this.Viewer.GetMap();
if (map != null)
{
var node = legendCtrl.SelectedNode;
if (node != null)
{
var grp = node.Tag as GroupNodeMetadata;
if (grp != null)
{
var group = map.Groups[grp.Name];
if (group != null)
{
map.Groups.Remove(group);
legendCtrl.Viewer.RefreshMap();
}
}
}
}
}
private void removeThisLayerToolStripMenuItem_Click(object sender, EventArgs e)
{
var map = this.Viewer.GetMap();
if (map != null)
{
var node = legendCtrl.SelectedNode;
if (node != null)
{
var lyr = node.Tag as LayerNodeMetadata;
if (lyr != null)
{
var layer = map.Layers[lyr.Name];
if (layer != null)
{
map.Layers.Remove(layer);
legendCtrl.Viewer.RefreshMap();
}
}
}
}
}
private void AddLayerDefinition(ResourceDragMessage message, GroupNodeMetadata groupMeta)
{
if (ResourceIdentifier.GetResourceType(message.ResourceID) == ResourceTypes.LayerDefinition)
{
var map = this.Viewer.GetMap();
var conn = map.CurrentConnection;
var mapSvc = (IMappingService)conn.GetService((int)ServiceType.Mapping);
var ldf = (ILayerDefinition)conn.ResourceService.GetResource(message.ResourceID);
var rtLayer = mapSvc.CreateMapLayer(map, ldf);
//Set some desired properties if not already set
if (string.IsNullOrEmpty(rtLayer.LegendLabel))
rtLayer.LegendLabel = rtLayer.Name;
rtLayer.ShowInLegend = true;
rtLayer.ExpandInLegend = true;
rtLayer.Selectable = true;
if (groupMeta != null)
rtLayer.Group = groupMeta.Name;
map.Layers.Insert(0, rtLayer);
this.Viewer.RefreshMap();
}
}
///
/// Raised when a drag occurs
///
public event ItemDragEventHandler ItemDrag
{
add { legendCtrl.ItemDrag += value; }
remove { legendCtrl.ItemDrag -= value; }
}
internal void HandleDragDrop(DragEventArgs e)
{
var layer = e.Data.GetData(typeof(LayerDragMessage)) as LayerDragMessage;
var group = e.Data.GetData(typeof(GroupDragMessage)) as GroupDragMessage;
var res = e.Data.GetData(typeof(ResourceDragMessage)) as ResourceDragMessage;
var pt = legendCtrl.PointToClient(new Point(e.X, e.Y));
var node = legendCtrl.GetNodeAt(pt.X, pt.Y);
if (node != null)
{
var groupMeta = node.Tag as GroupNodeMetadata;
if (groupMeta != null)
{
if (layer != null)
{
if (groupMeta.Name != layer.GroupName)
{
var map = this.Viewer.GetMap();
var layerObj = map.Layers[layer.LayerName];
layerObj.Group = groupMeta.Name;
map.Save();
this.legendCtrl.RefreshLegend(); //No viewer refresh. Group structure changes do not affect draw order
}
}
else if (group != null)
{
if (groupMeta.Name != group.GroupName)
{
var map = this.Viewer.GetMap();
var groupObj = map.Groups[group.GroupName];
groupObj.Group = groupMeta.Name;
map.Save();
this.legendCtrl.RefreshLegend(); //No viewer refresh. Group structure changes do not affect draw order
}
}
else if (res != null)
{
if (groupMeta != null)
{
AddLayerDefinition(res, groupMeta);
}
}
}
}
else
{
if (layer != null)
{
var map = this.Viewer.GetMap();
var layerObj = map.Layers[layer.LayerName];
layerObj.Group = string.Empty;
map.Save();
this.legendCtrl.RefreshLegend(); //No viewer refresh. Group structure changes do not affect draw order
}
else if (group != null)
{
var map = this.Viewer.GetMap();
var groupObj = map.Groups[group.GroupName];
groupObj.Group = string.Empty;
map.Save();
this.legendCtrl.RefreshLegend(); //No viewer refresh. Group structure changes do not affect draw order
}
else if (res != null)
{
AddLayerDefinition(res, null);
}
}
}
internal void HandleDragOver(DragEventArgs e)
{
var layer = e.Data.GetData(typeof(LayerDragMessage)) as LayerDragMessage;
var group = e.Data.GetData(typeof(GroupDragMessage)) as GroupDragMessage;
var res = e.Data.GetData(typeof(ResourceDragMessage)) as ResourceDragMessage;
var pt = legendCtrl.PointToClient(new Point(e.X, e.Y));
var node = legendCtrl.GetNodeAt(pt.X, pt.Y);
if (node != null)
{
var groupMeta = node.Tag as GroupNodeMetadata;
if (groupMeta != null)
{
if (layer != null)
{
if (groupMeta.Name != layer.GroupName)
e.Effect = DragDropEffects.Copy;
else
e.Effect = DragDropEffects.None;
}
else if (group != null)
{
if (groupMeta.Name != group.GroupName)
e.Effect = DragDropEffects.Copy;
else
e.Effect = DragDropEffects.None;
}
else if (res != null)
{
if (groupMeta != null)
e.Effect = DragDropEffects.Copy;
else
e.Effect = DragDropEffects.None;
}
else
{
e.Effect = DragDropEffects.None;
}
}
else
{
e.Effect = DragDropEffects.None;
}
}
else
{
if (layer != null || group != null || res != null)
e.Effect = DragDropEffects.Copy;
else
e.Effect = DragDropEffects.None;
}
}
internal void HandleDragEnter(DragEventArgs e)
{
Trace.TraceInformation("HandleDragEnter(e)");
}
internal void HandleItemDrag(ItemDragEventArgs e)
{
var node = e.Item as TreeNode;
if (node != null)
{
var layerMeta = node.Tag as LayerNodeMetadata;
var groupMeta = node.Tag as GroupNodeMetadata;
if (layerMeta != null)
{
this.DoDragDrop(new LayerDragMessage(layerMeta.ParentGroupName, layerMeta.Name), DragDropEffects.Copy);
}
else if (groupMeta != null)
{
this.DoDragDrop(new GroupDragMessage(groupMeta.Name), DragDropEffects.Copy);
}
}
}
}
}