예제 #1
0
        protected IEnumerator <object> FinishShowingTooltip(
            Point mouseLocation,
            HeapSnapshot.Heap heap,
            HeapSnapshot.Allocation allocation,
            HeapSnapshot.Traceback rawTraceback
            )
        {
            var uniqueRawFrames = rawTraceback.Frames.AsEnumerable().Distinct();

            var fSymbols = Instance.Database.SymbolCache.Select(uniqueRawFrames);

            using (fSymbols)
                yield return(fSymbols);

            var symbolDict = SequenceUtils.ToDictionary(
                uniqueRawFrames, fSymbols.Result
                );

            var tracebackInfo = HeapRecording.ConstructTracebackInfo(
                rawTraceback.ID, rawTraceback.Frames, symbolDict
                );

            var renderParams = new DeltaInfo.RenderParams {
                BackgroundBrush = new SolidBrush(SystemColors.Info),
                BackgroundColor = SystemColors.Info,
                TextBrush       = new SolidBrush(SystemColors.InfoText),
                IsExpanded      = true,
                IsSelected      = false,
                Font            = Font,
                ShadeBrush      = new SolidBrush(Color.FromArgb(31, 0, 0, 0)),
                StringFormat    = CustomTooltip.GetDefaultStringFormat()
            };

            var content = new HeapSnapshot.AllocationTooltipContent(
                ref allocation, ref tracebackInfo, ref renderParams
                )
            {
                Location = mouseLocation,
                Font     = Font
            };

            using (var g = CreateGraphics())
                CustomTooltip.FitContentOnScreen(
                    g, content,
                    ref content.RenderParams.Font,
                    ref content.Location, ref content.Size
                    );

            Tooltip.SetContent(content);
        }
예제 #2
0
        protected IEnumerator<object> FinishShowingTooltip(
            Point mouseLocation,
            HeapSnapshot.Heap heap, 
            HeapSnapshot.Allocation allocation, 
            HeapSnapshot.Traceback rawTraceback
        )
        {
            var uniqueRawFrames = rawTraceback.Frames.AsEnumerable().Distinct();

            var fSymbols = Instance.Database.SymbolCache.Select(uniqueRawFrames);
            using (fSymbols)
                yield return fSymbols;

            var symbolDict = SequenceUtils.ToDictionary(
                uniqueRawFrames, fSymbols.Result
            );

            var tracebackInfo = HeapRecording.ConstructTracebackInfo(
                rawTraceback.ID, rawTraceback.Frames, symbolDict
            );

            var renderParams = new DeltaInfo.RenderParams {
                BackgroundBrush = new SolidBrush(SystemColors.Info),
                BackgroundColor = SystemColors.Info,
                TextBrush = new SolidBrush(SystemColors.InfoText),
                IsExpanded = true,
                IsSelected = false,
                Font = Font,
                ShadeBrush = new SolidBrush(Color.FromArgb(31, 0, 0, 0)),
                StringFormat = CustomTooltip.GetDefaultStringFormat()
            };

            var content = new HeapSnapshot.AllocationTooltipContent(
                ref allocation, ref tracebackInfo, ref renderParams
            ) {
                Location = mouseLocation,
                Font = Font
            };

            using (var g = CreateGraphics())
                CustomTooltip.FitContentOnScreen(
                    g, content,
                    ref content.RenderParams.Font,
                    ref content.Location, ref content.Size
                );

            Tooltip.SetContent(content);
        }
