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); }
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); }
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); }
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); }
public AllocationTooltipContent(ref Allocation allocation, ref TracebackInfo traceback, ref DeltaInfo.RenderParams renderParams) { Allocation = allocation; Traceback = traceback; RenderParams = renderParams; }
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); }
public DeltaInfoTooltipContent(DeltaInfo delta, DeltaInfo.RenderParams renderParams) { Delta = delta; RenderParams = renderParams; }