/// <summary> /// 显示两段克隆代码diff的结果(行号从startline开始)(与showFileDiff唯一区别) /// </summary> /// <param name="info1">输入参数为CloneSourceInfo对象</param> /// <param name="info2"></param> /// <param name="diffInfo"></param> internal void ShowCloneFragmentDiff(CloneSourceInfo info1, CloneSourceInfo info2, Diff.DiffInfo diffInfo) { this.label1.Text = Global.mainForm.subSysDirectory + "\\" + info1.sourcePath; this.label2.Text = Global.mainForm.subSysDirectory + "\\" + info2.sourcePath; int lineNo1 = info1.startLine - 1; int lineNo2 = info2.startLine - 1; this.richTextBox1.Text = ""; this.richTextBox3.Text = ""; foreach (Object item in diffInfo) { if (item is string) //相同的行 { lineNo1++; this.richTextBox1.SelectionColor = Color.Black; this.richTextBox1.AppendText(lineNo1.ToString() + "\r\n");//构建file1行号字符串 this.richTextBox3.SelectionColor = Color.Black; this.richTextBox3.AppendText((string)item + "\r\n"); //构建file1内容字符串 lineNo2++; this.richTextBox2.SelectionColor = Color.Black; this.richTextBox2.AppendText(lineNo2.ToString() + "\r\n");//构建file2行号字符串 this.richTextBox4.SelectionColor = Color.Black; this.richTextBox4.AppendText((string)item + "\r\n"); //构建file2内容字符串 } else//冲突的行 { if (((Diff.ConfictItem)item).contentA != null) { foreach (string line in ((Diff.ConfictItem)item).contentA) { lineNo1++; this.richTextBox1.SelectionColor = Color.Red; this.richTextBox1.SelectionBackColor = Color.LightYellow; this.richTextBox1.AppendText(lineNo1.ToString() + "\r\n"); this.richTextBox3.SelectionColor = Color.Red; //设定新增行颜色为红色(冲突行用红色显示) this.richTextBox3.SelectionBackColor = Color.LightYellow; //this.richTextBox3.SelectionFont = FontStyle.Bold; //设定新增行加粗 this.richTextBox3.AppendText(line + "\r\n"); } } if (((Diff.ConfictItem)item).contentB != null) { foreach (string line in ((Diff.ConfictItem)item).contentB) { lineNo2++; this.richTextBox2.SelectionColor = Color.Red; //设定新增行颜色为红色 this.richTextBox2.SelectionBackColor = Color.LightYellow; this.richTextBox2.AppendText(lineNo2.ToString() + "\r\n"); //this.richTextBox4.ForeColor = Color.Red; this.richTextBox4.SelectionColor = Color.Red; this.richTextBox4.SelectionBackColor = Color.LightYellow; this.richTextBox4.AppendText(line + "\r\n"); } } } } this.Show(); }
public void Confirm(List <string> SrcFragmentlist) { List <XmlElement> dest_xml = new List <XmlElement>(); //string[] fileList = System.IO.Directory.GetFileSystemEntries(Global.mainForm._folderPath + @"\blocks\"); List <String> fileList = new List <String>(); DirectoryInfo dir = new DirectoryInfo(Global.mainForm._folderPath + @"\blocks\"); FileInfo[] genFiles = dir.GetFiles(); foreach (FileInfo info in genFiles) { if ((info.Attributes & FileAttributes.Hidden) != 0) //不处理隐藏文件 { continue; } else { fileList.Add(info.Name); } } for (int i = 0; i < fileList.Count(); i++) { XmlDocument crd_Xml = new XmlDocument(); crd_Xml.Load(Global.mainForm._folderPath + @"\blocks\" + fileList[i]); foreach (XmlElement classNode in crd_Xml.DocumentElement.SelectNodes("class")) { List <string> fullSource = new List <string>(); string sourcePath = ((XmlElement)classNode.ChildNodes[0]).GetAttribute("file"); //获取目标系统文件夹起始路径 string subSysStartPath = Global.mainForm.subSysDirectory; //绝对路径=起始路径+相对路径 string subSysPath = subSysStartPath + "\\" + sourcePath; //获得源文件代码 fullSource = Global.GetFileContent(subSysPath); //提取对应行号的代码片段 List <string> DestFragment = new List <string>(); int startLine = int.Parse(((XmlElement)classNode.ChildNodes[0]).GetAttribute("startline")); int endLine = int.Parse(((XmlElement)classNode.ChildNodes[0]).GetAttribute("endline")); for (int j = startLine - 1; j < endLine; j++) //注意,索引从0起算,而行号从1起算 { DestFragment.Add(fullSource[j]); } //使用Diff类计算两段代码的相似度 Diff.UseDefaultStrSimTh(); //使用行相似度阈值默认值0.5 Diff.DiffInfo diffFile = Diff.DiffFiles(SrcFragmentlist, DestFragment); float sim = Diff.FileSimilarity(diffFile, SrcFragmentlist.Count, DestFragment.Count, true); //判断相似度sim,超过阈值0.5即为候选克隆代码 if (sim >= 0.5) { dest_xml.Add(classNode); } } } Global.mainForm.tabControl1.TabPages.Add("result");//创建新的tabPage,显示文件名 Global.mainForm.tabControl1.SelectedTab = Global.mainForm.tabControl1.TabPages[Global.mainForm.tabControl1.TabPages.Count - 1]; //创建TreeView控件 TreeView newTreeView = new TreeView(); Global.mainForm.tabControl1.TabPages[Global.mainForm.tabControl1.TabPages.Count - 1].Controls.Add(newTreeView); newTreeView.Dock = DockStyle.Fill; if (dest_xml.Count == 0) { MessageBox.Show("No match"); } else { ShowXml(dest_xml, ref newTreeView); } newTreeView.NodeMouseClick += new TreeNodeMouseClickEventHandler(Global.mainForm.newTreeView_NodeMouseClick1); //添加预定义的上下文菜单 newTreeView.ContextMenuStrip = Global.mainForm.contextMenuStrip3; //Global.mainForm.contextMenuStrip3.Items[0].Enabled = true; //ViewCloneFragment项 //Global.mainForm.contextMenuStrip3.Items[1].Enabled = true; //ViewFullCode项 //Global.mainForm.contextMenuStrip3.Items[2].Enabled = true; //ViewSourceDiff项 newTreeView.ExpandAll(); this.Close(); }
/// <summary> /// 显示两个完整文件diff的结果(行号从1开始) /// </summary> /// <param name="file1"></param> /// <param name="file2"></param> /// <param name="diffInfo"></param> public void ShowFileDiff(string file1, string file2, Diff.DiffInfo diffInfo) { this.label1.Text = file1; this.label2.Text = file2; int lineNo1 = 0; int lineNo2 = 0; this.richTextBox1.Text = ""; this.richTextBox3.Text = ""; foreach (Object item in diffInfo) { if (item is string) //相同的行 { lineNo1++; this.richTextBox1.SelectionColor = Color.Black; this.richTextBox1.AppendText(lineNo1.ToString() + "\r\n");//构建file1行号字符串 this.richTextBox3.SelectionColor = Color.Black; this.richTextBox3.AppendText((string)item + "\r\n"); //构建file1内容字符串 lineNo2++; this.richTextBox2.SelectionColor = Color.Black; this.richTextBox2.AppendText(lineNo2.ToString() + "\r\n");//构建file2行号字符串 this.richTextBox4.SelectionColor = Color.Black; this.richTextBox4.AppendText((string)item + "\r\n"); //构建file2内容字符串 } else//冲突的行 { if (((Diff.ConfictItem)item).contentA != null) { foreach (string line in ((Diff.ConfictItem)item).contentA) { lineNo1++; this.richTextBox1.SelectionColor = Color.Red; this.richTextBox1.SelectionBackColor = Color.LightYellow; this.richTextBox1.AppendText(lineNo1.ToString() + "\r\n"); this.richTextBox3.SelectionColor = Color.Red; //设定新增行颜色为红色(冲突行用红色显示) this.richTextBox3.SelectionBackColor = Color.LightYellow; //this.richTextBox3.SelectionFont = FontStyle.Bold; //设定新增行加粗 this.richTextBox3.AppendText(line + "\r\n"); } } if (((Diff.ConfictItem)item).contentB != null) { foreach (string line in ((Diff.ConfictItem)item).contentB) { lineNo2++; this.richTextBox2.SelectionColor = Color.Red; //设定新增行颜色为红色 this.richTextBox2.SelectionBackColor = Color.LightYellow; this.richTextBox2.AppendText(lineNo2.ToString() + "\r\n"); //this.richTextBox4.ForeColor = Color.Red; this.richTextBox4.SelectionColor = Color.Red; this.richTextBox4.SelectionBackColor = Color.LightYellow; this.richTextBox4.AppendText(line + "\r\n"); } } } } this.Show(); }