예제 #3
0
        protected override void OnPaint(PaintEventArgs e)
        {
            bool retrying = false, selectedItemVisible = false;
            int minVisibleIndex = int.MaxValue,  maxVisibleIndex = int.MinValue;
            var width = ClientSize.Width - ScrollBar.Width;

            retryFromHere:

            if (_SelectedIndex >= Items.Count)
                _SelectedIndex = Items.Count - 1;
            if (_SelectedIndex < 0)
                _SelectedIndex = 0;

            if (_ScrollOffset >= Items.Count)
                _ScrollOffset = Items.Count - 1;
            if (_ScrollOffset < 0)
                _ScrollOffset = 0;

            VisibleItems.Clear();

            ItemData data;

            using (var sf = new StringFormat {
                Alignment = StringAlignment.Near,
                LineAlignment = StringAlignment.Near,
                FormatFlags = StringFormatFlags.FitBlackBox | StringFormatFlags.NoWrap |
                    StringFormatFlags.DisplayFormatControl | StringFormatFlags.MeasureTrailingSpaces,
                HotkeyPrefix = System.Drawing.Text.HotkeyPrefix.None,
                Trimming = StringTrimming.None
            })
            using (var shadeBrush = new SolidBrush(Color.FromArgb(31, 0, 0, 0)))
            using (var elideBackgroundBrush = new SolidBrush(Color.FromArgb(192, SystemColors.Window)))
            using (var elideTextBrush = new SolidBrush(Color.FromArgb(220, SystemColors.WindowText)))
            using (var backgroundBrush = new SolidBrush(BackColor))
            using (var textBrush = new SolidBrush(ForeColor))
            using (var highlightBrush = new SolidBrush(SystemColors.Highlight))
            using (var highlightTextBrush = new SolidBrush(SystemColors.HighlightText)) {
                var lineHeight = e.Graphics.MeasureString("AaBbYyZz", Font, width, sf).Height;
                CollapsedSize = (int)Math.Ceiling(lineHeight * 3);

                var renderParams = new DeltaInfo.RenderParams {
                    Font = Font,
                    FunctionFilter = FunctionFilter,
                    FunctionHighlightBrush = highlightBrush,
                    FunctionHighlightTextBrush = highlightTextBrush,
                    ElideBackgroundBrush = elideBackgroundBrush,
                    ElideTextBrush = elideTextBrush,
                    ShadeBrush = shadeBrush,
                    StringFormat = sf,
                };

                int y = 0;
                for (int i = _ScrollOffset; (i < Items.Count) && (y < ClientSize.Height); i++) {
                    var y1 = y;
                    var selected = (i == SelectedIndex);

                    var item = Items[i];
                    GetItemData(i, out data);

                    var rgn = new Rectangle(
                        0, y, width,
                        data.Expanded ?
                            (int)Math.Ceiling(lineHeight * (item.Traceback.Frames.Count + 1)) :
                            CollapsedSize
                    );

                    using (var scratch = Scratch.Get(e.Graphics, rgn)) {
                        var g = scratch.Graphics;

                        g.ResetClip();
                        g.Clear(selected ? highlightBrush.Color : backgroundBrush.Color);

                        renderParams.BackgroundColor = selected ? highlightBrush.Color : backgroundBrush.Color;
                        renderParams.BackgroundBrush = selected ? highlightBrush : backgroundBrush;
                        renderParams.TextBrush = selected ? highlightTextBrush : textBrush;

                        renderParams.ContentRegion = rgn;
                        renderParams.IsExpanded = data.Expanded;
                        renderParams.IsSelected = selected;

                        y += (int)Math.Ceiling(item.Render(g, ref renderParams));
                    }

                    VisibleItems.Add(new VisibleItem {
                        Y1 = y1, Y2 = y, Index = i
                    });

                    if ((y1 >= 0) && (y < ClientSize.Height) || ((y - y1) >= ClientSize.Height)) {
                        minVisibleIndex = Math.Min(minVisibleIndex, i);
                        maxVisibleIndex = Math.Max(maxVisibleIndex, i);
                        selectedItemVisible |= selected;
                    }
                }

                if (y < ClientSize.Height)
                    e.Graphics.FillRectangle(backgroundBrush, new Rectangle(0, y, ClientSize.Width, ClientSize.Height - y));
            }

            if (!selectedItemVisible && !retrying && ShouldAutoscroll) {
                if (_SelectedIndex > maxVisibleIndex)
                    _ScrollOffset += _SelectedIndex - maxVisibleIndex;
                else if (_SelectedIndex < minVisibleIndex)
                    _ScrollOffset -= minVisibleIndex - _SelectedIndex;

                if (_ScrollOffset >= Items.Count)
                    _ScrollOffset = Items.Count - 1;
                if (_ScrollOffset < 0)
                    _ScrollOffset = 0;

                retrying = true;
                goto retryFromHere;
            }

            int largeChange = Math.Max(4, ClientSize.Height / CollapsedSize);
            if (ScrollBar.LargeChange != largeChange)
                ScrollBar.LargeChange = largeChange;

            int scrollMax = Math.Max(1, Items.Count - 1) + largeChange - 1;
            if (ScrollBar.Maximum != scrollMax)
                ScrollBar.Maximum = scrollMax;
            if (ScrollBar.Value != ScrollOffset)
                ScrollBar.Value = ScrollOffset;

            ShouldAutoscroll = false;
            base.OnPaint(e);
        }
