private CloneGroup CreateCloneGroup(XElement cloneGroupElement) { var cg = new CloneGroup(); cloneGroupElement .Descendants("CloneItem") .ToList() .ForEach(ci => { cg.AddItem(ci.Value, ci.Attribute("Size") == null ? 0 : Convert.ToInt64(ci.Attribute("Size").Value)); }); return(cg); }
private void UpdateCloneVisualizations() { foreach (DataGridViewRow row in dataGridView.Rows) { CloneGroup cloneGroup = (CloneGroup)row.Tag; Bitmap oldBitmap = (Bitmap)row.Cells[2].Value; if (oldBitmap != null) { oldBitmap.Dispose(); } row.Cells[2].Value = GetCloneOverviewBitmap(cloneGroup); } }
private object GetCloneOverviewBitmap(CloneGroup group) { Bitmap bitmap = new Bitmap(dataGridView.Columns[2].Width, 10); Rectangle bounds = new Rectangle(0, 0, bitmap.Width - 1, bitmap.Height - 1); using (Graphics graphics = Graphics.FromImage(bitmap)) { int linesOfCode = GetLinesOfCode(group.SourceFile); int totalWidth = (int)Math.Floor((double)(bounds.Width - 1) / _maximumLoc * linesOfCode); Rectangle backgroundRect = new Rectangle(); backgroundRect.X = bounds.X; backgroundRect.Y = bounds.Top; backgroundRect.Width = totalWidth - 1; backgroundRect.Height = bounds.Height - 1; graphics.FillRectangle(Brushes.LightGray, backgroundRect); // TODO: Use same color as marker Brush brush = Brushes.Purple; foreach (Clone clone in group.Clones) { Rectangle cloneRect = new Rectangle(); cloneRect.X = (int)Math.Floor(bounds.X + (double)clone.StartLine / linesOfCode * totalWidth); cloneRect.Width = (int)Math.Floor((double)clone.LineCount / linesOfCode * totalWidth); cloneRect.Y = bounds.Top; cloneRect.Height = bounds.Height; if (cloneRect.Right > bounds.X + totalWidth) { cloneRect.Width = bounds.X + totalWidth - cloneRect.X; } graphics.FillRectangle(brush, cloneRect); } graphics.DrawRectangle(Pens.Black, backgroundRect); } return(bitmap); }
private void LoadClones() { _maximumLoc = Int32.MinValue; List <CloneGroup> cloneGroups = new List <CloneGroup>(); Dictionary <SourceFile, CloneGroup> cloneGroupDictionary = new Dictionary <SourceFile, CloneGroup>(); foreach (Clone clone in _cloneClass.Clones) { CloneGroup cloneGroup; if (!cloneGroupDictionary.TryGetValue(clone.SourceFile, out cloneGroup)) { _maximumLoc = Math.Max(_maximumLoc, GetLinesOfCode(clone.SourceFile)); cloneGroup = new CloneGroup(); cloneGroup.SourceFile = clone.SourceFile; cloneGroupDictionary.Add(cloneGroup.SourceFile, cloneGroup); cloneGroups.Add(cloneGroup); } cloneGroup.Clones.Add(clone); } dataGridView.Rows.Clear(); foreach (CloneGroup cloneGroup in cloneGroups) { DataGridViewRow row = new DataGridViewRow(); row.CreateCells(dataGridView); row.Cells[0].Value = Path.GetFileName(cloneGroup.SourceFile.Path); row.Cells[1].Value = cloneGroup.Clones.Count; row.Cells[2].Value = GetCloneOverviewBitmap(cloneGroup); row.Tag = cloneGroup; dataGridView.Rows.Add(row); } dataGridView.Sort(dataGridView.SortedColumn, GetSortDirectionFromSortOrder(dataGridView.SortOrder)); }