SuperDesign/Source/开发辅助工具/Tools/FrmJson.cs
鑫Intel abae178120 ### 2021-02-13更新
------
#### SuperDesign    V2.0.2102.0101
*.[更换]更换高亮控件。
*.[新增]打包时可以依据项目来决定是否混淆。
2021-02-13 09:18:00 +08:00

307 lines
13 KiB
C#

using FastColoredTextBoxNS;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using WeifenLuo.WinFormsUI.Docking;
namespace .Tools
{
public partial class FrmJson : DockContent
{
public FrmJson()
{
InitializeComponent();
textEditorControl1.ClearStylesBuffer();
textEditorControl1.Range.ClearStyle(StyleIndex.All);
textEditorControl1.AddStyle(new MarkerStyle(new SolidBrush(Color.FromArgb(40, Color.Gray))));
textEditorControl1.AutoIndentNeeded -= fctb_AutoIndentNeeded;
textEditorControl1.Language = Language.JSON;
textEditorControl1.OnSyntaxHighlight(new TextChangedEventArgs(textEditorControl1.Range));
}
private void fctb_AutoIndentNeeded(object sender, AutoIndentEventArgs args)
{
//block {}
if (Regex.IsMatch(args.LineText, @"^[^""']*\{.*\}[^""']*$"))
return;
//start of block {}
if (Regex.IsMatch(args.LineText, @"^[^""']*\{"))
{
args.ShiftNextLines = args.TabLength;
return;
}
//end of block {}
if (Regex.IsMatch(args.LineText, @"}[^""']*$"))
{
args.Shift = -args.TabLength;
args.ShiftNextLines = -args.TabLength;
return;
}
//label
if (Regex.IsMatch(args.LineText, @"^\s*\w+\s*:\s*($|//)") &&
!Regex.IsMatch(args.LineText, @"^\s*default\s*:"))
{
args.Shift = -args.TabLength;
return;
}
//some statements: case, default
if (Regex.IsMatch(args.LineText, @"^\s*(case|default)\b.*:\s*($|//)"))
{
args.Shift = -args.TabLength / 2;
return;
}
//is unclosed operator in previous line ?
if (Regex.IsMatch(args.PrevLineText, @"^\s*(if|for|foreach|while|[\}\s]*else)\b[^{]*$"))
if (!Regex.IsMatch(args.PrevLineText, @"(;\s*$)|(;\s*//)"))//operator is unclosed
{
args.Shift = args.TabLength;
return;
}
}
private void LoadTreeList(TreeNodeCollection nodes,JObject jo)
{
foreach (var item in jo)
{
if (item.Value.HasValues)
{
var node = nodes.Add(item.Key.ToString());
node.Tag = new JsonInfo() { name = item.Key.ToString(), value = item.Value.ToString() };
try
{
JArray jar = JArray.Parse(item.Value.ToString());
if (jar != null)
{
for (int i = 0; i < jar.Count; i++)
{
var node1 = node.Nodes.Add(i.ToString());
node.Tag = new JsonInfo() { name = item.Key.ToString(), value = item.Value.ToString() };
LoadTreeList(node1.Nodes, (JObject)JsonConvert.DeserializeObject(jar[i].ToString()));
//TreeNode new_child = new TreeNode();
//new_child.Text = jar[i].ToString();
//node.Nodes.Add(new_child);
}
}
}
catch(Exception)
{ LoadTreeList(node.Nodes, (JObject)JsonConvert.DeserializeObject(item.Value.ToString())); }
//JArray jar = JArray.Parse(item.Value.ToString());
//if (jar.Count != 0)
{
//for (int i = 0; i < jar.Count; i++)
//{
// TreeNode new_child = new TreeNode();
// new_child.Text = jar[i].ToString();
// nodes.Add(new_child);
//}
}
}
else
{
var node = nodes.Add(item.ToString());
node.Tag = new JsonInfo() { name = item.Key.ToString(), value = item.Value.ToString() };
}
}
}
private void Format(string text)
{
string json_text = text;
treeView1.Nodes.Clear();
//if (Manager.Json.IsJson(json_text))
{
try
{
textEditorControl1.Text = Manager.Json.ConvertJsonString(json_text);
textEditorControl1.Refresh();
JObject jo = null;
if (Manager.Json.IsArray(json_text))
{
var node2 = treeView1.Nodes.Add("0");
JArray jar = JArray.Parse(json_text);
ScanArray(node2.Nodes, jar);
}
else
{
jo = (JObject)JsonConvert.DeserializeObject(json_text);
Scan(treeView1.Nodes, jo);
}
void Scan(TreeNodeCollection nodes, JObject _jo)
{
IEnumerable<JProperty> properties = _jo.Properties();
foreach (JProperty item in properties)
{
if (item.Value.Type == JTokenType.Array)
{
var node2 = nodes.Add(item.Name);
node2.Tag = new JsonInfo() { name = item.Name, value = item.Value.ToString() };
JArray jar = JArray.Parse(item.Value.ToString());
ScanArray(node2.Nodes, jar);
}
else if (item.Value.Type == JTokenType.Object)
{
var node2 = nodes.Add(item.Name);
node2.Tag = new JsonInfo() { name = item.Name, value = item.Value.ToString() };
Scan(node2.Nodes, (JObject)JsonConvert.DeserializeObject(item.Value.ToString()));
}
else
{
var node = nodes.Add(item.Name + ":" + item.Value + "|" + item.Value.Type.ToString());
node.Tag = new JsonInfo() { name = item.Name, value = item.Value.ToString() };
}
//Console.WriteLine(item.Name + ":" + item.Value);
}
//var values = _jo.Values<JProperty>();
//foreach (var item in values)
//{
// var va = item.Value<JProperty>().Children.Children<JProperty>();
// var node = nodes.Add(item.ToString());
// //if(item.HasValues)
// //Scan(node.Nodes,(JObject)JsonConvert.DeserializeObject(item.ToString()));
//}
}
void ScanArray(TreeNodeCollection nodes, JArray jar)
{
if (jar != null)
{
for (int i = 0; i < jar.Count; i++)
{
var node3 = nodes.Add(i.ToString());
if (jar[i].Type == JTokenType.Object)
{
Scan(node3.Nodes, (JObject)jar[i]);
}
else
{
node3.Nodes.Add(jar[i].ToString());
node3.Tag = new JsonInfo() { name = jar[i].ToString() };
}
}
}
}
//if (Manager.Json.IsArray(json_text))
//{
// JArray jar = JArray.Parse(json_text);
// if (jar != null)
// {
// for (int i = 0; i < jar.Count; i++)
// {
// var node1 = treeView1.Nodes.Add(i.ToString());
// LoadTreeList(node1.Nodes, (JObject)JsonConvert.DeserializeObject(jar[i].ToString()));
// //TreeNode new_child = new TreeNode();
// //new_child.Text = jar[i].ToString();
// //node.Nodes.Add(new_child);
// }
// }
//}
//else
//{
// jo = (JObject)JsonConvert.DeserializeObject(json_text);
//}
//LoadTreeList(treeView1.Nodes,jo);
//for (int i = 0; i < jo.Count; i++)
//{
// treeView1.Nodes.Add(jo..ToString());
//}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
//else
//{
// MessageBox.Show("无效的Json内容", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
// textEditorControl1.Document.TextContent = json_text;
// textEditorControl1.Refresh();
//}
}
private void BtnFormat_Click(object sender, EventArgs e)
{
Format(textEditorControl1.Text);
}
public void LoadJson(string json_text)
{
textEditorControl1.Text = json_text;
textEditorControl1.Refresh();
BtnFormat.PerformClick();
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (treeView1.SelectedNode == null) { return; }
JsonInfo item = (JsonInfo)treeView1.SelectedNode.Tag;
ryCommon.RyFiles.CopyToClip(item.name);
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (treeView1.SelectedNode == null) { return; }
if (treeView1.SelectedNode.Tag == null) { return; }
JsonInfo item = (JsonInfo)treeView1.SelectedNode.Tag;
ryCommon.RyFiles.CopyToClip(item.value);
}
private void BtnPasteJson_Click(object sender, EventArgs e)
{
Format(Clipboard.GetText());
}
private void BtnCopyJson_Click(object sender, EventArgs e)
{
ryCommon.RyFiles.CopyToClip(textEditorControl1.Text);
}
private void FrmJson_Load(object sender, EventArgs e)
{
}
private void TreeView1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)//判断你点的是不是右键
{
Point ClickPoint = new Point(e.X, e.Y);
TreeNode CurrentNode = treeView1.GetNodeAt(ClickPoint);
if (CurrentNode != null)//判断你点的是不是一个节点
{
treeView1.SelectedNode = CurrentNode;//选中这个节点
}
}
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
treeView1.ExpandAll();
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
treeView1.CollapseAll();
}
private void CopyJsonByCHS_Click(object sender, EventArgs e)
{
try
{
JObject jo = (JObject)JsonConvert.DeserializeObject(textEditorControl1.Text);
var aa = Newtonsoft.Json.JsonConvert.SerializeObject(jo, new Newtonsoft.Json.JsonSerializerSettings() { StringEscapeHandling = Newtonsoft.Json.StringEscapeHandling.EscapeNonAscii });
ryCommon.RyFiles.CopyToClip(aa);
}
catch(Exception ex) {
MessageBox.Show(ex.Message, "出错", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
public class JsonInfo
{
public string name = "";
public string value = "";
}
}