Exemple #1
0
        /// <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();
        }
Exemple #3
0
        /// <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();
        }