From 6fd5aa462290e93a94d8bfa1f9a6f68a9c9b930f Mon Sep 17 00:00:00 2001 From: noborder Date: Fri, 12 Jan 2018 18:38:26 +0800 Subject: [PATCH] 1:add copy paste function,can copy and paste across different process 2:More universally,but more slow --- ByamlEdit/Byaml.cs | 612 +++++++++++++++---------------------- ByamlEdit/ByamlEdit.csproj | 1 + ByamlEdit/ShowNode.cs | 33 ++ 3 files changed, 275 insertions(+), 371 deletions(-) diff --git a/ByamlEdit/Byaml.cs b/ByamlEdit/Byaml.cs index afb6ac9..0cfc6d9 100644 --- a/ByamlEdit/Byaml.cs +++ b/ByamlEdit/Byaml.cs @@ -5,6 +5,7 @@ using System.Threading.Tasks; using System.IO; using System.Windows.Forms; +using Newtonsoft.Json; namespace ByamlEdit { @@ -16,6 +17,7 @@ class Byaml List values; ByamlNode tree; + #region controls TreeView treeView; ShowNode root; TreeNode nodeEdited; @@ -23,35 +25,29 @@ class Byaml TextBox SearchText; Button Search; ListView SearchResults; + + Button Copy; + Button Paste; ComboBox NewNodeType; Button NewNode; Button DeleteNode; Button ChangeType; + #endregion - - List changed_nodes; List searched_nodes; + string ClipText; - //smubin修复 - List> Parameters; - List> Translates; - List> Rotates; - // List paras; // - // List units; // + //node chache + List> nodeChaches; public Byaml(string byamlFile) { nodes = new List(); - values = new List(); + values = new List(); - //paras= new List(); - // units= new List(); - Parameters = new List>(); - Translates = new List>(); - Rotates = new List>(); + nodeChaches = new List>(); - changed_nodes = new List(); searched_nodes = new List(); var fs = new FileStream(byamlFile, FileMode.Open); @@ -103,111 +99,27 @@ public Byaml(string byamlFile) reader.Close(); } - private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) - { - if (e.Button == MouseButtons.Right) - { - e.Node.BeginEdit(); - foreach(var item in NewNodeType.Items) - { - if (((CustomItem)item).Value == ((ShowNode)e.Node).Type) - { - NewNodeType.SelectedItem = item; - } - } - } - } - - private void treeView_AfterLabelEdit(object sender, NodeLabelEditEventArgs e) - { - nodeEdited = e.Node; - e.Node.EndEdit(true); - } - - private void SaveChanged(string text,ByamlNode byamlNode) - { - switch (byamlNode.Type) - { - case ByamlNodeType.String: - if (!changed_nodes.Contains(byamlNode)) - { - changed_nodes.Add(byamlNode); - } - int value = values.IndexOf(text); - if(value!=-1) - { - ((ByamlNode.String)byamlNode).Value = value; - } - else - { - MessageBox.Show("not found in values"); - } - break; - case ByamlNodeType.Boolean: - if(!changed_nodes.Contains(byamlNode)) - { - changed_nodes.Add(byamlNode); - } - ((ByamlNode.Boolean)byamlNode).Value=bool.Parse(text); - break; - case ByamlNodeType.UInt: - if (!changed_nodes.Contains(byamlNode)) - { - changed_nodes.Add(byamlNode); - } - ((ByamlNode.Int)byamlNode).Value = UInt32.Parse(text); - break; - case ByamlNodeType.Hash: - if (!changed_nodes.Contains(byamlNode)) - { - changed_nodes.Add(byamlNode); - } - ((ByamlNode.Hash)byamlNode).Value = UInt32.Parse(text); - break; - case ByamlNodeType.Single: - if (!changed_nodes.Contains(byamlNode)) - { - changed_nodes.Add(byamlNode); - } - ((ByamlNode.Single)byamlNode).Value = float.Parse(text); - break; - case ByamlNodeType.UnamedNode: - break; - case ByamlNodeType.NamedNode: - break; - default: - throw new NotImplementedException(); - } - } - public void Show(Control control) { control.Controls.Clear(); - changed_nodes.Clear(); treeView = new TreeView(); - treeView.Width = control.Width-200; - treeView.Height = control.Height-100; + treeView.Width = control.Width - 200; + treeView.Height = control.Height - 100; treeView.LabelEdit = true; treeView.NodeMouseClick += treeView_NodeMouseClick; treeView.AfterLabelEdit += treeView_AfterLabelEdit; - Save = new Button(); - Save.Text = "Save"; - Save.Top += treeView.Top + treeView.Height + 10; - Save.Left = treeView.Right-Save.Width; - Save.Click += SaveClick; - control.Controls.Add(Save); SearchText = new TextBox(); - SearchText.Top = Save.Top; + SearchText.Top = treeView.Bottom+10; SearchText.Left = SearchText.Left; control.Controls.Add(SearchText); Search = new Button(); Search.Text = "Search"; - Search.Top = Save.Top; + Search.Top = treeView.Bottom + 10; Search.Left = SearchText.Left + SearchText.Width + 10; Search.Click += SearchClick; control.Controls.Add(Search); @@ -226,7 +138,7 @@ public void Show(Control control) //node type combox NewNodeType = new ComboBox(); - NewNodeType.Top = Search.Top; + NewNodeType.Top = treeView.Bottom + 10; NewNodeType.Left = Search.Right + 10; var item = new CustomItem(); item.Text = "UInt"; @@ -270,7 +182,7 @@ public void Show(Control control) NewNode = new Button(); NewNode.Text = "NewNode"; NewNode.Left = NewNodeType.Right + 10; - NewNode.Top = NewNodeType.Top; + NewNode.Top = treeView.Bottom + 10; NewNode.Click += NewClick; control.Controls.Add(NewNode); @@ -278,7 +190,7 @@ public void Show(Control control) DeleteNode = new Button(); DeleteNode.Text = "DeleteNode"; DeleteNode.Left = NewNode.Right + 10; - DeleteNode.Top = NewNode.Top; + DeleteNode.Top = treeView.Bottom + 10; DeleteNode.Click += DeleteClick; control.Controls.Add(DeleteNode); @@ -286,13 +198,60 @@ public void Show(Control control) ChangeType = new Button(); ChangeType.Text = "ChangType"; ChangeType.Left = DeleteNode.Right + 10; - ChangeType.Top = DeleteNode.Top; + ChangeType.Top = treeView.Bottom + 10; ChangeType.Click += ChangeTypeClick; control.Controls.Add(ChangeType); + //copy + Copy = new Button(); + Copy.Text = "Copy"; + Copy.Top += treeView.Bottom + 10; + Copy.Left = ChangeType.Right + 10; + Copy.Click += CopyClick; + control.Controls.Add(Copy); + + //paste + Paste = new Button(); + Paste.Text = "Paste"; + Paste.Top += treeView.Bottom + 10; + Paste.Left = Copy.Right + 10; + Paste.Click += PasteClick; + control.Controls.Add(Paste); + + //save + Save = new Button(); + Save.Text = "Save"; + Save.Top += treeView.Bottom + 10; + Save.Left = Paste.Right + 10; + Save.Click += SaveClick; + control.Controls.Add(Save); + + treeView.Nodes.Add(root); control.Controls.Add(treeView); - tree.Show(root,nodes,values); + tree.Show(root, nodes, values); + } + + #region Form Events Handler + private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) + { + if (e.Button == MouseButtons.Right) + { + e.Node.BeginEdit(); + foreach(var item in NewNodeType.Items) + { + if (((CustomItem)item).Value == ((ShowNode)e.Node).Type) + { + NewNodeType.SelectedItem = item; + } + } + } + } + + private void treeView_AfterLabelEdit(object sender, NodeLabelEditEventArgs e) + { + nodeEdited = e.Node; + e.Node.EndEdit(true); } private void NewClick(object sender, EventArgs e) @@ -324,14 +283,103 @@ private void ListView_Click(object sender, MouseEventArgs e) treeView.Focus(); } - private int CustomStringSort(string s1,string s2) + private void SearchClick(object sender,EventArgs e) + { + searched_nodes.Clear(); + SearchTreeView(SearchText.Text); + SearchResults.Items.Clear(); + + if(searched_nodes.Count==0) + { + MessageBox.Show("not found"); + return; + } + + int index = 0; + SearchResults.BeginUpdate(); + foreach(TreeNode treeNode in searched_nodes) + { + treeView.SelectedNode = treeNode; + treeView.Focus(); + + ListViewItem lvi = new ListViewItem(); + lvi.Text = index.ToString(); + lvi.SubItems.Add(treeNode.Text); + SearchResults.Items.Add(lvi); + + index++; + } + SearchResults.EndUpdate(); + } + + private void SearchTreeView(string text) + { + if(text!=null&&text!="") + { + foreach(TreeNode node in treeView.Nodes) + { + if(node.Text.ToLower().IndexOf(text.ToLower()) !=-1) + { + searched_nodes.Add(node); + } + } + foreach (TreeNode node in treeView.Nodes) + { + SearchTreeNode(node, text); + } + } + } + + private void SearchTreeNode(TreeNode root,string text) + { + if (text != null && text != "") + { + foreach (TreeNode node in root.Nodes) + { + if (node.Text.ToLower().IndexOf(text.ToLower()) != -1) + { + searched_nodes.Add(node); + } + } + foreach (TreeNode node in root.Nodes) + { + SearchTreeNode(node, text); + } + } + } + + private void CopyClick(object sender, EventArgs e) + { + var jsonClip=new JsonClip((ShowNode)treeView.SelectedNode); + ClipText =JsonConvert.SerializeObject(jsonClip); + Clipboard.SetDataObject(ClipText); + MessageBox.Show("copy done"); + } + + private void PasteClick(object sender, EventArgs e) + { + IDataObject iData = Clipboard.GetDataObject(); + if (iData.GetDataPresent(DataFormats.Text)) + { + ClipText=(string)iData.GetData(DataFormats.Text); + var jsonClip = JsonConvert.DeserializeObject(ClipText); + var showNode = new ShowNode(jsonClip); + treeView.SelectedNode.Nodes.Add(showNode); + treeView.SelectedNode = showNode; + treeView.Focus(); + } + } + #endregion + + #region byamlWriter + private int CustomStringSort(string s1, string s2) { bool longer = s1.Length > s2.Length; - bool lenEqual= s1.Length == s2.Length; - int len = longer? s2.Length : s1.Length; - for(int i=0;i="a".ToArray()[0]&& s2[i] >= "a".ToArray()[0]) + if (s1[i] >= "a".ToArray()[0] && s2[i] >= "a".ToArray()[0]) { if (s1[i] >= "A".ToArray()[0] && s2[i] < "A".ToArray()[0]) { @@ -344,21 +392,21 @@ private int CustomStringSort(string s1,string s2) } - if (s1[i]>s2[i]) + if (s1[i] > s2[i]) { return 1; } - else if(s1[i] list) { int count = 0; int length = 0; - foreach(var str in list) + foreach (var str in list) { - length += str.Length+1; + length += str.Length + 1; count++; } - if(length%4!=0) + if (length % 4 != 0) { count++; } @@ -449,20 +493,19 @@ private int CalCount(List list) return count; } - - private bool TreeNodeCmp(TreeNode n1,TreeNode n2) + private bool TreeNodeCmp(TreeNode n1, TreeNode n2) { - if (n1.Text == n2.Text&&n1.Nodes.Count==n2.Nodes.Count) + if (n1.Text == n2.Text && n1.Nodes.Count == n2.Nodes.Count) { - if(n1.Nodes.Count==0) + if (n1.Nodes.Count == 0) { return true; } else { - for(int i=0;i< n1.Nodes.Count;++i) + for (int i = 0; i < n1.Nodes.Count; ++i) { - if(!TreeNodeCmp(n1.Nodes[i],n2.Nodes[i])) + if (!TreeNodeCmp(n1.Nodes[i], n2.Nodes[i])) { return false; } @@ -476,10 +519,14 @@ private bool TreeNodeCmp(TreeNode n1,TreeNode n2) } } - private void WriteByamlNodes(ShowNode root,int offset,EndianBinaryWriter writer) + private void WriteByamlNodes(ShowNode root, int offset, EndianBinaryWriter writer) { writer.BaseStream.Seek(offset, SeekOrigin.Begin); + bool Existed = false; + int existedOffset = 0; + + int value = 0; int p0 = 0; int p1 = 0; @@ -501,8 +548,8 @@ private void WriteByamlNodes(ShowNode root,int offset,EndianBinaryWriter writer) lenght++; } p1 = (int)writer.BaseStream.Position + lenght; - p2= p1 + 4* root.Nodes.Count; - + p2 = p1 + 4 * root.Nodes.Count; + foreach (ShowNode node in root.Nodes) { //写入类型 @@ -541,13 +588,36 @@ private void WriteByamlNodes(ShowNode root,int offset,EndianBinaryWriter writer) break; case ByamlNodeType.UnamedNode: case ByamlNodeType.NamedNode: - //写入节点地址 - writer.BaseStream.Seek(p1, SeekOrigin.Begin); - writer.Write(p2); - p1 = (int)writer.BaseStream.Position; - writer.BaseStream.Seek(p2, SeekOrigin.Begin); - WriteByamlNodes(node, p2, writer); - p2 = (int)writer.BaseStream.Position; + Existed = false; + foreach (var item in nodeChaches) + { + if (TreeNodeCmp(item.Value, node)) + { + Existed = true; + existedOffset = item.Key; + } + } + if (Existed) + { + //写入节点地址 + writer.BaseStream.Seek(p1, SeekOrigin.Begin); + writer.Write(existedOffset); + p1 = (int)writer.BaseStream.Position; + } + else + { + nodeChaches.Add(new KeyValuePair(p2, node)); + + //写入节点地址 + writer.BaseStream.Seek(p1, SeekOrigin.Begin); + writer.Write(p2); + p1 = (int)writer.BaseStream.Position; + + //写入节点数据 + writer.BaseStream.Seek(p2, SeekOrigin.Begin); + WriteByamlNodes(node, p2, writer); + p2 = (int)writer.BaseStream.Position; + } break; default: throw new NotImplementedException(); @@ -560,106 +630,11 @@ private void WriteByamlNodes(ShowNode root,int offset,EndianBinaryWriter writer) //写入头部 value = 0xc1 << 24 | root.Nodes.Count; writer.Write(value); - + //p0:节点基本信息区域写入偏移 p1:节点实例写入区域区域偏移 p0 = (int)writer.BaseStream.Position; p1 = (int)writer.BaseStream.Position + 8 * root.Nodes.Count; - //判断是否已经存在!parameters - - //int paraOffset = 0; - // string unitName=null; - bool hasParameters = false; - bool hasTranslate = false; - bool hasRotate = false; - TreeNode paraNode = null; - TreeNode transNode = null; - TreeNode RotateNode = null; - foreach (ShowNode node in root.Nodes) - { - if (node.Text.ToLower() == "!Parameters".ToLower()) - { - hasParameters = true; - paraNode = node; - } - if (node.Text.ToLower() == "Translate".ToLower()) - { - hasTranslate = true; - transNode = node; - } - if (node.Text.ToLower() == "Rotate".ToLower()) - { - hasRotate = true; - RotateNode = node; - } - } - - bool paraExist = false; - int paraOffset = 0; - if (hasParameters) - { - foreach(var item in Parameters) - { - if(TreeNodeCmp(item.Value,paraNode)) - { - paraExist = true; - paraOffset = item.Key; - } - } - } - - bool transExist = false; - int transOffset = 0; - if (hasTranslate) - { - foreach (var item in Translates) - { - if (TreeNodeCmp(item.Value, transNode)) - { - transExist = true; - transOffset = item.Key; - } - } - } - - bool RotateExist = false; - int RotateOffset = 0; - if (hasRotate) - { - foreach (var item in Rotates) - { - if (TreeNodeCmp(item.Value,RotateNode)) - { - RotateExist = true; - RotateOffset = item.Key; - } - } - } - - /* - if(needCheck) - { - foreach (ShowNode node in root.Nodes) - { - if (node.Text.ToLower() == "UnitConfigName".ToLower()) - { - int index = 0; - unitName = node.Nodes[0].Text; - foreach (var unit in units) - { - int len = unit.Length > unitName.Length ? unitName.Length / 2 : unit.Length / 2; - if (unit.Substring(0, len)==unitName.Substring(0, len)) - { - paraExist = true; - paraOffset = paras[index]; - break; - } - index++; - } - } - } - } - */ foreach (ShowNode node in root.Nodes) { @@ -692,66 +667,25 @@ private void WriteByamlNodes(ShowNode root,int offset,EndianBinaryWriter writer) break; case ByamlNodeType.UnamedNode: case ByamlNodeType.NamedNode: - if(node.Text.ToLower() == "!Parameters".ToLower()) + Existed = false; + foreach (var item in nodeChaches) { - if(paraExist) - { - //写入节点的实例地址 - writer.Write(paraOffset); - p0 = (int)writer.BaseStream.Position; - } - else - { - Parameters.Add(new KeyValuePair(p1,node)); - - //写入节点的实例地址 - writer.Write(p1); - p0 = (int)writer.BaseStream.Position; - //写入节点实例 - WriteByamlNodes(node, p1, writer); - p1 = (int)writer.BaseStream.Position; - } - } - else if (node.Text.ToLower() == "Translate".ToLower()) - { - if (transExist) - { - //写入节点的实例地址 - writer.Write(transOffset); - p0 = (int)writer.BaseStream.Position; - } - else + if (TreeNodeCmp(item.Value, node)) { - Translates.Add(new KeyValuePair(p1, node)); - //写入节点的实例地址 - writer.Write(p1); - p0 = (int)writer.BaseStream.Position; - //写入节点实例 - WriteByamlNodes(node, p1, writer); - p1 = (int)writer.BaseStream.Position; + Existed = true; + existedOffset = item.Key; } } - else if (node.Text.ToLower() == "Rotate".ToLower()) + if (Existed) { - if (RotateExist) - { - //写入节点的实例地址 - writer.Write(transOffset); - p0 = (int)writer.BaseStream.Position; - } - else - { - Rotates.Add(new KeyValuePair(p1, node)); - //写入节点的实例地址 - writer.Write(p1); - p0 = (int)writer.BaseStream.Position; - //写入节点实例 - WriteByamlNodes(node, p1, writer); - p1 = (int)writer.BaseStream.Position; - } + //写入节点的实例地址 + writer.Write(existedOffset); + p0 = (int)writer.BaseStream.Position; } else { + nodeChaches.Add(new KeyValuePair(p1, node)); + //写入节点的实例地址 writer.Write(p1); p0 = (int)writer.BaseStream.Position; @@ -772,7 +706,7 @@ private void WriteByamlNodes(ShowNode root,int offset,EndianBinaryWriter writer) } } - private void WriteStringList(long offset,List strList,EndianBinaryWriter writer) + private void WriteStringList(long offset, List strList, EndianBinaryWriter writer) { int strsAddressPtr = 0; int strsStrPtr = 0; @@ -781,10 +715,10 @@ private void WriteStringList(long offset,List strList,EndianBinaryWriter int value = 0xc2 << 24 | strList.Count; writer.Write(value); strsAddressPtr = (int)writer.BaseStream.Position; - strsStrPtr = (int)writer.BaseStream.Position + 4 * (strList.Count+1); + strsStrPtr = (int)writer.BaseStream.Position + 4 * (strList.Count + 1); - - for (int i=0;i strList,EndianBinaryWriter //写入字符串 writer.BaseStream.Seek(strsStrPtr, SeekOrigin.Begin); - WriteString(writer,strList[i]); + WriteString(writer, strList[i]); writer.Write((byte)0); strsStrPtr = (int)writer.BaseStream.Position; } //写入字符串的结尾地址 writer.BaseStream.Seek(strsAddressPtr, SeekOrigin.Begin); - writer.Write(strsStrPtr-(int)offset); - + writer.Write(strsStrPtr - (int)offset); + //填充字符串长度到4的倍数 writer.BaseStream.Seek(strsStrPtr, SeekOrigin.Begin); - while(writer.BaseStream.Position%4!=0) + while (writer.BaseStream.Position % 4 != 0) { writer.Write((byte)0); } } - private void SaveTreeToFile(ShowNode rootNode,EndianBinaryWriter writer) + private void SaveTreeToFile(ShowNode rootNode, EndianBinaryWriter writer) { long headerPtr = 0; //writer magic - WriteString(writer,"BY"); + WriteString(writer, "BY"); //version writer.Write((UInt16)0x0002); headerPtr = writer.BaseStream.Position; @@ -835,70 +769,6 @@ private void SaveTreeToFile(ShowNode rootNode,EndianBinaryWriter writer) writer.Write(treeOffset); WriteByamlNodes(rootNode, treeOffset, writer); } - - private void SearchClick(object sender,EventArgs e) - { - searched_nodes.Clear(); - SearchTreeView(SearchText.Text); - SearchResults.Items.Clear(); - - if(searched_nodes.Count==0) - { - MessageBox.Show("not found"); - return; - } - - int index = 0; - SearchResults.BeginUpdate(); - foreach(TreeNode treeNode in searched_nodes) - { - treeView.SelectedNode = treeNode; - treeView.Focus(); - - ListViewItem lvi = new ListViewItem(); - lvi.Text = index.ToString(); - lvi.SubItems.Add(treeNode.Text); - SearchResults.Items.Add(lvi); - - index++; - } - SearchResults.EndUpdate(); - } - - private void SearchTreeView(string text) - { - if(text!=null&&text!="") - { - foreach(TreeNode node in treeView.Nodes) - { - if(node.Text.ToLower().IndexOf(text.ToLower()) !=-1) - { - searched_nodes.Add(node); - } - } - foreach (TreeNode node in treeView.Nodes) - { - SearchTreeNode(node, text); - } - } - } - - private void SearchTreeNode(TreeNode root,string text) - { - if (text != null && text != "") - { - foreach (TreeNode node in root.Nodes) - { - if (node.Text.ToLower().IndexOf(text.ToLower()) != -1) - { - searched_nodes.Add(node); - } - } - foreach (TreeNode node in root.Nodes) - { - SearchTreeNode(node, text); - } - } - } + #endregion } } diff --git a/ByamlEdit/ByamlEdit.csproj b/ByamlEdit/ByamlEdit.csproj index 94b91fb..9d59e6b 100644 --- a/ByamlEdit/ByamlEdit.csproj +++ b/ByamlEdit/ByamlEdit.csproj @@ -33,6 +33,7 @@ 4 + diff --git a/ByamlEdit/ShowNode.cs b/ByamlEdit/ShowNode.cs index 3901164..0402f9d 100644 --- a/ByamlEdit/ShowNode.cs +++ b/ByamlEdit/ShowNode.cs @@ -15,5 +15,38 @@ public ShowNode(string text):base(text) { } + + public ShowNode(JsonClip jsonClip) : base(jsonClip.Text) + { + Type = jsonClip.Type; + + foreach(var item in jsonClip.childs) + { + Nodes.Add(new ShowNode(item)); + } + } + } + + class JsonClip + { + public ByamlNodeType Type; + public string Text; + public List childs; + + public JsonClip(ShowNode sNode) + { + childs = new List(); + Type = sNode.Type; + Text =sNode.Text; + foreach (var node in sNode.Nodes) + { + childs.Add(new JsonClip((ShowNode)node)); + } + } + + public JsonClip() + { + childs = new List(); + } } }