예제 #1
0
        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);
            }
        }
예제 #2
0
        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);
        }
예제 #3
0
        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);
            }
        }
예제 #4
0
 public CloneIntersectionSummary(CloneIntersectedItem cloneIntersectedItem)
 {
     _cloneIntersectedItem = cloneIntersectedItem;
 }