#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)]
[ToolboxItem(false)]
internal partial class MapLayersSectionCtrl : EditorBindableCollapsiblePanel
{
public MapLayersSectionCtrl()
{
InitializeComponent();
trvBaseLayers.KeyUp += new KeyEventHandler(trvBaseLayers_KeyUp);
trvLayerDrawingOrder.KeyUp += new KeyEventHandler(trvLayerDrawingOrder_KeyUp);
trvLayersGroup.KeyUp += new KeyEventHandler(trvLayersGroup_KeyUp);
}
void trvLayersGroup_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Delete || e.KeyCode == Keys.Up || e.KeyCode == Keys.Down)
{
var group = GetSelectedLayerGroupItem() as GroupItem;
var layer = GetSelectedLayerGroupItem() as LayerItem;
if (e.KeyCode == Keys.Delete)
{
if (layer != null)
{
RemoveSelectedLayerGroupItem(layer);
}
else if (group != null)
{
RemoveSelectedLayerGroupItem(group);
}
}
else
{
if (layer != null)
{
OnDynamicLayerItemSelected(layer);
}
else if (group != null)
{
OnDynamicGroupItemSelected(group);
}
}
}
}
void trvLayerDrawingOrder_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Delete || e.KeyCode == Keys.Up || e.KeyCode == Keys.Down)
{
var layer = GetSelectedDrawOrderItem() as LayerItem;
if (layer != null)
{
if (e.KeyCode == Keys.Delete)
{
RemoveSelectedDrawOrderLayerItem(layer);
}
else
{
OnDrawOrderLayerItemSelected(layer);
}
}
}
}
void trvBaseLayers_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Delete || e.KeyCode == Keys.Up || e.KeyCode == Keys.Down)
{
var group = GetSelectedTiledLayerItem() as BaseLayerGroupItem;
var layer = GetSelectedTiledLayerItem() as BaseLayerItem;
if (e.KeyCode == Keys.Delete)
{
if (group != null)
{
RemoveSelectedTiledLayerItem(group);
}
else if (layer != null)
{
RemoveSelectedTiledLayerItem(layer);
}
}
else
{
if (layer != null)
{
OnBaseLayerItemSelected(layer);
}
else if (group != null)
{
OnBaseLayerGroupItemSelected(group);
}
}
}
}
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();
_tiledLayerModel.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;
btnGRPRemoveLayer.Enabled = false;
btnRemoveGroup.Enabled = false;
btnMoveGroupUp.Enabled = false;
btnMoveGroupDown.Enabled = false;
btnConvertLayerGroupToBaseGroup.Enabled = false;
if (layer != null)
{
OnDynamicLayerItemSelected(layer);
}
else if (group != null)
{
OnDynamicGroupItemSelected(group);
}
}
}
private void OnDynamicGroupItemSelected(GroupItem group)
{
btnRemoveGroup.Enabled = true;
btnMoveGroupUp.Enabled = true;
btnMoveGroupDown.Enabled = true;
btnConvertLayerGroupToBaseGroup.Enabled = true;
propertiesPanel.Controls.Clear();
var item = new GroupPropertiesCtrl(_map, group.Tag);
item.GroupChanged += (s, evt) => { OnResourceChanged(); };
item.Dock = DockStyle.Fill;
_activeLayer = null;
propertiesPanel.Controls.Add(item);
}
private void OnDynamicLayerItemSelected(LayerItem layer)
{
btnGRPRemoveLayer.Enabled = true;
propertiesPanel.Controls.Clear();
var item = new LayerPropertiesCtrl(layer.Tag, _edSvc.ResourceService);
item.LayerChanged += (s, evt) => { OnResourceChanged(); };
item.Dock = DockStyle.Fill;
_activeLayer = layer.Tag;
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;
btnDLMoveLayerBottom.Enabled =
btnDLMoveLayerDown.Enabled =
btnDLMoveLayerTop.Enabled =
btnDLMoveLayerUp.Enabled =
btnDLRemoveLayer.Enabled = false;
if (layer != null)
{
OnDrawOrderLayerItemSelected(layer);
}
}
}
private IMapLayer _activeLayer;
private void OnDrawOrderLayerItemSelected(LayerItem layer)
{
btnDLMoveLayerBottom.Enabled =
btnDLMoveLayerDown.Enabled =
btnDLMoveLayerTop.Enabled =
btnDLMoveLayerUp.Enabled =
btnDLRemoveLayer.Enabled = true;
propertiesPanel.Controls.Clear();
var item = new LayerPropertiesCtrl(layer.Tag, _edSvc.ResourceService);
item.LayerChanged += (s, evt) => { OnResourceChanged(); };
item.Dock = DockStyle.Fill;
_activeLayer = layer.Tag;
propertiesPanel.Controls.Add(item);
}
private void btnAddGroup_Click(object sender, EventArgs e)
{
var selGroup = GetSelectedLayerGroupItem() as GroupItem;
IMapLayerGroup parent = null;
if (selGroup != null)
parent = selGroup.Tag;
var newGroup = CreateNewGroup(parent);
_grpLayerModel.Invalidate();
RestoreGroupSelection(newGroup);
}
private void btnRemoveGroup_Click(object sender, EventArgs e)
{
var group = GetSelectedLayerGroupItem() as GroupItem;
if (group != null)
{
RemoveSelectedLayerGroupItem(group);
}
}
private void RemoveSelectedLayerGroupItem(GroupItem group)
{
_map.RemoveLayerGroupAndChildLayers(group.Tag.Name);
propertiesPanel.Controls.Clear();
_grpLayerModel.Invalidate();
_doLayerModel.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)
{
LastSelectedFolder.FolderId = picker.SelectedFolder;
string layerId = picker.ResourceID;
var selGroup = GetSelectedLayerGroupItem() as GroupItem;
var layer = CreateLayer(layerId, selGroup == null ? null : selGroup.Tag);
this.RefreshModels();
RestoreLayerSelection(layer);
}
}
}
private void btnGRPRemoveLayer_Click(object sender, EventArgs e)
{
var layer = GetSelectedLayerGroupItem() as LayerItem;
if (layer != null)
{
RemoveSelectedLayerGroupItem(layer);
}
}
private void RemoveSelectedLayerGroupItem(LayerItem layer)
{
_map.RemoveLayer(layer.Tag);
propertiesPanel.Controls.Clear();
this.RefreshModels();
}
private void btnConvertLayerGroupToBaseGroup_Click(object sender, EventArgs e)
{
var group = GetSelectedLayerGroupItem() as GroupItem;
if (group != null)
{
var layGroup = group.Tag;
var layers = _map.GetLayersForGroup(layGroup.Name);
if (_map.BaseMap == null)
_map.InitBaseMap();
int counter = 1;
string groupName = layGroup.Name;
var blg = _map.BaseMap.GetGroup(groupName);
while (blg != null)
{
groupName = layGroup.Name + " (" + counter + ")";
counter++;
blg = _map.BaseMap.GetGroup(groupName);
}
blg = _map.BaseMap.AddBaseLayerGroup(groupName);
blg.LegendLabel = layGroup.LegendLabel;
foreach (var layer in layers)
{
var bl = blg.AddLayer(layer.Name, layer.ResourceId);
bl.LegendLabel = layer.LegendLabel;
bl.Selectable = layer.Selectable;
bl.ShowInLegend = layer.ShowInLegend;
bl.ExpandInLegend = layer.ExpandInLegend;
}
_map.RemoveLayerGroupAndChildLayers(layGroup.Name);
MessageBox.Show(string.Format(Properties.Resources.LayerGroupConvertedToBaseLayerGroup, layGroup.Name, groupName));
this.RefreshModels();
tabControl1.SelectedIndex = 2; //Switch to Base Layer Groups
}
}
private void btnBaseGroupToRegular_Click(object sender, EventArgs e)
{
var group = GetSelectedTiledLayerItem() as BaseLayerGroupItem;
if (group != null)
{
int counter = 0;
string groupName = group.Tag.Name;
while (_map.GetGroupByName(groupName) != null)
{
counter++;
groupName = group.Tag.Name + "(" + counter + ")";
}
_map.AddGroup(groupName);
int layerCount = _map.GetLayerCount();
foreach (var layer in group.Tag.BaseMapLayer)
{
//We an avoid a duplicate name check because the Map Definition should already ensure uniqueness
//among existing layers
var dlayer = _map.AddLayer(groupName, layer.Name, layer.ResourceId);
dlayer.ExpandInLegend = layer.ExpandInLegend;
dlayer.LegendLabel = layer.LegendLabel;
dlayer.Selectable = layer.Selectable;
dlayer.ShowInLegend = layer.ShowInLegend;
//HACK-ish, but we need to relocate this
_map.RemoveLayer(dlayer);
//Add to bottom
_map.InsertLayer(layerCount, dlayer);
layerCount++;
}
//Detach the base layer group
_map.BaseMap.RemoveBaseLayerGroup(group.Tag);
MessageBox.Show(string.Format(Properties.Resources.BaseLayerGroupConvertedToLayerGroup, group.Tag.Name, groupName));
this.RefreshModels();
tabControl1.SelectedIndex = 0; //Switch to Layer Groups
}
}
private void btnDLAddLayer_Click(object sender, EventArgs e)
{
using (var picker = new ResourcePicker(_edSvc.ResourceService, ResourceTypes.LayerDefinition, ResourcePickerMode.OpenResource))
{
if (picker.ShowDialog() == DialogResult.OK)
{
LastSelectedFolder.FolderId = picker.SelectedFolder;
string layerId = picker.ResourceID;
var selGroup = GetSelectedDrawOrderItem() as GroupItem;
var layer = CreateLayer(layerId, selGroup != null ? selGroup.Tag : null);
this.RefreshModels();
RestoreDrawOrderSelection(layer);
}
}
}
private void btnDLRemoveLayer_Click(object sender, EventArgs e)
{
var layer = GetSelectedDrawOrderItem() as LayerItem;
if (layer != null)
{
RemoveSelectedDrawOrderLayerItem(layer);
}
}
private void RemoveSelectedDrawOrderLayerItem(LayerItem layer)
{
_map.RemoveLayer(layer.Tag);
propertiesPanel.Controls.Clear();
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 TaggedType RestoreSelection(TreeViewAdv tree, Predicate predicate) where TaggedType : class
{
TaggedType ret = null;
//Restore selection
TreeNodeAdv selectedNode = null;
foreach (var node in tree.AllNodes)
{
var tag = node.Tag as TaggedType;
if (tag != null && predicate(tag))
{
selectedNode = node;
ret = tag;
break;
}
}
if (selectedNode != null)
tree.SelectedNode = selectedNode;
return ret;
}
private static void ExpandNode(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)
{
var n = selectedNode;
while (n != null)
{
n.Expand();
n = n.Parent;
}
}
}
private void RestoreLayerSelection(LayerItem item)
{
//The node tag will probably be different, but the wrapped
//instance is what we're checking for
var it = RestoreSelection(trvLayersGroup, (tag) => { return tag.Tag == item.Tag; });
if (it != null)
OnDynamicLayerItemSelected(it);
}
private void RestoreLayerSelection(IMapLayer item)
{
//The node tag will probably be different, but the wrapped
//instance is what we're checking for
var it = RestoreSelection(trvLayersGroup, (tag) => { return tag.Tag == item; });
if (it != null)
OnDynamicLayerItemSelected(it);
}
private void RestoreGroupSelection(GroupItem item)
{
//The node tag will probably be different, but the wrapped
//instance is what we're checking for
var it = RestoreSelection(trvLayersGroup, (tag) => { return tag.Tag == item.Tag; });
if (it != null)
OnDynamicGroupItemSelected(it);
}
private void RestoreGroupSelection(IMapLayerGroup group)
{
//The node tag will probably be different, but the wrapped
//instance is what we're checking for
var it = RestoreSelection(trvLayersGroup, (tag) => { return tag.Tag == group; });
if (it != null)
OnDynamicGroupItemSelected(it);
}
private void RestoreBaseLayerSelection(BaseLayerItem item)
{
//The node tag will probably be different, but the wrapped
//instance is what we're checking for
var it = RestoreSelection(trvBaseLayers, (tag) => { return tag.Tag == item.Tag; });
if (it != null)
OnBaseLayerItemSelected(it);
}
private void RestoreBaseLayerSelection(IBaseMapLayer layer)
{
//The node tag will probably be different, but the wrapped
//instance is what we're checking for
var it = RestoreSelection(trvBaseLayers, (tag) => { return tag.Tag == layer; });
if (it != null)
OnBaseLayerItemSelected(it);
}
private void RestoreDrawOrderSelection(LayerItem layer)
{
//The node tag will probably be different, but the wrapped
//instance is what we're checking for
var lyr = RestoreSelection(trvLayerDrawingOrder, (tag) => { return tag.Tag == layer.Tag; });
if (lyr != null)
OnDrawOrderLayerItemSelected(lyr);
}
private void RestoreDrawOrderSelection(IMapLayer layer)
{
//The node tag will probably be different, but the wrapped
//instance is what we're checking for
var lyr = RestoreSelection(trvLayerDrawingOrder, (tag) => { return tag.Tag == layer; });
if (lyr != null)
OnDrawOrderLayerItemSelected(lyr);
}
private IMapLayerGroup 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;
return group;
}
private IMapLayer 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);
return layer;
}
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)
{
RemoveSelectedTiledLayerItem(group);
}
}
private void RemoveSelectedTiledLayerItem(BaseLayerGroupItem group)
{
_map.BaseMap.RemoveBaseLayerGroup(group.Tag);
propertiesPanel.Controls.Clear();
_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)
{
LastSelectedFolder.FolderId = picker.SelectedFolder;
_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));
}
}
var bl = grp.AddLayer(GenerateBaseLayerName(layerId, _map.BaseMap), layerId);
_tiledLayerModel.Invalidate();
RestoreBaseLayerSelection(bl);
}
}
}
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)
{
RemoveSelectedTiledLayerItem(layer);
}
}
private void RemoveSelectedTiledLayerItem(BaseLayerItem layer)
{
var grp = layer.Parent;
grp.RemoveBaseMapLayer(layer.Tag);
propertiesPanel.Controls.Clear();
_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 btnMoveGroupUp_Click(object sender, EventArgs e)
{
var group = GetSelectedLayerGroupItem() as GroupItem;
if (group != null)
{
var mdf = group.Tag.Parent;
mdf.MoveUpGroup(group.Tag);
_grpLayerModel.Invalidate();
RestoreGroupSelection(group);
}
}
private void btnMoveGroupDown_Click(object sender, EventArgs e)
{
var group = GetSelectedLayerGroupItem() as GroupItem;
if (group != null)
{
var mdf = group.Tag.Parent;
mdf.MoveDownGroup(group.Tag);
_grpLayerModel.Invalidate();
RestoreGroupSelection(group);
}
}
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;
btnRemoveBaseLayerGroup.Enabled = false;
btnRemoveBaseLayer.Enabled = false;
btnMoveBaseLayerDown.Enabled = false;
btnMoveBaseLayerUp.Enabled = false;
btnAddBaseLayer.Enabled = false;
if (layer != null)
{
OnBaseLayerItemSelected(layer);
}
else if (group != null)
{
OnBaseLayerGroupItemSelected(group);
}
else if (scale != null)
{
OnFiniteScaleListSelected();
}
}
}
private void OnFiniteScaleListSelected()
{
propertiesPanel.Controls.Clear();
var item = new FiniteScaleListCtrl(_map, _edSvc);
item.Dock = DockStyle.Fill;
propertiesPanel.Controls.Add(item);
}
private void OnBaseLayerGroupItemSelected(BaseLayerGroupItem group)
{
btnAddBaseLayer.Enabled = true;
btnRemoveBaseLayerGroup.Enabled = true;
btnBaseLayerGroupToRegular.Enabled = true;
propertiesPanel.Controls.Clear();
var item = new GroupPropertiesCtrl(_map, group.Tag);
item.GroupChanged += (s, evt) => { OnResourceChanged(); };
item.Dock = DockStyle.Fill;
_activeLayer = null;
propertiesPanel.Controls.Add(item);
}
private void OnBaseLayerItemSelected(BaseLayerItem layer)
{
btnRemoveBaseLayer.Enabled = true;
btnMoveBaseLayerDown.Enabled = true;
btnMoveBaseLayerUp.Enabled = true;
btnBaseLayerGroupToRegular.Enabled = false;
propertiesPanel.Controls.Clear();
var item = new LayerPropertiesCtrl(layer.Tag, _edSvc.ResourceService);
item.LayerChanged += (s, evt) => { OnResourceChanged(); };
item.Dock = DockStyle.Fill;
_activeLayer = null;
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(RepositoryHandle[])) as RepositoryHandle[];
if (rids == null || rids.Length == 0)
{
e.Effect = DragDropEffects.None;
return;
}
//But only of the Layer Definition kind
if (rids.Length == 1 && rids[0].ResourceId.ResourceType != ResourceTypes.LayerDefinition)
{
e.Effect = DragDropEffects.None;
return;
}
//Even in multiples
foreach (var r in rids)
{
if (r.ResourceId.ResourceType != ResourceTypes.LayerDefinition)
{
e.Effect = DragDropEffects.None;
return;
}
}
}
private void trvLayersGroup_DragDrop(object sender, DragEventArgs e)
{
var rids = e.Data.GetData(typeof(RepositoryHandle[])) as RepositoryHandle[];
var nodes = e.Data.GetData(typeof(TreeNodeAdv[])) as TreeNodeAdv[];
if (rids != null && rids.Length > 0)
{
IMapLayerGroup parent = null;
var clientPt = trvLayersGroup.PointToClient(new Point(e.X, e.Y));
var node = trvLayersGroup.GetNodeAt(clientPt);
if (node != null)
{
var gi = node.Tag as GroupItem;
if (gi != null)
{
parent = gi.Tag;
}
else
{
if (node.Parent != null)
{
gi = node.Parent.Tag as GroupItem;
if (gi != null)
parent = gi.Tag;
}
}
}
int added = 0;
foreach (var rid in rids)
{
if (rid.ResourceId.ResourceType == ResourceTypes.LayerDefinition)
{
var name = GenerateLayerName(rid.ResourceId.ToString(), _map);
var layer = _map.AddLayer(parent == null ? null : parent.Name, name, rid.ResourceId.ToString());
added++;
}
}
if (added > 0)
{
//TODO: Fine-grain invalidation
RefreshModels();
if (parent != null)
ExpandNode(trvLayersGroup, (tag) => { return tag.Tag == parent; });
}
}
else if (nodes != null && nodes.Length > 0)
{
IMapLayerGroup parent = null;
var clientPt = trvLayersGroup.PointToClient(new Point(e.X, e.Y));
var node = trvLayersGroup.GetNodeAt(clientPt);
if (node != null)
{
var gi = node.Tag as GroupItem;
var li = node.Tag as LayerItem;
if (gi != null)
{
if (TargetIsAmongSource(nodes, gi) || TargetIsDescendant(nodes, gi))
return;
parent = gi.Tag;
}
else if (li != null)
{
return;
//parent = _map.GetGroupByName(li.Tag.Group);
}
}
int moved = 0;
//Add to this group
foreach (var n in nodes)
{
var gi = n.Tag as GroupItem;
var li = n.Tag as LayerItem;
//Re-assign parent
if (gi != null)
{
gi.Tag.Group = parent == null ? string.Empty : parent.Name;
moved++;
}
else if (li != null)
{
li.Tag.Group = parent == null ? string.Empty : parent.Name;
moved++;
}
}
if (moved > 0)
{
//TODO: Fine-grain invalidation
RefreshModels();
if (parent != null)
ExpandNode(trvLayersGroup, (tag) => { return tag.Tag == parent; });
OnResourceChanged();
}
}
}
private static bool TargetIsAmongSource(TreeNodeAdv[] nodes, GroupItem target)
{
foreach (var n in nodes)
{
var gi = n.Tag as GroupItem;
if (gi != null && gi == target)
return true;
}
return false;
}
private bool TargetIsDescendant(TreeNodeAdv[] nodes, GroupItem target)
{
foreach (var n in nodes)
{
var gi = n.Tag as GroupItem;
if (gi != null)
{
var grp = target.Tag;
while (!string.IsNullOrEmpty(grp.Group))
{
var parent = _map.GetGroupByName(grp.Group);
if (parent == gi.Tag)
return true;
grp = parent;
}
}
}
return false;
}
private void trvLayersGroup_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;
var gi = data[0].Tag as GroupItem;
if (li == null && gi == null)
{
e.Effect = DragDropEffects.None;
return;
}
else
{
e.Effect = DragDropEffects.Move;
}
}
}
private void HandleDragOver(DragEventArgs e)
{
var rids = e.Data.GetData(typeof(RepositoryHandle[])) as RepositoryHandle[];
if (rids == null || rids.Length == 0)
{
e.Effect = DragDropEffects.None;
return;
}
else
{
//All handles should have the same connection, so sample the first
//Must be the same connection as this current editor
if (rids[0].Connection != _edSvc.GetEditedResource().CurrentConnection)
{
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(RepositoryHandle[])) as RepositoryHandle[];
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.ResourceId.ResourceType == ResourceTypes.LayerDefinition)
{
var name = GenerateLayerName(rid.ResourceId.ToString(), _map);
//var layer = _map.AddLayer(parent == null ? null : parent.Name, name, rid.ToString());
var lyr = _map.AddLayer(layer, null, name, rid.ResourceId.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)
{
var rids = e.Data.GetData(typeof(RepositoryHandle[])) as RepositoryHandle[];
var data = e.Data.GetData(typeof(TreeNodeAdv[])) as TreeNodeAdv[];
if (rids != null && rids.Length > 0)
{
int added = 0;
var node = trvBaseLayers.GetNodeAt(trvBaseLayers.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.ResourceId.ResourceType == ResourceTypes.LayerDefinition)
{
group.AddLayer(GenerateBaseLayerName(rid.ResourceId.ToString(), _map.BaseMap), rid.ResourceId.ToString());
added++;
}
}
if (added > 0)
{
_tiledLayerModel.Invalidate();
}
}
else if (data != null && data.Length == 1)
{
var li = data[0].Tag as BaseLayerItem;
if (li != null)
{
IBaseMapLayer sourceLayer = li.Tag;
IBaseMapLayer targetLayer = null;
IBaseMapGroup targetGroup = null;
var node = trvBaseLayers.GetNodeAt(trvBaseLayers.PointToClient(new Point(e.X, e.Y)));
BaseLayerItem tli = null;
if (node != null)
{
tli = node.Tag as BaseLayerItem;
var tlg = node.Tag as BaseLayerGroupItem;
if (tli != null)
targetLayer = tli.Tag;
else if (tlg != null)
targetGroup = tlg.Tag;
}
if (sourceLayer != null && targetGroup != null && targetGroup.GetIndex(sourceLayer) < 0) //Dropping to a different base layer group
{
var srcGroup = _map.BaseMap.GetGroupForLayer(sourceLayer);
srcGroup.RemoveBaseMapLayer(sourceLayer);
targetGroup.InsertLayer(0, sourceLayer);
_tiledLayerModel.Invalidate();
//Keep group expanded
if (tli != null)
RestoreBaseLayerSelection(sourceLayer);
}
else if (sourceLayer != null && targetLayer != null && sourceLayer != targetLayer)
{
var srcGroup = _map.BaseMap.GetGroupForLayer(sourceLayer);
var dstGroup = _map.BaseMap.GetGroupForLayer(targetLayer);
if (srcGroup != null)
{
if (srcGroup == dstGroup)
{
int idx = srcGroup.GetIndex(targetLayer);
if (idx >= 0)
{
srcGroup.RemoveBaseMapLayer(sourceLayer);
srcGroup.InsertLayer(idx, sourceLayer);
_tiledLayerModel.Invalidate();
//Keep group expanded
if (tli != null)
RestoreBaseLayerSelection(sourceLayer);
}
}
else
{
srcGroup.RemoveBaseMapLayer(sourceLayer);
dstGroup.InsertLayer(0, targetLayer);
_tiledLayerModel.Invalidate();
//Keep group expanded
if (tli != null)
RestoreBaseLayerSelection(targetLayer);
}
}
}
}
}
}
private void trvBaseLayers_DragEnter(object sender, DragEventArgs e)
{
HandleDragEnter(e);
}
private void trvBaseLayers_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 BaseLayerItem;
if (li == null)
{
e.Effect = DragDropEffects.None;
return;
}
else
{
e.Effect = DragDropEffects.Move;
}
}
}
private void btnInvokeMgCooker_Click(object sender, EventArgs e)
{
if (_edSvc.IsNew || _edSvc.IsDirty)
{
MessageBox.Show(Properties.Resources.SaveMapBeforeTiling);
return;
}
var conn = _map.CurrentConnection;
//HACK: Can't support other connection types beyond HTTP atm
if (!conn.ProviderName.ToLower().Contains("maestro.http"))
{
MessageBox.Show(string.Format(Properties.Resources.UnsupportedConnectionType, conn.ProviderName));
return;
}
if (_map.BaseMap == null || _map.BaseMap.GroupCount == 0)
{
MessageBox.Show(Properties.Resources.NotATiledMap);
return;
}
//HACK: This will ask for login again because we don't store username/password and MgCooker does not
//support initialization from a session id yet. But at least MgCooker will launch with the correct
//map definition loaded
_edSvc.RunProcess("MgCooker",
"--mapagent=" + conn.GetCustomProperty("BaseUrl"),
"--mapdefinitions=" + _edSvc.ResourceID);
}
private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
{
if (_activeLayer != null)
{
switch (tabControl1.SelectedIndex)
{
case 0: //Logical
RestoreLayerSelection(_activeLayer);
break;
case 1: //Draw Order
RestoreDrawOrderSelection(_activeLayer);
break;
default:
_activeLayer = null;
break;
}
}
}
}
}