예제 #4
0
        protected override void OnPaint(PaintEventArgs e)
        {
            bool retrying = false, selectedItemVisible = false;
            int  minVisibleIndex = int.MaxValue, maxVisibleIndex = int.MinValue;
            var  width = ClientSize.Width - ScrollBar.Width;

retryFromHere:

            if (_SelectedIndex >= Items.Count)
            {
                _SelectedIndex = Items.Count - 1;
            }
            if (_SelectedIndex < 0)
            {
                _SelectedIndex = 0;
            }

            if (_ScrollOffset >= Items.Count)
            {
                _ScrollOffset = Items.Count - 1;
            }
            if (_ScrollOffset < 0)
            {
                _ScrollOffset = 0;
            }

            VisibleItems.Clear();

            ItemData data;

            using (var sf = new StringFormat {
                Alignment = StringAlignment.Near,
                LineAlignment = StringAlignment.Near,
                FormatFlags = StringFormatFlags.FitBlackBox | StringFormatFlags.NoWrap |
                              StringFormatFlags.DisplayFormatControl | StringFormatFlags.MeasureTrailingSpaces,
                HotkeyPrefix = System.Drawing.Text.HotkeyPrefix.None,
                Trimming = StringTrimming.None
            })
                using (var shadeBrush = new SolidBrush(Color.FromArgb(31, 0, 0, 0)))
                    using (var elideBackgroundBrush = new SolidBrush(Color.FromArgb(192, SystemColors.Window)))
                        using (var elideTextBrush = new SolidBrush(Color.FromArgb(220, SystemColors.WindowText)))
                            using (var backgroundBrush = new SolidBrush(BackColor))
                                using (var textBrush = new SolidBrush(ForeColor))
                                    using (var highlightBrush = new SolidBrush(SystemColors.Highlight))
                                        using (var highlightTextBrush = new SolidBrush(SystemColors.HighlightText)) {
                                            var lineHeight = e.Graphics.MeasureString("AaBbYyZz", Font, width, sf).Height;
                                            CollapsedSize = (int)Math.Ceiling(lineHeight * 3);

                                            var renderParams = new DeltaInfo.RenderParams {
                                                Font                       = Font,
                                                FunctionFilter             = FunctionFilter,
                                                FunctionHighlightBrush     = highlightBrush,
                                                FunctionHighlightTextBrush = highlightTextBrush,
                                                ElideBackgroundBrush       = elideBackgroundBrush,
                                                ElideTextBrush             = elideTextBrush,
                                                ShadeBrush                 = shadeBrush,
                                                StringFormat               = sf,
                                            };

                                            int y = 0;
                                            for (int i = _ScrollOffset; (i < Items.Count) && (y < ClientSize.Height); i++)
                                            {
                                                var y1       = y;
                                                var selected = (i == SelectedIndex);

                                                var item = Items[i];
                                                GetItemData(i, out data);

                                                var rgn = new Rectangle(
                                                    0, y, width,
                                                    data.Expanded ?
                                                    (int)Math.Ceiling(lineHeight * (item.Traceback.Frames.Count + 1)) :
                                                    CollapsedSize
                                                    );

                                                using (var scratch = Scratch.Get(e.Graphics, rgn)) {
                                                    var g = scratch.Graphics;

                                                    g.ResetClip();
                                                    g.Clear(selected ? highlightBrush.Color : backgroundBrush.Color);

                                                    renderParams.BackgroundColor = selected ? highlightBrush.Color : backgroundBrush.Color;
                                                    renderParams.BackgroundBrush = selected ? highlightBrush : backgroundBrush;
                                                    renderParams.TextBrush       = selected ? highlightTextBrush : textBrush;

                                                    renderParams.ContentRegion = rgn;
                                                    renderParams.IsExpanded    = data.Expanded;
                                                    renderParams.IsSelected    = selected;

                                                    y += (int)Math.Ceiling(item.Render(g, ref renderParams));
                                                }

                                                VisibleItems.Add(new VisibleItem {
                                                    Y1 = y1, Y2 = y, Index = i
                                                });

                                                if ((y1 >= 0) && (y < ClientSize.Height) || ((y - y1) >= ClientSize.Height))
                                                {
                                                    minVisibleIndex      = Math.Min(minVisibleIndex, i);
                                                    maxVisibleIndex      = Math.Max(maxVisibleIndex, i);
                                                    selectedItemVisible |= selected;
                                                }
                                            }

                                            if (y < ClientSize.Height)
                                            {
                                                e.Graphics.FillRectangle(backgroundBrush, new Rectangle(0, y, ClientSize.Width, ClientSize.Height - y));
                                            }
                                        }

            if (!selectedItemVisible && !retrying && ShouldAutoscroll)
            {
                if (_SelectedIndex > maxVisibleIndex)
                {
                    _ScrollOffset += _SelectedIndex - maxVisibleIndex;
                }
                else if (_SelectedIndex < minVisibleIndex)
                {
                    _ScrollOffset -= minVisibleIndex - _SelectedIndex;
                }

                if (_ScrollOffset >= Items.Count)
                {
                    _ScrollOffset = Items.Count - 1;
                }
                if (_ScrollOffset < 0)
                {
                    _ScrollOffset = 0;
                }

                retrying = true;
                goto retryFromHere;
            }

            int largeChange = Math.Max(4, ClientSize.Height / CollapsedSize);

            if (ScrollBar.LargeChange != largeChange)
            {
                ScrollBar.LargeChange = largeChange;
            }

            int scrollMax = Math.Max(1, Items.Count - 1) + largeChange - 1;

            if (ScrollBar.Maximum != scrollMax)
            {
                ScrollBar.Maximum = scrollMax;
            }
            if (ScrollBar.Value != ScrollOffset)
            {
                ScrollBar.Value = ScrollOffset;
            }

            ShouldAutoscroll = false;
            base.OnPaint(e);
        }
