#region Disclaimer / License
// Copyright (C) 2010, 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.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using Maestro.Shared.UI;
using Aga.Controls.Tree;
using OSGeo.MapGuide.ObjectModels.MapDefinition;
using Maestro.Editors.Common;
using Maestro.Editors.Generic;
using OSGeo.MapGuide.MaestroAPI;
using OSGeo.MapGuide.MaestroAPI.Resource;
namespace Maestro.Editors.MapDefinition
{
///
///
///
public delegate void OpenLayerEventHandler(object sender, string layerResourceId);
[ToolboxItem(true)]
internal partial class MapLayersSectionCtrl : EditorBindableCollapsiblePanel
{
public MapLayersSectionCtrl()
{
InitializeComponent();
}
private IMapDefinition _map;
private DrawOrderLayerModel _doLayerModel;
private GroupedLayerModel _grpLayerModel;
private TiledLayerModel _tiledLayerModel;
private IEditorService _edSvc;
public override void Bind(IEditorService service)
{
_edSvc = service;
_edSvc.RegisterCustomNotifier(this);
_map = (IMapDefinition)service.GetEditedResource();
trvLayerDrawingOrder.Model = _doLayerModel = new DrawOrderLayerModel(_map);
trvLayersGroup.Model = _grpLayerModel = new GroupedLayerModel(_map);
trvBaseLayers.Model = _tiledLayerModel = new TiledLayerModel(_map);
}
private void RefreshModels()
{
_doLayerModel.Invalidate();
_grpLayerModel.Invalidate();
}
public event OpenLayerEventHandler RequestLayerOpen;
private void trvLayersGroup_MouseDoubleClick(object sender, MouseEventArgs e)
{
TreeNodeAdv node = trvLayersGroup.GetNodeAt(new Point(e.X, e.Y));
if (node != null)
{
var layer = node.Tag as LayerItem;
if (layer != null)
{
var handler = this.RequestLayerOpen;
if (handler != null)
handler(this, layer.Tag.ResourceId);
}
}
}
private void trvLayerDrawingOrder_MouseDoubleClick(object sender, MouseEventArgs e)
{
TreeNodeAdv node = trvLayerDrawingOrder.GetNodeAt(new Point(e.X, e.Y));
if (node != null)
{
var layer = node.Tag as LayerItem;
if (layer != null)
{
var handler = this.RequestLayerOpen;
if (handler != null)
handler(this, layer.Tag.ResourceId);
}
}
}
private void trvLayersGroup_MouseClick(object sender, MouseEventArgs e)
{
TreeNodeAdv node = trvLayersGroup.GetNodeAt(new Point(e.X, e.Y));
if (node != null)
{
var layer = node.Tag as LayerItem;
var group = node.Tag as GroupItem;
if (layer != null)
{
propertiesPanel.Controls.Clear();
var item = new LayerPropertiesCtrl(layer.Tag, _edSvc.ResourceService);
item.LayerChanged += (s, evt) => { OnResourceChanged(); };
item.Dock = DockStyle.Fill;
propertiesPanel.Controls.Add(item);
}
else if (group != null)
{
propertiesPanel.Controls.Clear();
var item = new GroupPropertiesCtrl(group.Tag);
item.GroupChanged += (s, evt) => { OnResourceChanged(); };
item.Dock = DockStyle.Fill;
propertiesPanel.Controls.Add(item);
}
}
}
private void trvLayerDrawingOrder_MouseClick(object sender, MouseEventArgs e)
{
TreeNodeAdv node = trvLayerDrawingOrder.GetNodeAt(new Point(e.X, e.Y));
if (node != null)
{
var layer = node.Tag as LayerItem;
if (layer != null)
{
propertiesPanel.Controls.Clear();
var item = new LayerPropertiesCtrl(layer.Tag, _edSvc.ResourceService);
item.LayerChanged += (s, evt) => { OnResourceChanged(); };
item.Dock = DockStyle.Fill;
propertiesPanel.Controls.Add(item);
}
}
}
private void btnAddGroup_Click(object sender, EventArgs e)
{
var selGroup = GetSelectedLayerGroupItem() as IMapLayerGroup;
CreateNewGroup(selGroup);
_grpLayerModel.Invalidate();
}
private void btnRemoveGroup_Click(object sender, EventArgs e)
{
var group = GetSelectedLayerGroupItem() as GroupItem;
_map.RemoveGroup(group.Tag);
_grpLayerModel.Invalidate();
}
private void btnGRPAddLayer_Click(object sender, EventArgs e)
{
using (var picker = new ResourcePicker(_edSvc.ResourceService, ResourceTypes.LayerDefinition, ResourcePickerMode.OpenResource))
{
if (picker.ShowDialog() == DialogResult.OK)
{
string layerId = picker.ResourceID;
var selGroup = GetSelectedLayerGroupItem() as GroupItem;
CreateLayer(layerId, selGroup == null ? null : selGroup.Tag);
this.RefreshModels();
}
}
}
private void btnGRPRemoveLayer_Click(object sender, EventArgs e)
{
var layer = GetSelectedLayerGroupItem() as LayerItem;
if (layer != null)
{
_map.RemoveLayer(layer.Tag);
this.RefreshModels();
}
}
private void btnConvertLayerGroupToBaseGroup_Click(object sender, EventArgs e)
{
var group = GetSelectedLayerGroupItem() as GroupItem;
if (group != null)
{
//...
throw new NotImplementedException();
}
}
private void btnDLAddLayer_Click(object sender, EventArgs e)
{
using (var picker = new ResourcePicker(_edSvc.ResourceService, ResourceTypes.LayerDefinition, ResourcePickerMode.OpenResource))
{
if (picker.ShowDialog() == DialogResult.OK)
{
string layerId = picker.ResourceID;
var selGroup = GetSelectedDrawOrderItem() as GroupItem;
CreateLayer(layerId, selGroup != null ? selGroup.Tag : null);
this.RefreshModels();
}
}
}
private void btnDLRemoveLayer_Click(object sender, EventArgs e)
{
var layer = GetSelectedDrawOrderItem() as LayerItem;
if (layer != null)
{
_map.RemoveLayer(layer.Tag);
this.RefreshModels();
}
}
private void btnDLMoveLayerUp_Click(object sender, EventArgs e)
{
var layer = GetSelectedDrawOrderItem() as LayerItem;
if (layer != null)
{
_map.MoveUp(layer.Tag);
_doLayerModel.Invalidate();
RestoreDrawOrderSelection(layer);
}
}
private void btnDLMoveLayerDown_Click(object sender, EventArgs e)
{
var layer = GetSelectedDrawOrderItem() as LayerItem;
if (layer != null)
{
_map.MoveDown(layer.Tag);
_doLayerModel.Invalidate();
RestoreDrawOrderSelection(layer);
}
}
private void btnDLMoveLayerTop_Click(object sender, EventArgs e)
{
var layer = GetSelectedDrawOrderItem() as LayerItem;
if (layer != null)
{
_map.SetTopDrawOrder(layer.Tag);
_doLayerModel.Invalidate();
RestoreDrawOrderSelection(layer);
}
}
private void btnDLMoveLayerBottom_Click(object sender, EventArgs e)
{
var layer = GetSelectedDrawOrderItem() as LayerItem;
if (layer != null)
{
_map.SetBottomDrawOrder(layer.Tag);
_doLayerModel.Invalidate();
RestoreDrawOrderSelection(layer);
}
}
private static void RestoreSelection(TreeViewAdv tree, Predicate predicate) where TaggedType : class
{
//Restore selection
TreeNodeAdv selectedNode = null;
foreach (var node in tree.AllNodes)
{
var tag = node.Tag as TaggedType;
if (tag != null && predicate(tag))
{
selectedNode = node;
break;
}
}
if (selectedNode != null)
tree.SelectedNode = selectedNode;
}
private void RestoreBaseLayerSelection(BaseLayerItem item)
{
//The node tag will probably be different, but the wrapped
//instance is what we're checking for
RestoreSelection(trvBaseLayers, (tag) => { return tag.Tag == item.Tag; });
}
private void RestoreDrawOrderSelection(LayerItem layer)
{
//The node tag will probably be different, but the wrapped
//instance is what we're checking for
RestoreSelection(trvLayerDrawingOrder, (tag) => { return tag.Tag == layer.Tag; });
}
private void CreateNewGroup(IMapLayerGroup parentGroup)
{
int counter = 0;
string prefix = Properties.Resources.NewLayerGroup;
var group = _map.GetGroupByName(prefix);
while (group != null)
{
counter++;
prefix = Properties.Resources.NewLayerGroup + counter;
group = _map.GetGroupByName(prefix);
}
group = _map.AddGroup(prefix);
if (parentGroup != null)
group.Group = parentGroup.Name;
}
private void CreateLayer(string layerId, IMapLayerGroup parentGroup)
{
int counter = 0;
string prefix = ResourceIdentifier.GetName(layerId);
string name = prefix;
var layer = _map.GetLayerByName(name);
while (layer != null)
{
counter++;
name = prefix + counter;
layer = _map.GetLayerByName(name);
}
if (parentGroup != null)
layer = _map.AddLayer(parentGroup.Name, name, layerId);
else
layer = _map.AddLayer(null, name, layerId);
}
private object GetSelectedDrawOrderItem()
{
if (trvLayerDrawingOrder.SelectedNode != null)
{
return trvLayerDrawingOrder.SelectedNode.Tag;
}
return null;
}
private object GetSelectedLayerGroupItem()
{
if (trvLayersGroup.SelectedNode != null)
{
return trvLayersGroup.SelectedNode.Tag;
}
return null;
}
private void btnNewBaseLayerGroup_Click(object sender, EventArgs e)
{
_map.InitBaseMap();
var grp = _map.BaseMap.AddBaseLayerGroup(GenerateBaseGroupName(_map));
_tiledLayerModel.Invalidate();
}
private object GetSelectedTiledLayerItem()
{
if (trvBaseLayers.SelectedNode != null)
return trvBaseLayers.SelectedNode.Tag;
else
return null;
}
private void btnRemoveBaseLayerGroup_Click(object sender, EventArgs e)
{
var group = GetSelectedTiledLayerItem() as BaseLayerGroupItem;
if (group != null)
{
_map.BaseMap.RemoveBaseLayerGroup(group.Tag);
_tiledLayerModel.Invalidate();
}
}
private void btnAddBaseLayer_Click(object sender, EventArgs e)
{
using (var picker = new ResourcePicker(_edSvc.ResourceService, ResourceTypes.LayerDefinition, ResourcePickerMode.OpenResource))
{
if (picker.ShowDialog() == DialogResult.OK)
{
_map.InitBaseMap();
string layerId = picker.ResourceID;
IBaseMapGroup grp = null;
var group = GetSelectedTiledLayerItem() as BaseLayerGroupItem;
if (group != null)
{
grp = group.Tag;
}
else
{
grp = _map.BaseMap.GetFirstGroup();
if (grp == null)
{
grp = _map.BaseMap.AddBaseLayerGroup(GenerateBaseGroupName(_map));
}
}
grp.AddLayer(GenerateBaseLayerName(layerId, _map.BaseMap), layerId);
_tiledLayerModel.Invalidate();
}
}
}
private static string GenerateBaseGroupName(IMapDefinition map)
{
map.InitBaseMap();
int counter = 0;
string name = Properties.Resources.BaseLayerGroup;
if (map.BaseMap.GroupExists(name))
{
counter++;
name = Properties.Resources.BaseLayerGroup + counter;
}
while (map.BaseMap.GroupExists(name))
{
counter++;
name = Properties.Resources.BaseLayerGroup + counter;
}
return name;
}
private static string GenerateLayerName(string layerId, IMapDefinition baseMapDef)
{
Check.NotNull(baseMapDef, "baseMapDef");
Check.NotEmpty(layerId, "layerId");
int counter = 0;
string prefix = ResourceIdentifier.GetName(layerId);
string name = prefix;
if (baseMapDef.GetLayerByName(name) != null)
{
name = prefix + counter;
}
while (baseMapDef.GetLayerByName(name) != null)
{
counter++;
name = prefix + counter;
}
return name;
}
private static string GenerateBaseLayerName(string layerId, IBaseMapDefinition baseMapDef)
{
Check.NotNull(baseMapDef, "baseMapDef");
Check.NotEmpty(layerId, "layerId");
int counter = 0;
string prefix = ResourceIdentifier.GetName(layerId);
string name = prefix;
if (baseMapDef.LayerExists(name))
{
name = prefix + counter;
}
while (baseMapDef.LayerExists(name))
{
counter++;
name = prefix + counter;
}
return name;
}
private void btnRemoveBaseLayer_Click(object sender, EventArgs e)
{
var layer = GetSelectedTiledLayerItem() as BaseLayerItem;
if (layer != null)
{
var grp = layer.Parent;
grp.RemoveBaseMapLayer(layer.Tag);
_tiledLayerModel.Invalidate();
}
}
private void btnMoveBaseLayerUp_Click(object sender, EventArgs e)
{
var layer = GetSelectedTiledLayerItem() as BaseLayerItem;
if (layer != null)
{
var grp = layer.Parent;
grp.MoveUp(layer.Tag);
var node = trvBaseLayers.SelectedNode.Parent;
var path = trvBaseLayers.GetPath(node);
_tiledLayerModel.Invalidate(path);
RestoreBaseLayerSelection(layer);
}
}
private void btnMoveBaseLayerDown_Click(object sender, EventArgs e)
{
var layer = GetSelectedTiledLayerItem() as BaseLayerItem;
if (layer != null)
{
var grp = layer.Parent;
grp.MoveDown(layer.Tag);
var node = trvBaseLayers.SelectedNode.Parent;
var path = trvBaseLayers.GetPath(node);
_tiledLayerModel.Invalidate(path);
RestoreBaseLayerSelection(layer);
}
}
private void trvBaseLayers_MouseClick(object sender, MouseEventArgs e)
{
TreeNodeAdv node = trvBaseLayers.GetNodeAt(new Point(e.X, e.Y));
if (node != null)
{
var layer = node.Tag as BaseLayerItem;
var group = node.Tag as BaseLayerGroupItem;
var scale = node.Tag as ScaleItem;
if (layer != null)
{
propertiesPanel.Controls.Clear();
var item = new LayerPropertiesCtrl(layer.Tag, _edSvc.ResourceService);
item.LayerChanged += (s, evt) => { OnResourceChanged(); };
item.Dock = DockStyle.Fill;
propertiesPanel.Controls.Add(item);
}
else if (group != null)
{
propertiesPanel.Controls.Clear();
var item = new GroupPropertiesCtrl(group.Tag);
item.GroupChanged += (s, evt) => { OnResourceChanged(); };
item.Dock = DockStyle.Fill;
propertiesPanel.Controls.Add(item);
}
else if (scale != null)
{
propertiesPanel.Controls.Clear();
var item = new FiniteScaleListCtrl(_map);
item.Dock = DockStyle.Fill;
propertiesPanel.Controls.Add(item);
}
}
}
private void trvBaseLayers_MouseDoubleClick(object sender, MouseEventArgs e)
{
TreeNodeAdv node = trvBaseLayers.GetNodeAt(new Point(e.X, e.Y));
if (node != null)
{
var layer = node.Tag as BaseLayerItem;
if (layer != null)
{
var handler = this.RequestLayerOpen;
if (handler != null)
handler(this, layer.Tag.ResourceId);
}
}
}
private void trvLayersGroup_ItemDrag(object sender, ItemDragEventArgs e)
{
trvLayersGroup.DoDragDrop(e.Item, DragDropEffects.All);
}
private void trvLayersGroup_DragEnter(object sender, DragEventArgs e)
{
HandleDragEnter(e);
}
private static void HandleDragEnter(DragEventArgs e)
{
//Accepting all resource id drops
var rids = e.Data.GetData(typeof(ResourceIdentifier[])) as ResourceIdentifier[];
if (rids == null || rids.Length == 0)
{
e.Effect = DragDropEffects.None;
return;
}
//But only of the Layer Definition kind
if (rids.Length == 1 && rids[0].ResourceType != ResourceTypes.LayerDefinition)
{
e.Effect = DragDropEffects.None;
return;
}
//Even in multiples
foreach (var r in rids)
{
if (r.ResourceType != ResourceTypes.LayerDefinition)
{
e.Effect = DragDropEffects.None;
return;
}
}
}
private void trvLayersGroup_DragDrop(object sender, DragEventArgs e)
{
var rids = e.Data.GetData(typeof(ResourceIdentifier[])) as ResourceIdentifier[];
if (rids == null || rids.Length == 0)
return;
IMapLayerGroup parent = null;
var node = trvLayersGroup.GetNodeAt(trvLayersGroup.PointToClient(new Point(e.X, e.Y)));
if (node != null)
{
var gi = node.Tag as GroupItem;
if (gi != null)
parent = gi.Tag;
}
int added = 0;
foreach (var rid in rids)
{
if (rid.ResourceType == ResourceTypes.LayerDefinition)
{
var name = GenerateLayerName(rid.ToString(), _map);
var layer = _map.AddLayer(parent == null ? null : parent.Name, name, rid.ToString());
added++;
}
}
if (added > 0)
{
//TODO: Fine-grain invalidation
RefreshModels();
}
}
private void trvLayersGroup_DragOver(object sender, DragEventArgs e)
{
HandleDragOver(e);
}
private static void HandleDragOver(DragEventArgs e)
{
var rids = e.Data.GetData(typeof(ResourceIdentifier[])) as ResourceIdentifier[];
if (rids == null || rids.Length == 0)
{
e.Effect = DragDropEffects.None;
return;
}
e.Effect = DragDropEffects.Copy;
}
private void trvLayerDrawingOrder_DragDrop(object sender, DragEventArgs e)
{
//TODO: Handle drag/drop re-ordering
var rids = e.Data.GetData(typeof(ResourceIdentifier[])) as ResourceIdentifier[];
if (rids != null && rids.Length > 0)
{
IMapLayer layer = null;
var node = trvLayerDrawingOrder.GetNodeAt(trvLayerDrawingOrder.PointToClient(new Point(e.X, e.Y)));
if (node != null)
{
var li = node.Tag as LayerItem;
if (li != null)
layer = li.Tag;
}
int added = 0;
foreach (var rid in rids)
{
if (rid.ResourceType == ResourceTypes.LayerDefinition)
{
var name = GenerateLayerName(rid.ToString(), _map);
//var layer = _map.AddLayer(parent == null ? null : parent.Name, name, rid.ToString());
var lyr = _map.AddLayer(layer, null, name, rid.ToString());
added++;
}
}
if (added > 0)
{
//TODO: Fine-grain invalidation
RefreshModels();
}
}
else
{
var data = e.Data.GetData(typeof(TreeNodeAdv[])) as TreeNodeAdv[];
if (data != null && data.Length == 1)
{
var li = data[0].Tag as LayerItem;
if (li != null)
{
IMapLayer sourceLayer = li.Tag;
IMapLayer targetLayer = null;
var node = trvLayerDrawingOrder.GetNodeAt(trvLayerDrawingOrder.PointToClient(new Point(e.X, e.Y)));
if (node != null)
{
var tli = node.Tag as LayerItem;
if (tli != null)
targetLayer = tli.Tag;
}
if (sourceLayer != null && targetLayer != null && sourceLayer != targetLayer)
{
int idx = _map.GetIndex(targetLayer);
if (idx >= 0)
{
_map.RemoveLayer(sourceLayer);
_map.InsertLayer(idx, sourceLayer);
RefreshModels();
}
}
}
}
}
}
private void trvLayerDrawingOrder_DragEnter(object sender, DragEventArgs e)
{
var data = e.Data.GetData(typeof(TreeNodeAdv[])) as TreeNodeAdv[];
if (data == null)
{
HandleDragEnter(e);
}
else
{
var layer = data[0].Tag as LayerItem;
if (layer == null)
{
e.Effect = DragDropEffects.None;
return;
}
}
}
private void trvLayerDrawingOrder_DragOver(object sender, DragEventArgs e)
{
var data = e.Data.GetData(typeof(TreeNodeAdv[])) as TreeNodeAdv[];
if (data == null)
{
HandleDragOver(e);
}
else
{
var li = data[0].Tag as LayerItem;
if (li == null)
{
e.Effect = DragDropEffects.None;
return;
}
else
{
e.Effect = DragDropEffects.Move;
}
}
}
private void trvLayerDrawingOrder_ItemDrag(object sender, ItemDragEventArgs e)
{
trvLayerDrawingOrder.DoDragDrop(e.Item, DragDropEffects.All);
}
private void trvBaseLayers_ItemDrag(object sender, ItemDragEventArgs e)
{
trvBaseLayers.DoDragDrop(e.Item, DragDropEffects.All);
}
private void trvBaseLayers_DragDrop(object sender, DragEventArgs e)
{
int added = 0;
var rids = e.Data.GetData(typeof(ResourceIdentifier[])) as ResourceIdentifier[];
if (rids != null && rids.Length > 0)
{
var node = trvLayersGroup.GetNodeAt(trvLayersGroup.PointToClient(new Point(e.X, e.Y)));
IBaseMapGroup group = null;
if (node != null && node.Tag is BaseLayerGroupItem)
{
group = ((BaseLayerGroupItem)node.Tag).Tag;
}
//No group? Let's make one!
if (group == null)
{
_map.InitBaseMap();
group = _map.BaseMap.AddBaseLayerGroup(GenerateBaseGroupName(_map));
foreach (var rid in rids)
{
if (rid.ResourceType == ResourceTypes.LayerDefinition)
{
group.AddLayer(GenerateBaseLayerName(rid.ToString(), _map.BaseMap), rid.ToString());
added++;
}
}
}
}
if (added > 0)
{
_tiledLayerModel.Invalidate();
}
}
private void trvBaseLayers_DragEnter(object sender, DragEventArgs e)
{
HandleDragEnter(e);
}
private void trvBaseLayers_DragOver(object sender, DragEventArgs e)
{
HandleDragOver(e);
}
}
}