示例#1
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;
        }