예제 #5
0
 public AllocationTooltipContent(ref Allocation allocation, ref TracebackInfo traceback, ref DeltaInfo.RenderParams renderParams)
 {
     Allocation   = allocation;
     Traceback    = traceback;
     RenderParams = renderParams;
 }
예제 #6
0
        public float Render(Graphics g, ref DeltaInfo.RenderParams rp, string headerText)
        {
            var lineHeight = g.MeasureString(
                "AaBbYyZz", rp.Font, rp.ContentRegion.Width, rp.StringFormat
                ).Height;

            g.ResetClip();
            g.FillRectangle(rp.ShadeBrush, 0, rp.ContentRegion.Y, rp.ContentRegion.Width, lineHeight - 1);

            var y = 0.0f;

            g.DrawString(headerText, rp.Font, rp.TextBrush, 0.0f, rp.ContentRegion.Top + y, rp.StringFormat);
            y += g.MeasureString(headerText, rp.Font, rp.ContentRegion.Width, rp.StringFormat).Height;

            int f = 0;

            for (int i = 0, c = Frames.Count, o = Frames.Offset; i < c; i++)
            {
                var frame = Frames.Array[i + o];
                var text  = frame.ToString();

                var layoutRect = new RectangleF(
                    0.0f, rp.ContentRegion.Top + y, rp.ContentRegion.Width, lineHeight
                    );
                Region[] fillRegions = null;

                g.ResetClip();

                Match m;
                if ((rp.FunctionFilter != null) && (frame.Function != null) && rp.FunctionFilter.TryMatch(frame.Function, out m))
                {
                    var startIndex = m.Index + text.IndexOf(frame.Function);
                    var endIndex   = startIndex + m.Length;

                    if ((endIndex > startIndex) && (startIndex >= 0))
                    {
                        rp.StringFormat.SetMeasurableCharacterRanges(new[] {
                            new CharacterRange(startIndex, endIndex - startIndex)
                        });

                        fillRegions = g.MeasureCharacterRanges(
                            text, rp.Font, layoutRect, rp.StringFormat
                            );

                        foreach (var fillRegion in fillRegions)
                        {
                            g.SetClip(fillRegion, System.Drawing.Drawing2D.CombineMode.Replace);
                            g.FillRegion(rp.FunctionHighlightBrush, fillRegion);
                            g.DrawString(text, rp.Font, rp.FunctionHighlightTextBrush, layoutRect, rp.StringFormat);
                        }

                        g.ResetClip();
                        foreach (var fillRegion in fillRegions)
                        {
                            g.ExcludeClip(fillRegion);
                        }
                    }
                }

                g.DrawString(text, rp.Font, rp.TextBrush, layoutRect, rp.StringFormat);

                y += g.MeasureString(text, rp.Font, rp.ContentRegion.Width, rp.StringFormat).Height;

                f += 1;
                if ((f == 2) && !rp.IsExpanded)
                {
                    if (Frames.Count > 2)
                    {
                        rp.StringFormat.Alignment = StringAlignment.Far;

                        var elideString = String.Format(
                            "(+{0} frame(s))", Frames.Count - 2
                            );
                        rp.StringFormat.SetMeasurableCharacterRanges(
                            new[] { new CharacterRange(0, elideString.Length) }
                            );

                        var regions = g.MeasureCharacterRanges(elideString, rp.Font, layoutRect, rp.StringFormat);
                        foreach (var region in regions)
                        {
                            g.FillRegion(rp.ElideBackgroundBrush, region);
                        }

                        g.DrawString(elideString, rp.Font, rp.ElideTextBrush, layoutRect, rp.StringFormat);

                        rp.StringFormat.Alignment = StringAlignment.Near;
                    }

                    break;
                }
            }

            return(y);
        }
예제 #7
0
 public DeltaInfoTooltipContent(DeltaInfo delta, DeltaInfo.RenderParams renderParams)
 {
     Delta        = delta;
     RenderParams = renderParams;
 }
예제 #8
0
 public DeltaInfoTooltipContent(DeltaInfo delta, DeltaInfo.RenderParams renderParams)
 {
     Delta = delta;
     RenderParams = renderParams;
 }