示例#1
0
        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);
        }
示例#2
0
        //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);
            }
        }
示例#3
0
        public void RemoveAllAdornments()
        {
            for (int i = 0; (i < _elements.Count); ++i)
            {
                AdornmentAndData data = _elements[i];

                this.RemoveTranslatableVisual(data);
            }

            _elements = new List <AdornmentAndData>();
        }
示例#4
0
        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;
                }
            }
        }
示例#5
0
        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;
        }
示例#6
0
        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;
        }