You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

449 lines
15 KiB
C#

1 month ago
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<saLayers.Length; i++)
{
string strLayer = saLayers[i];
if (strLayer.Equals("Layer:"))
{ continue; }
int nFind = tnRoot.Nodes.IndexOfKey(strLayer);
if (nFind<0)
{
MakeFullNode(tnRoot, saLayers, i);
break;
}
else
{
TreeNode tnFind = tnRoot.Nodes[nFind];
FillLayerTree(tnFind, saLayers, i+1);
break;
}
}
}
/// <summary>
/// 生成节点及其子节点
/// </summary>
/// <param name="curNode"></param>
/// <param name="nodeNames"></param>
/// <param name="startIndex"></param>
private void MakeFullNode(TreeNode curNode, string[] nodeNames, int startIndex)
{
if (startIndex<nodeNames.Length)
{
TreeNode tnChild = new TreeNode(nodeNames[startIndex]);
tnChild.Name=tnChild.Text;
tnChild.ImageIndex=0;
curNode.Nodes.Add(tnChild);
MakeFullNode(tnChild, nodeNames, startIndex+1);
}
}
private void treeView_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
{
ActiveNode(e.Node);
//if (currentNode!=null)
//{
// currentNode.NodeFont=fontDefault;
// currentNode.ForeColor=Color.Black;
//}
//currentNode=e.Node;
//currentNode.NodeFont=fontFocuse;
//currentNode.ForeColor=Color.Red;
//string strLayerName = GetLayerName(e.Node);
//if (String.IsNullOrWhiteSpace(strLayerName)) return;
//DrawViewer.SetCurrentLayer(strLayerName);
}
private void ActiveNode(string layerName)
{
TreeNode nodeFind = FindNode(treeView.Nodes[0], "图层\\"+layerName);
if (nodeFind==null) return;
ActiveNode(nodeFind);
}
private void ActiveNode(TreeNode node)
{
if (currentNode!=null)
{
currentNode.NodeFont=fontDefault;
currentNode.ForeColor=Color.Black;
}
currentNode=node;
currentNode.NodeFont=fontFocuse;
currentNode.ForeColor=Color.Red;
treeView.SelectedNode=currentNode;
string strLayerName = GetLayerName(node);
if (String.IsNullOrWhiteSpace(strLayerName)) return;
DrawViewer.SetCurrentLayer(strLayerName);
}
/// <summary>
/// 可见可编辑
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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();
}
/// <summary>
/// 设置选中节点的状态
/// </summary>
/// <param name="node"></param>
/// <param name="status"></param>
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);
}
}
/// <summary>
/// 选中指定状态的节点
/// </summary>
/// <param name="node"></param>
/// <param name="status"></param>
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);
}
}
/// <summary>
/// 设置节点状态标识
/// </summary>
/// <param name="node"></param>
/// <param name="status"></param>
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);
}
/// <summary>
/// 删除选中图层
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tspDeleteLayer_ButtonClick(object sender, EventArgs e)
{
//TreeNode node = treeView.SelectedNode;
// if (node==null) return;
List<TreeNode> lstNodes = new List<TreeNode>();
GetNodeByCheckStatus(treeView.Nodes[0], 1, lstNodes);
List<string> lstLayers = new List<string>();
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<TreeNode> 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<string> 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);
}
}
/// <summary>
/// 反选
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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);
}
}
}