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 System.Text.RegularExpressions; namespace GeoSigmaViewer { public delegate void NodeSelected(string layerName); public partial class LayerTree : UserControl { public NodeSelected LayerSelectedEvent; public Viewer DrawViewer { get; set; } TreeNode currentNode = null; Font fontDefault; Font fontFocuse; bool allChecked = false; public int ID { get; set; } public LayerTree() { System.Security.Cryptography.RNGCryptoServiceProvider csp = new System.Security.Cryptography.RNGCryptoServiceProvider(); byte[] byteCsp = new byte[10]; csp.GetBytes(byteCsp); ID=BitConverter.ToInt32(byteCsp, 0); InitializeComponent(); fontDefault=DefaultFont; fontFocuse=new Font("宋体", 9.0f, FontStyle.Bold|FontStyle.Underline); //treeView.ShowLines=false; //treeView.FullRowSelect=true; } private TreeNode FindNode(TreeNode tnParent, string strValue) { if (tnParent==null) return null; if (tnParent.FullPath==strValue) return tnParent; TreeNode tnRet = null; foreach (TreeNode tn in tnParent.Nodes) { tnRet=FindNode(tn, strValue); if (tnRet!=null) break; } return tnRet; } private void Expand2Node(TreeNode node) { TreeNode tnParent = node.Parent; if(tnParent !=null) { tnParent.Expand(); Expand2Node(tnParent); } } public void SetCurrentLayer(string layerName) { TreeNode nodeFind = FindNode(treeView.Nodes[0], "图层\\"+layerName); if (nodeFind==null) return; if (currentNode!=null) { currentNode.NodeFont=fontDefault; currentNode.ForeColor=Color.Black; } currentNode=nodeFind; currentNode.NodeFont=fontFocuse; currentNode.ForeColor=Color.Red; treeView.SelectedNode=currentNode; Expand2Node(currentNode); } public void ResetLayers(string layers) { string[] saFullLayers = Regex.Split(layers, "\r\n"); Array.Reverse(saFullLayers); treeView.Nodes.Clear(); treeView.ImageList=imlLayer; TreeNode tnRoot = new TreeNode("图层"); tnRoot.Name=tnRoot.Text; treeView.Nodes.Add(tnRoot); foreach (string strLine in saFullLayers) { if (strLine.Length==0) continue; string[] saLayers = Regex.Split(strLine, @"\\"); FillLayerTree(tnRoot, saLayers, 0); } treeView.UpdateView(); treeView.UnselectAll(); tnRoot.Expand(); } private void FillLayerTree(TreeNode tnRoot, string[] saLayers, int startIndex) { for (int i = startIndex; i /// 生成节点及其子节点 /// /// /// /// private void MakeFullNode(TreeNode curNode, string[] nodeNames, int startIndex) { if (startIndex /// 可见可编辑 /// /// /// private void tsbViewEdit_Click(object sender, EventArgs e) { if (treeView.Nodes.Count==0) return; LayerStatus status = LayerStatus.VIEW_EDIT; SetCheckedNodeStatus(treeView.Nodes[0], status); DrawViewer.Redraw(); } private void tsbViewNotEdit_Click(object sender, EventArgs e) { if (treeView.Nodes.Count==0) return; LayerStatus status = LayerStatus.VIEW_NOT_EDIT; SetCheckedNodeStatus(treeView.Nodes[0], status); DrawViewer.Redraw(); } private void tsbNotViewNotEdit_Click(object sender, EventArgs e) { if (treeView.Nodes.Count==0) return; LayerStatus status = LayerStatus.NOT_VIEW_NOT_EDIT; SetCheckedNodeStatus(treeView.Nodes[0], status); DrawViewer.Redraw(); } /// /// 设置选中节点的状态 /// /// /// private void SetCheckedNodeStatus(TreeNode node, LayerStatus status) { if (node==null) return; if (node.GetCheckStatus()==1) { string strLayer = GetLayerName(node); if (!String.IsNullOrWhiteSpace(strLayer)) { DrawViewer.SetLayerState(strLayer, status); SetNodeStatus(node, status); } } foreach (TreeNode tn in node.Nodes) { SetCheckedNodeStatus(tn, status); } } /// /// 选中指定状态的节点 /// /// /// private void CheckedNodeByStatus(TreeNode node, LayerStatus status) { if (node==null) return; if (status==GetNodestatus(node)) { node.SetCheckStatus(1); } foreach (TreeNode tn in node.Nodes) { CheckedNodeByStatus(tn, status); } } /// /// 设置节点状态标识 /// /// /// private void SetNodeStatus(TreeNode node, LayerStatus status) { if(status ==LayerStatus.VIEW_EDIT) { node.ImageIndex=0; } else if (status==LayerStatus.VIEW_NOT_EDIT) { node.ImageIndex=1; } else if (status==LayerStatus.NOT_VIEW_NOT_EDIT) { node.ImageIndex=2; } else { node.ImageIndex=0; } } private LayerStatus GetNodestatus(TreeNode node) { LayerStatus status=0; if (node.ImageIndex==0) { status=LayerStatus.VIEW_EDIT; } else if (node.ImageIndex==1) { status=LayerStatus.VIEW_NOT_EDIT; } else if (node.ImageIndex==2) { status=LayerStatus.NOT_VIEW_NOT_EDIT; } return status; } private string GetLayerName(TreeNode node) { string strLayerName = node.FullPath; if (strLayerName.Length<3) return null; strLayerName="Layer:\\"+strLayerName.Remove(0, 3); return strLayerName; } private void tsbCheckAll_Click(object sender, EventArgs e) { if (allChecked==false) { treeView.SelectAll(); } else { treeView.UnselectAll(); } allChecked=!allChecked; } private void tsbCheckLock_Click(object sender, EventArgs e) { treeView.UnselectAll(); CheckedNodeByStatus(treeView.Nodes[0], LayerStatus.VIEW_NOT_EDIT); treeView.UpdateView(); } private void tsbCheckUnlock_Click(object sender, EventArgs e) { treeView.UnselectAll(); CheckedNodeByStatus(treeView.Nodes[0], LayerStatus.VIEW_EDIT); treeView.UpdateView(); } private void tsbCheckHide_Click(object sender, EventArgs e) { treeView.UnselectAll(); CheckedNodeByStatus(treeView.Nodes[0], LayerStatus.NOT_VIEW_NOT_EDIT); treeView.UpdateView(); } private void drpCheckAll_ButtonClick(object sender, EventArgs e) { tsbCheckAll_Click(sender, e); } private void tspAddChildNode_ButtonClick(object sender, EventArgs e) { TreeNode tnParent = treeView.SelectedNode; if (tnParent==null) return; int i = 1; string strNodeName = "新图层"+i; TreeNode[] nodes= tnParent.Nodes.Find(strNodeName, false); while (nodes!=null && nodes.Length>0) { i++; strNodeName ="新图层"+i; nodes=tnParent.Nodes.Find(strNodeName, false); } AddNewNode(tnParent, strNodeName); } private void tsbAddChildNode_Click(object sender, EventArgs e) { tspAddChildNode_ButtonClick(sender, e); } private void tsbAddNextNode_Click(object sender, EventArgs e) { if (treeView.SelectedNode==null) return; TreeNode tnParent = treeView.SelectedNode.Parent; if (tnParent==null) return; int i = 1; string strNodeName = "新图层"+i; TreeNode[] nodes = tnParent.Nodes.Find(strNodeName, false); while (nodes!=null&&nodes.Length>0) { i++; strNodeName="新图层"+i; nodes=tnParent.Nodes.Find(strNodeName, false); } AddNewNode(tnParent, strNodeName); } private void AddNewNode(TreeNode parentNode, string nodeName) { TreeNode tnNew = new TreeNode(nodeName); tnNew.Name=tnNew.Text; tnNew.ImageIndex=0; tnNew.SetCheckStatus(0); parentNode.Nodes.Add(tnNew); treeView.UpdateView(); parentNode.Expand(); //treeView.SelectedNode=tnNew; string strLayerName = GetLayerName(tnNew); DrawViewer.FindAddLayer(strLayerName, false); ActiveNode(tnNew); } /// /// 删除选中图层 /// /// /// private void tspDeleteLayer_ButtonClick(object sender, EventArgs e) { //TreeNode node = treeView.SelectedNode; // if (node==null) return; List lstNodes = new List(); GetNodeByCheckStatus(treeView.Nodes[0], 1, lstNodes); List lstLayers = new List(); foreach(TreeNode node in lstNodes) { GetLayersWithChild(node, lstLayers); } DrawViewer.DeleteLayer(lstLayers); foreach (TreeNode node in lstNodes) { node.Remove(); } treeView.UpdateView(); DrawViewer.Redraw(); string strCurLayer = DrawViewer.GetCurrentLayer(); ActiveNode(strCurLayer); } private void GetNodeByCheckStatus(TreeNode node, int checkStatus, List nodes) { if (node==null) return; if (node.GetCheckStatus()==(int)checkStatus) { nodes.Insert(0, node); } foreach (TreeNode tn in node.Nodes) { GetNodeByCheckStatus(tn, checkStatus, nodes); } } private void GetLayersWithChild(TreeNode node, List layerNames) { if (node==null) return; string strLayerName = GetLayerName(node); if(!layerNames.Contains(strLayerName)) layerNames.Add(strLayerName); foreach (TreeNode tn in node.Nodes) { GetLayersWithChild(tn, layerNames); } } /// /// 反选 /// /// /// private void tsbCheckReverse_Click(object sender, EventArgs e) { treeView.AntiSelect(); } private void treeView_AfterSelect(object sender, TreeViewEventArgs e) { string strName = GetLayerName(e.Node); LayerSelectedEvent?.Invoke(strName); //MessageBox.Show(strName); } } }