private void UpdateCloneVisualizations() { foreach (DataGridViewRow row in dataGridView.Rows) { CloneIntersectedItem cloneIntersectedItem = (CloneIntersectedItem)row.Tag; Bitmap oldBitmap = (Bitmap)row.Cells[2].Value; if (oldBitmap != null) { oldBitmap.Dispose(); } row.Cells[2].Value = GetCloneOverviewBitmap(cloneIntersectedItem); } }
private Bitmap GetCloneOverviewBitmap(CloneIntersectedItem cloneIntersectedItem) { Bitmap bitmap = new Bitmap(dataGridView.Columns[2].Width, GetBoxHeight()); Rectangle bounds = new Rectangle(0, 0, bitmap.Width - 1, bitmap.Height - 1); using (Graphics graphics = Graphics.FromImage(bitmap)) { int linesOfCode = cloneIntersectedItem.SourceNode.LinesOfCode; 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); foreach (CloneIntersection cloneIntersection in cloneIntersectedItem.Clones) { Rectangle cloneRect = new Rectangle(); cloneRect.X = (int)Math.Floor(bounds.X + (double)cloneIntersection.Clone.StartLine / linesOfCode * totalWidth); cloneRect.Width = (int)Math.Floor((double)cloneIntersection.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; } Brush brush = GetCloneIntersectonBrush(cloneIntersection); graphics.FillRectangle(brush, cloneRect); } graphics.DrawRectangle(Pens.Black, backgroundRect); } return(bitmap); }
private void UpdateContextMenu(ContextMenuStrip contextMenu, CloneIntersectedItem cloneIntersectedItem) { contextMenu.Items.Clear(); if (cloneIntersectedItem == null) { return; } List <CloneIntersection> clones = new List <CloneIntersection>(cloneIntersectedItem.Clones); clones.Sort(delegate(CloneIntersection x, CloneIntersection y) { int result = x.Clone.StartLine.CompareTo(y.Clone.StartLine); if (result == 0) { result = x.Clone.LineCount.CompareTo(y.Clone.LineCount); } return(result); }); Dictionary <CloneClass, Bitmap> cloneClassBitmaps = new Dictionary <CloneClass, Bitmap>(); foreach (CloneIntersection cloneIntersection in clones) { CloneClass cloneClass = cloneIntersection.Clone.CloneClass; Bitmap cloneClassBitmap; if (!cloneClassBitmaps.TryGetValue(cloneClass, out cloneClassBitmap)) { cloneClassBitmap = new Bitmap(16, 16, PixelFormat.Format32bppArgb); using (Graphics g = Graphics.FromImage(cloneClassBitmap)) { int height = GetBoxHeight() - 1; int width = cloneClassBitmap.Width - 1; int top = (int)Math.Floor(cloneClassBitmap.Height / 2.0 - height / 2.0); Rectangle rectangle = new Rectangle(0, top, width, height); Brush brush = GetCloneIntersectonBrush(cloneIntersection); g.FillRectangle(brush, rectangle); g.DrawRectangle(Pens.Black, rectangle); } cloneClassBitmaps.Add(cloneClass, cloneClassBitmap); } ToolStripMenuItem cloneItem = new ToolStripMenuItem(); cloneItem.Text = FormattingHelper.FormatCloneForMenu(cloneIntersection.Clone); cloneItem.Image = cloneClassBitmap; contextMenu.Items.Add(cloneItem); ToolStripMenuItem openInEditorItem = new ToolStripMenuItem(); openInEditorItem.Text = Res.MenuOpenInEditor; openInEditorItem.Tag = cloneIntersection.Clone; openInEditorItem.Click += openInEditorToolStripItem_Click; cloneItem.DropDownItems.Add(openInEditorItem); ToolStripMenuItem findAllOccurencesItem = new ToolStripMenuItem(); findAllOccurencesItem.Text = Res.MenuFindAllOccurrences; findAllOccurencesItem.Tag = cloneIntersection.Clone; findAllOccurencesItem.Click += findAllOccurencesToolStripItem_Click; cloneItem.DropDownItems.Add(findAllOccurencesItem); } }
public CloneIntersectionSummary(CloneIntersectedItem cloneIntersectedItem) { _cloneIntersectedItem = cloneIntersectedItem; }