public bool AddAdornment(AdornmentPositioningBehavior behavior, SnapshotSpan?visualSpan, object tag, AdornmentElement element, AdornmentRemovedCallback removedCallback) { if (element == null) { throw new ArgumentNullException("element"); } if (_isOverlayLayer && behavior != AdornmentPositioningBehavior.OwnerControlled) { throw new ArgumentOutOfRangeException("behavior", "Only AdornmentPositioningBehavior.OwnerControlled is supported"); } if (IsTextRelative(behavior) && !visualSpan.HasValue) { throw new ArgumentNullException("visualSpan"); } bool visible = true; if (visualSpan.HasValue) { //Does the visual span intersect anything visible? visible = _view.TextViewLines.IntersectsBufferSpan(visualSpan.Value); } if (visible) { AdornmentAndData data = new AdornmentAndData(behavior, visualSpan, tag, element, removedCallback); _elements.Add(data); Children.Add(element); } return(visible); }
//Remove the visual child and call the removed callback. Do not attempt to remove the data from the list of visuals. private void RemoveTranslatableVisual(AdornmentAndData data) { Children.Remove(data.Adornment); if (data.RemovedCallback != null) { data.RemovedCallback(data.Tag, data.Adornment); } }
public void RemoveAllAdornments() { for (int i = 0; (i < _elements.Count); ++i) { AdornmentAndData data = _elements[i]; this.RemoveTranslatableVisual(data); } _elements = new List <AdornmentAndData>(); }
public void RemoveAdornment(AdornmentElement element) { if (element == null) { throw new ArgumentNullException("element"); } for (int i = 0; (i < _elements.Count); ++i) { AdornmentAndData data = _elements[i]; if (data.Adornment == element) { _elements.RemoveAt(i); this.RemoveTranslatableVisual(data); break; } } }
private void InternalRemoveMatchingAdornments(SnapshotSpan?visualSpan, Predicate <IAdornmentLayerElement> match) { List <AdornmentAndData> newVisuals = new List <AdornmentAndData>(_elements.Count); for (int i = 0; (i < _elements.Count); ++i) { AdornmentAndData data = _elements[i]; if ((!visualSpan.HasValue || data.OverlapsWith(visualSpan.Value)) && match(data)) { this.RemoveTranslatableVisual(data); } else { newVisuals.Add(data); } } _elements = newVisuals; }
internal void SetSnapshotAndUpdate(ITextSnapshot snapshot, double deltaX, double deltaY, IList <ITextViewLine> newOrReformattedLines, IList <ITextViewLine> translatedLines) { //Go through all the added visuals and invalidate or transform as appropriate. List <AdornmentAndData> newVisuals = new List <AdornmentAndData>(_elements.Count); for (int i = 0; (i < _elements.Count); ++i) { AdornmentAndData data = _elements[i]; if (!data.VisualSpan.HasValue) { newVisuals.Add(data); if (data.Behavior == AdornmentPositioningBehavior.ViewportRelative) { data.Translate(deltaX, deltaY); } } else { data.SetSnapshot(snapshot); SnapshotSpan span = data.VisualSpan.Value; if ((!_view.TextViewLines.IntersectsBufferSpan(span)) || (GetCrossingLine(newOrReformattedLines, span) != null)) { //Either visual is no longer visible or it crosses a line //that was reformatted. this.RemoveTranslatableVisual(data); } else { newVisuals.Add(data); switch (data.Behavior) { case AdornmentPositioningBehavior.TextRelative: case (AdornmentPositioningBehavior)(AdornmentPositioningBehavior2.TextRelativeVerticalOnly): { ITextViewLine line = GetCrossingLine(translatedLines, span); if (line != null) { data.Translate((data.Behavior == AdornmentPositioningBehavior.TextRelative) ? 0.0 : deltaX, line.DeltaY); } else if (data.Behavior == (AdornmentPositioningBehavior)(AdornmentPositioningBehavior2.TextRelativeVerticalOnly)) { data.Translate(deltaX, 0.0); } break; } case AdornmentPositioningBehavior.ViewportRelative: { data.Translate(deltaX, deltaY); break; } } } } } _elements = newVisuals; }