/// <summary> /// Gets all tags. This method is synchronous. /// </summary> /// <param name="context">Context</param> /// <param name="cancellationToken">Cancellation token</param> /// <returns></returns> public virtual IEnumerable <IHexTextTagSpan <T> > GetTags(HexTaggerContext context, CancellationToken cancellationToken) => GetTags(context);
/// <summary> /// Gets all tags /// </summary> /// <param name="context">Context</param> /// <returns></returns> public abstract IEnumerable <IHexTextTagSpan <T> > GetTags(HexTaggerContext context);
IEnumerable<HexGlyphTag> GetGlyphTags(WpfHexViewLine line) { foreach (var tagSpan in tagAggregator.GetTags(line.BufferSpan)) { if (line.IntersectsBufferSpan(tagSpan.Span)) yield return tagSpan.Tag; } var taggerContext = new HexTaggerContext(line.BufferLine, line.BufferLine.TextSpan); foreach (var tagSpan in tagAggregator.GetLineTags(taggerContext)) yield return tagSpan.Tag; }
/// <summary> /// Gets all tags intersecting with the line. This method is synchronous. /// </summary> /// <param name="context">Context</param> /// <param name="cancellationToken">Cancellation token</param> /// <returns></returns> public abstract IEnumerable <IHexTextTagSpan <T> > GetLineTags(HexTaggerContext context, CancellationToken cancellationToken);
void AddMarkerElements(NormalizedHexBufferSpanCollection spans) { foreach (var tag in tagAggregator.GetTags(spans)) { if (tag.Tag?.Type == null) continue; if (!tag.Span.IntersectsWith(wpfHexView.HexViewLines.FormattedSpan)) continue; var markerElement = TryCreateMarkerElement(tag.Span, tag.Flags, tag.Tag); if (markerElement == null) continue; var layer = markerElement.ZIndex < 0 ? negativeTextMarkerAdornmentLayer : textMarkerAdornmentLayer; bool added = layer.AddAdornment(VSTE.AdornmentPositioningBehavior.TextRelative, markerElement.Span, null, markerElement, onRemovedDelegate); if (added) markerElements.Add(markerElement); } var formattedEnd = wpfHexView.HexViewLines.FormattedSpan.End; foreach (var span in spans) { var overlap = wpfHexView.HexViewLines.FormattedSpan.Overlap(span); if (overlap == null) continue; var pos = overlap.Value.Start; for (;;) { var line = wpfHexView.WpfHexViewLines.GetWpfHexViewLineContainingBufferPosition(pos); Debug.Assert(line != null); if (line != null) { var taggerContext = new HexTaggerContext(line.BufferLine, line.BufferLine.TextSpan); foreach (var tag in tagAggregator.GetLineTags(taggerContext)) { if (tag.Tag?.Type == null) continue; var markerElement = TryCreateMarkerElement(line, tag.Span, tag.Tag); if (markerElement == null) continue; var layer = markerElement.ZIndex < 0 ? negativeTextMarkerAdornmentLayer : textMarkerAdornmentLayer; bool added = layer.AddAdornment(VSTE.AdornmentPositioningBehavior.TextRelative, markerElement.Span, null, markerElement, onRemovedDelegate); if (added) markerElements.Add(markerElement); } } pos = line.BufferEnd; if (pos > overlap.Value.End || pos >= formattedEnd) break; } } }