using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using KGIS.Framework.Views; using UIShell.OSGi; using KGIS.Framework.Maps; using KGIS.Framework.AE.Interface; using DevExpress.XtraBars; using KGIS.Framework.Utils.Helper; using ESRI.ArcGIS.Controls; using ESRI.ArcGIS.Carto; using Kingo.Plugin.MapView.Views; using KGIS.Framework.Menus.Entities; using KGIS.Framework.Utils.ExtensionMethod; using KGIS.Framework.Utils; using KGIS.Framework.Commands; using KGIS.Framework.Menus.ServicesInvokes; using ESRI.ArcGIS.SystemUI; namespace Kingo.Plugin.MapView { public partial class UCDataCatalog : UserControl, IDockPanel, IDataCatalogService { private ICommandManager _CmdManager; private IMapService _MapService; public object TocHook = null; public UCDataCatalog() { try { InitializeComponent(); TocHook = axTOCControl1.Object; DockAreas = KGIS.Framework.Views.DockStyle.DockLeft; DockWidth = 300; DefaultArea = KGIS.Framework.Views.DockStyle.DockLeft; ShowCloseButton = false; ShowAutoHideButton = true; Title = "数据目录"; } catch (Exception ex) { if (ex.Message.Contains("ActiveX")) { MessageHelper.Show("ArcGIS授权服务未启动或已到期,请检查ArcGIS授权!"); } else { MessageHelper.Show(ex.Message); } } } public UCDataCatalog(IBundleContext pContext) : this() { InitService(pContext); axTOCControl1.OnDoubleClick += AxTOCControl1_OnDoubleClick; axTOCControl1.OnMouseUp += _axTocCtrl_OnMouseUp; } UCLayerStyleSet view = null; private void AxTOCControl1_OnDoubleClick(object sender, ESRI.ArcGIS.Controls.ITOCControlEvents_OnDoubleClickEvent e) { if (e.button != 1) return; esriTOCControlItem item = esriTOCControlItem.esriTOCControlItemNone; IBasicMap map = null; ILayer layer = null; object other = null; object index = null; this.axTOCControl1.Refresh(); this.axTOCControl1.HitTest(e.x, e.y, ref item, ref map, ref layer, ref other, ref index); if (item != esriTOCControlItem.esriTOCControlItemLegendClass) return; if (view == null) { view = new UCLayerStyleSet(layer); view.WindowStartupLocation = System.Windows.WindowStartupLocation.CenterScreen; view.ShowInTaskbar = false; view.Closed += (s, o) => { view = null; }; } view.ShowInMainWindow(true); } private void InitService(IBundleContext context) { context.AddService(this); } public void InitCatalogContextMenus(IEnumerable itemDatas) { InitContextMenus(itemDatas); } public Guid ID { get; set; } public KGIS.Framework.Views.DockStyle DockAreas { get; set; } public Size FloatSize { get; set; } public int DockWidth { get; set; } public int DockHeight { get; set; } public KGIS.Framework.Views.DockStyle DefaultArea { get; set; } public bool ShowCloseButton { get; set; } public bool ShowAutoHideButton { get; set; } public string Title { get; set; } #region IDataCatalog接口 public object TocCtrl => axTOCControl1; public object BarManager => barManager1; public object MapContextMenu => popMapMenu; public object GroupContextMenu => popGroupMenu; public object LayerContextMenu => popLayerMenu; #endregion private void _axTocCtrl_OnMouseUp(object sender, ITOCControlEvents_OnMouseUpEvent e) { if (e.button != 2) return; esriTOCControlItem item = esriTOCControlItem.esriTOCControlItemNone; IBasicMap map = null; ILayer layer = null; object other = null; object index = null; axTOCControl1.Refresh(); axTOCControl1.HitTest(e.x, e.y, ref item, ref map, ref layer, ref other, ref index); if (item == esriTOCControlItem.esriTOCControlItemNone) { return; } if (item == esriTOCControlItem.esriTOCControlItemMap) { axTOCControl1.SelectItem(map, null); } else { axTOCControl1.SelectItem(layer, null); } if (layer == null) { MapsManager.Instance.MapService.SetCustomProperty(map); } else { MapsManager.Instance.MapService.SetCustomProperty(layer); } if (item == esriTOCControlItem.esriTOCControlItemMap) { SetMenuEnabled(popMapMenu); popMapMenu.ShowPopup(Control.MousePosition);//弹出右键菜单 } if (item == esriTOCControlItem.esriTOCControlItemLayer) { if (layer is IGroupLayer) { ////图层组 SetMenuEnabled(popGroupMenu); popGroupMenu.ShowPopup(Control.MousePosition);//弹出右键菜单 } else { SetMenuEnabled(popLayerMenu); popLayerMenu.ShowPopup(Control.MousePosition);//弹出右键菜单 } } } /// /// 设置弹出菜单最新状态 /// /// public void SetMenuEnabled(PopupMenu menu) { foreach (LinkPersistInfo menuitem in menu.LinksPersistInfo)//循环设置右键菜单启用/禁用状态 { if ((menuitem.Item as BarButtonItem) != null) { var tmpmenu = menuitem.Item as BarButtonItem; var tmpcmd = tmpmenu.Tag; if (tmpcmd == null) return; Type type = tmpcmd.GetType(); //获取类型 try { var propertyInfo = type.GetProperty("Enabled");//获取最新启用状态 //设置菜单启用禁用 tmpmenu.Enabled = (bool)propertyInfo.GetValue(tmpcmd, null); propertyInfo = type.GetProperty("Caption"); if (propertyInfo == null) return; object title = propertyInfo.GetValue(tmpcmd, null); if (title == null) continue; if (string.IsNullOrWhiteSpace(title.ToTrim())) continue; ; tmpmenu.Caption = title.ToTrim(); } catch (Exception exc) { LogAPI.Debug(exc); } } } } public void InitContextMenus(IEnumerable itemDatas) { if (itemDatas == null) return; if (_CmdManager == null) _CmdManager = BundleRuntime.Instance.GetFirstOrDefaultService(); if (_MapService == null) { _MapService = BundleRuntime.Instance.GetFirstOrDefaultService(); } foreach (var item in itemDatas) { BarItem barItem = DealWithCatalogContextMenus(item); switch (item.ContentItemType) { case "Map": popMapMenu.AddItem(barItem); break; case "Group": popGroupMenu.AddItem(barItem); break; case "Layer": popLayerMenu.AddItem(barItem); break; default: break; } } } /// /// 将配置列表数据加载成右击菜单项 /// /// /// private BarItem DealWithCatalogContextMenus(ContentMenuItemEntity pMenuItem) { try { BarItem bar = null; if (pMenuItem.Childs != null && pMenuItem.Childs.Count > 0) { bar = new BarSubItem(); bar.Caption = pMenuItem.Name; bar.Glyph = pMenuItem.GetImage(); //创建子项 foreach (var item in pMenuItem.Childs) { BarItem subItem = DealWithCatalogContextMenus(item); (bar as BarSubItem).AddItem(subItem); barManager1.Items.Add(bar); if (ExtendMethd.JudgeIsCouldConversionStringOrHasValue(item.ParentId) == false) { switch (item.ContentItemType) { case "Map": popMapMenu.AddItem(subItem); break; case "Group": popGroupMenu.AddItem(subItem); break; case "Layer": popLayerMenu.AddItem(subItem); break; default: break; } } } } else { bar = new BarButtonItem(); bar.Caption = pMenuItem.Name; bar.ItemClick += Bar_ItemClick; bar.Glyph = pMenuItem.GetImage(); if (_CmdManager != null) bar.Tag = _CmdManager.AddCmd(pMenuItem.CommandId, pMenuItem.Bundle, null); if (bar.Tag is BaseMapMenuCommand && _MapService != null) { (bar.Tag as BaseMapMenuCommand).OnCreate(_MapService.getAxMapControl().Object); } else if (bar.Tag is ICommand && _MapService != null) { (bar.Tag as ICommand).OnCreate(_MapService.getAxMapControl().Object); } barManager1.Items.Add(bar); } return bar; } catch (Exception ex) { LogAPI.Debug("执行 将配置列表数据加载成右击菜单项 方法时异常:" + ex + " ; "); return null; } finally { } } private void Bar_ItemClick(object sender, ItemClickEventArgs e) { BarItem item = e.Item as BarItem; if (item == null || item.Tag == null) { return; } try { if (item.Tag is ITool && _MapService != null) { _MapService.SetCurrentTool(item.Tag); } else if (item.Tag is BaseMapMenuCommand) { CommandManagerInvoke.ExeCommand(item.Tag, null); if (item is BarCheckItem) { (item as BarCheckItem).Checked = (item.Tag as BaseMapMenuCommand).Checked; } } else if (item.Tag is ICommand) { (item.Tag as ICommand).OnClick(); if (item is BarCheckItem) { (item as BarCheckItem).Checked = (item.Tag as ICommand).Checked; } } } catch (Exception ex) { LogAPI.Debug(string.Format("执行【{0}】命令异常,异常信息如下:", item.Caption)); LogAPI.Debug(ex); LogAPI.Debug("异常信息结束"); } } public void InitLayerTree(IMap pMap) { throw new NotImplementedException(); } } }