public LineTransform GetLineTransform(ITextViewLine line, double yPosition, ViewRelativePosition placement) {
				var transform = removeExtraTextLineVerticalPixels ?
					new LineTransform(0, 0, line.DefaultLineTransform.VerticalScale, line.DefaultLineTransform.Right) :
					line.DefaultLineTransform;
				foreach (var source in lineTransformSources)
					transform = LineTransform.Combine(transform, source.GetLineTransform(line, yPosition, placement));
				return transform;
			}
 public LineTransform GetLineTransform(ITextViewLine line, double yPosition, ViewRelativePosition placement)
 {
     foreach (IAdornment adornment in this.adornments)
     {
         if (line.ContainsBufferPosition(new SnapshotPoint(line.Snapshot, adornment.Span.GetStartPoint(line.Snapshot).Position)))
         {
             //if (adornment.Visual.IsMeasureValid) {
             //  adornment.ShouldRedrawAdornmentLayout = false;
             //}
             return new LineTransform(adornment.Visual.DesiredSize.Height, 0.0, 1.0);
         }
     }
     return new LineTransform(0, 0, 1);
 }
        LineTransform ILineTransformSource.GetLineTransform(ITextViewLine line, double yPosition, ViewRelativePosition placement)
        {
            IEnumerable<ImageAdornment> targetImages = this.manager.Images
                .Where(imageAdornment => imageAdornment.ApplyRenderTrackingPoint(this.manager.View.TextSnapshot, line));

            if (targetImages.Count() > 0)
            {
                ImageAdornment imageAdornmentWithMaxHeight = targetImages
                    .OrderByDescending(imageAdornment => imageAdornment.VisualElement.Height)
                    .FirstOrDefault();

                return new LineTransform(imageAdornmentWithMaxHeight.VisualElement.Height + ImageAdornmentSpacePadding, 0, 1.0);
            }

            return new LineTransform(0, 0, 1.0);
        }
        /// <summary>
        /// Determine the size of a particular line, based on distance from caret
        /// </summary>
        /// <param name="line">The position of the line currently being modified </param>
        /// <param name="yPosition">Unused data type left over from base.GetLineTransform() </param>
        /// <param name="placement">Unused data type left over from base.GetLineTransform() </param>
        /// <returns>LineTransform object containing the desired scale value for the line</returns>
        public LineTransform GetLineTransform(ITextViewLine line, double yPosition, ViewRelativePosition placement)
        {
            //Vertically compress lines that are far from the caret (based on buffer lines, not view lines).
            int caretLineNumber = _textView.TextSnapshot.GetLineNumberFromPosition(_textView.Caret.Position.BufferPosition);
            int lineNumber = _textView.TextSnapshot.GetLineNumberFromPosition(line.Start);
            int delta = Math.Abs(caretLineNumber - lineNumber);

            double scale;
            if (delta <= 1)
                scale = 1.0;
            else if (delta <= 3)
                scale = 1.0 - ((delta - 3)) * 0.05;
            else if (delta <= 8)
                scale = 0.75 - ((delta - 8)) * 0.025;
            else
                scale = 0.5;

            return new LineTransform(0.0, 0.0, scale);
        }
Beispiel #5
0
		public LineTransform GetLineTransform(ITextViewLine line, double yPosition, ViewRelativePosition placement) {
			if (!compressEmptyOrWhitespaceLines && !compressNonLetterLines)
				return new LineTransform(0, 0, 1, 0);
			if (!line.IsFirstTextViewLineForSnapshotLine && !line.IsLastTextViewLineForSnapshotLine)
				return new LineTransform(0, 0, 1, 0);

			switch (GetLineType(line)) {
			case LineKind.Normal:
				return new LineTransform(0, 0, 1, 0);
			case LineKind.EmptyOrWhitespace:
				if (compressEmptyOrWhitespaceLines)
					return new LineTransform(0, 0, SCALE, 0);
				return new LineTransform(0, 0, 1, 0);
			case LineKind.NoLettersDigits:
				if (compressNonLetterLines)
					return new LineTransform(0, 0, SCALE, 0);
				return new LineTransform(0, 0, 1, 0);
			default:
				throw new InvalidOperationException();
			}
		}
        LineTransform ILineTransformSource.GetLineTransform(ITextViewLine line, double yPosition, ViewRelativePosition placement)
        {
            #pragma warning disable 219
            bool imageOnLine = false; // useful for tracing
            #pragma warning restore 219

            int lineNumber = line.Snapshot.GetLineFromPosition(line.Start.Position).LineNumber;
            LineTransform lineTransform;

            // Look up Image for current line and increase line height as necessary
            if (_manager.Images.ContainsKey(lineNumber) && ImageAdornmentManager.Enabled)
            {
                double defaultHeight = line.DefaultLineTransform.BottomSpace;
                MyImage image = _manager.Images[lineNumber];
                lineTransform = new LineTransform(0, image.Height + defaultHeight, 1.0);

                imageOnLine = true;
            }
            else
            {
                lineTransform = new LineTransform(0, 0, 1.0);
            }
            return lineTransform;
        }
Beispiel #7
0
        LineTransform ILineTransformSource.GetLineTransform(ITextViewLine line, double yPosition, ViewRelativePosition placement)
        {
            int           lineNumber = line.Snapshot.GetLineFromPosition(line.Start.Position).LineNumber;
            LineTransform lineTransform;

            if (this.manager.DisplayedTextBlocks.ContainsKey(lineNumber) &&
                this.manager.DisplayedTextBlocks[lineNumber].Count > 0)
            {
                var spaceAboveLine = line.DefaultLineTransform.TopSpace + ((StringResVizPackage.Instance.Options.TopPadding + StringResVizPackage.Instance.Options.BottomPadding) * Constants.TextBlockSizeToFontScaleFactor);
                var spaceBelowLine = line.DefaultLineTransform.BottomSpace;
                lineTransform = new LineTransform(spaceAboveLine + ResourceAdornmentManager.TextSize, spaceBelowLine, 1.0);
            }
            else
            {
                lineTransform = new LineTransform(0, 0, 1.0);
            }

            return(lineTransform);
        }
Beispiel #8
0
 public void DisplayTextLineContainingBufferPosition(Microsoft.VisualStudio.Text.SnapshotPoint bufferPosition, double verticalDistance, ViewRelativePosition relativeTo)
 {
     throw new NotImplementedException();
 }
Beispiel #9
0
 public void DisplayTextLineContainingBufferPosition(SnapshotPoint bufferPosition, double verticalDistance, ViewRelativePosition relativeTo)
 {
     throw new NotSupportedException();
 }
Beispiel #10
0
		/// <summary>
		/// </summary>
		public void EnsureVisible(Double verticalPadding, ViewRelativePosition relativeTo)
		{
			if (_editorView.TextLines.Count == 0)
			{
				_ensureVisiblePending = true;
			}
			else
			{
				Span span = new Span(this.Position.TextInsertionIndex, 0);
				if (!_textViewHelper.EnsureSpanVisible(span, 2 + base.Width, verticalPadding))
				{
					_textViewHelper.EnsureSpanVisible(span, 0, 0);
				}
			}
		}
			public void LayoutLines(SnapshotPoint bufferPosition, ViewRelativePosition relativeTo, double verticalDistance, double viewportLeft, double viewportWidthOverride, double viewportHeightOverride) {
				NewViewportTop = requestedViewportTop;
				var infos = CreateLineInfos(bufferPosition, relativeTo, verticalDistance, viewportHeightOverride);

				// The first line of the file must always be shown at the top of the view
				if (infos[0].Y > NewViewportTop) {
					infos = CreateLineInfos(new SnapshotPoint(bufferPosition.Snapshot, 0), ViewRelativePosition.Top, 0, viewportHeightOverride);
					Debug.Assert(infos[0].Y == NewViewportTop);
				}

				// Include a hidden line before the first line and one after the last line,
				// just like in VS' IWpfTextViewLine collection.
				var firstInfo = infos[0];
				var prevLine = AddLineTransform(GetLineBefore(firstInfo.Line), firstInfo.Y, ViewRelativePosition.Bottom);
				if (prevLine != null)
					infos.Insert(0, new LineInfo(prevLine, firstInfo.Y - prevLine.Height));
				var lastInfo = infos[infos.Count - 1];
				var nextLine = AddLineTransform(GetLineAfter(lastInfo.Line), lastInfo.Y + lastInfo.Line.Height, ViewRelativePosition.Top);
				if (nextLine != null)
					infos.Add(new LineInfo(nextLine, lastInfo.Y + lastInfo.Line.Height));

				var keptLines = new HashSet<PhysicalLine>();
				foreach (var info in infos)
					keptLines.Add(toPhysicalLine[info.Line]);
				foreach (var physLine in toPhysicalLine.Values) {
					if (!keptLines.Contains(physLine))
						physLine.Dispose();
				}

				var newTop = GetNewViewportTop(infos, NewViewportTop);
				var delta = -NewViewportTop + newTop;
				NewViewportTop = newTop;
				var visibleLines = new HashSet<IWpfTextViewLine>();
				var visibleArea = new Rect(viewportLeft, NewViewportTop, viewportWidthOverride, viewportHeightOverride);
				NewOrReformattedLines = new List<IWpfTextViewLine>();
				TranslatedLines = new List<IWpfTextViewLine>();
				AllVisibleLines = new List<IWpfTextViewLine>();
				foreach (var info in infos) {
					var line = info.Line;
					visibleLines.Add(line);
					AllVisibleLines.Add(line);
					double newLineTop = delta + info.Y;
					if (!oldVisibleLines.Contains(line)) {
						line.SetChange(TextViewLineChange.NewOrReformatted);
						line.SetDeltaY(0);
					}
					else {
						var deltaY = newLineTop - line.Top;
						line.SetDeltaY(deltaY);
						// If it got a new line transform, it will have Change == NewOrReformatted,
						// and that change has priority over Translated.
						if (deltaY != 0 && line.Change == TextViewLineChange.None)
							line.SetChange(TextViewLineChange.Translated);
					}
					line.SetTop(newLineTop);
					line.SetVisibleArea(visibleArea);
					if (line.Change == TextViewLineChange.Translated)
						TranslatedLines.Add(line);
					else if (line.Change == TextViewLineChange.NewOrReformatted)
						NewOrReformattedLines.Add(line);
				}
				bool foundVisibleLine = false;
				foreach (var info in infos) {
					if (visibleLines.Contains(info.Line)) {
						foundVisibleLine = true;
						continue;
					}
					info.Line.SetChange(TextViewLineChange.None);
					info.Line.SetDeltaY(0);
					info.Line.SetTop(foundVisibleLine ? double.PositiveInfinity : double.NegativeInfinity);
					info.Line.SetVisibleArea(visibleArea);
				}
				Debug.Assert(NewOrReformattedLines.Count + TranslatedLines.Count <= AllVisibleLines.Count);
				Debug.Assert(AllVisibleLines.Count >= 1);
				if (AllVisibleLines.Count == 0)
					throw new InvalidOperationException();
				AllVisiblePhysicalLines = new List<PhysicalLine>(keptLines);
			}
			List<LineInfo> CreateLineInfos(SnapshotPoint bufferPosition, ViewRelativePosition relativeTo, double verticalDistance, double viewportHeightOverride) {
				var lineInfos = new List<LineInfo>();
				var startLine = GetLine(bufferPosition);

				double newViewportBottom = NewViewportTop + viewportHeightOverride;
				double lineStartY;
				if (relativeTo == ViewRelativePosition.Top) {
					lineStartY = NewViewportTop + verticalDistance;
					AddLineTransform(startLine, lineStartY, ViewRelativePosition.Top);
				}
				else {
					Debug.Assert(relativeTo == ViewRelativePosition.Bottom);
					lineStartY = NewViewportTop + viewportHeightOverride - verticalDistance;
					AddLineTransform(startLine, lineStartY, ViewRelativePosition.Bottom);
					lineStartY -= startLine.Height;
				}

				var currentLine = startLine;
				double y = lineStartY;
				if (y + currentLine.Height > NewViewportTop) {
					for (;;) {
						lineInfos.Add(new LineInfo(currentLine, y));
						if (y <= NewViewportTop)
							break;
						currentLine = AddLineTransform(GetLineBefore(currentLine), y, ViewRelativePosition.Bottom);
						if (currentLine == null)
							break;
						y -= currentLine.Height;
					}
					lineInfos.Reverse();
				}

				currentLine = startLine;
				for (y = lineStartY + currentLine.Height; y < newViewportBottom;) {
					currentLine = AddLineTransform(GetLineAfter(currentLine), y, ViewRelativePosition.Top);
					if (currentLine == null)
						break;
					lineInfos.Add(new LineInfo(currentLine, y));
					y += currentLine.Height;
				}
				Debug.Assert(new HashSet<IWpfTextViewLine>(lineInfos.Select(a => a.Line)).Count == lineInfos.Count);

				// At least one line must be included
				if (lineInfos.Count == 0)
					lineInfos.Add(new LineInfo(startLine, NewViewportTop));

				// Make sure that at least one line is shown
				var last = lineInfos[lineInfos.Count - 1];
				if (last.Y + last.Line.Height <= NewViewportTop)
					NewViewportTop = last.Y;
				var first = lineInfos[0];
				if (first.Y >= newViewportBottom)
					NewViewportTop = first.Y;

				return lineInfos;
			}
Beispiel #13
0
		LineTransform ILineTransformSource.GetLineTransform(ITextViewLine line, double yPosition, ViewRelativePosition placement) =>
			LineTransformProvider.GetLineTransform(line, yPosition, placement);
Beispiel #14
0
        LineTransform ILineTransformSource.GetLineTransform(ITextViewLine line, double yPosition, ViewRelativePosition placement)
        {
            int           lineNumber = line.Snapshot.GetLineFromPosition(line.Start.Position).LineNumber;
            LineTransform lineTransform;

            // TODO: Don't show if line is collapsed. Issue #3
            if (this.manager.DisplayedTextBlocks.ContainsKey(lineNumber))
            {
                var defaultTopSpace    = line.DefaultLineTransform.TopSpace;
                var defaultBottomSpace = line.DefaultLineTransform.BottomSpace;
                lineTransform = new LineTransform(defaultTopSpace + ResourceAdornmentManager.TextSize, defaultBottomSpace, 1.0);
            }
            else
            {
                lineTransform = new LineTransform(0, 0, 1.0);
            }

            return(lineTransform);
        }
Beispiel #15
0
 public void DisplayTextLineContainingBufferPosition(SnapshotPoint bufferPosition, double verticalDistance, ViewRelativePosition relativeTo)
 {
 }
Beispiel #16
0
 public void DisplayTextLineContainingBufferPosition(SnapshotPoint bufferPosition, double verticalDistance, ViewRelativePosition relativeTo)
 {
     throw new NotSupportedException();
 }
Beispiel #17
0
 public void DisplayTextLineContainingBufferPosition(SnapshotPoint bufferPosition, double verticalDistance, ViewRelativePosition relativeTo, double? viewportWidthOverride, double? viewportHeightOverride)
 {
     throw new NotSupportedException();
 }
Beispiel #18
0
 public void DisplayTextLineContainingBufferPosition(SnapshotPoint position, double verticalDistance, ViewRelativePosition relativeTo, double?width, double?height) => throw new NotImplementedException();
Beispiel #19
0
        private void SelectAndDispalyEntry(IRHistoryEntry entryToSelect, ViewRelativePosition relativeTo) {
            entryToSelect.IsSelected = true;

            var snapshotPoint = relativeTo == ViewRelativePosition.Top 
                ? entryToSelect.Span.GetStartPoint(_historyTextBuffer.CurrentSnapshot)
                : entryToSelect.Span.GetEndPoint(_historyTextBuffer.CurrentSnapshot);

            var line = VisualComponent.TextView.GetTextViewLineContainingBufferPosition(snapshotPoint);
            if (line.VisibilityState != VisibilityState.FullyVisible) {
                VisualComponent.TextView.DisplayTextLineContainingBufferPosition(snapshotPoint, 0, relativeTo);
            }

            OnSelectionChanged();
        }
Beispiel #20
0
            public void LayoutLines(SnapshotPoint bufferPosition, ViewRelativePosition relativeTo, double verticalDistance, double viewportLeft, double viewportWidthOverride, double viewportHeightOverride)
            {
                NewViewportTop = requestedViewportTop;
                var infos = CreateLineInfos(bufferPosition, relativeTo, verticalDistance, viewportHeightOverride);

                // The first line of the file must always be shown at the top of the view
                if (infos[0].Y > NewViewportTop)
                {
                    infos = CreateLineInfos(new SnapshotPoint(bufferPosition.Snapshot, 0), ViewRelativePosition.Top, 0, viewportHeightOverride);
                    Debug.Assert(infos[0].Y == NewViewportTop);
                }

                // Include a hidden line before the first line and one after the last line,
                // just like in VS' IWpfTextViewLine collection.
                var firstInfo = infos[0];
                var prevLine  = AddLineTransform(GetLineBefore(firstInfo.Line), firstInfo.Y, ViewRelativePosition.Bottom);

                if (prevLine != null)
                {
                    infos.Insert(0, new LineInfo(prevLine, firstInfo.Y - prevLine.Height));
                }
                var lastInfo = infos[infos.Count - 1];
                var nextLine = AddLineTransform(GetLineAfter(lastInfo.Line), lastInfo.Y + lastInfo.Line.Height, ViewRelativePosition.Top);

                if (nextLine != null)
                {
                    infos.Add(new LineInfo(nextLine, lastInfo.Y + lastInfo.Line.Height));
                }

                var keptLines = new HashSet <PhysicalLine>();

                foreach (var info in infos)
                {
                    keptLines.Add(toPhysicalLine[info.Line]);
                }
                foreach (var physLine in toPhysicalLine.Values)
                {
                    if (!keptLines.Contains(physLine))
                    {
                        physLine.Dispose();
                    }
                }

                var newTop = GetNewViewportTop(infos, NewViewportTop);
                var delta  = -NewViewportTop + newTop;

                NewViewportTop = newTop;
                var visibleLines = new HashSet <IWpfTextViewLine>();
                var visibleArea  = new Rect(viewportLeft, NewViewportTop, viewportWidthOverride, viewportHeightOverride);

                NewOrReformattedLines = new List <IWpfTextViewLine>();
                TranslatedLines       = new List <IWpfTextViewLine>();
                AllVisibleLines       = new List <IWpfTextViewLine>();
                foreach (var info in infos)
                {
                    var line = info.Line;
                    visibleLines.Add(line);
                    AllVisibleLines.Add(line);
                    double newLineTop = delta + info.Y;
                    if (!oldVisibleLines.Contains(line))
                    {
                        line.SetChange(TextViewLineChange.NewOrReformatted);
                        line.SetDeltaY(0);
                    }
                    else
                    {
                        var deltaY = newLineTop - line.Top;
                        line.SetDeltaY(deltaY);
                        // If it got a new line transform, it will have Change == NewOrReformatted,
                        // and that change has priority over Translated.
                        if (deltaY != 0 && line.Change == TextViewLineChange.None)
                        {
                            line.SetChange(TextViewLineChange.Translated);
                        }
                    }
                    line.SetTop(newLineTop);
                    line.SetVisibleArea(visibleArea);
                    if (line.Change == TextViewLineChange.Translated)
                    {
                        TranslatedLines.Add(line);
                    }
                    else if (line.Change == TextViewLineChange.NewOrReformatted)
                    {
                        NewOrReformattedLines.Add(line);
                    }
                }
                bool foundVisibleLine = false;

                foreach (var info in infos)
                {
                    if (visibleLines.Contains(info.Line))
                    {
                        foundVisibleLine = true;
                        continue;
                    }
                    info.Line.SetChange(TextViewLineChange.None);
                    info.Line.SetDeltaY(0);
                    info.Line.SetTop(foundVisibleLine ? double.PositiveInfinity : double.NegativeInfinity);
                    info.Line.SetVisibleArea(visibleArea);
                }
                Debug.Assert(NewOrReformattedLines.Count + TranslatedLines.Count <= AllVisibleLines.Count);
                Debug.Assert(AllVisibleLines.Count >= 1);
                if (AllVisibleLines.Count == 0)
                {
                    throw new InvalidOperationException();
                }
                AllVisiblePhysicalLines = new List <PhysicalLine>(keptLines);
            }
Beispiel #21
0
 public void DisplayTextLineContainingBufferPosition(Microsoft.VisualStudio.Text.SnapshotPoint bufferPosition, double verticalDistance, ViewRelativePosition relativeTo, double?viewportWidthOverride, double?viewportHeightOverride)
 {
     throw new System.NotImplementedException();
 }
    public LineTransform GetLineTransform(ITextViewLine line, double yPosition, ViewRelativePosition placement) {
      Contract.Assume(line != null, "interface we don't control");

      try {
        if (hasFailed)
          return new LineTransform(0, 0, 1);
        if (lineHeight == null)
          lineHeight = line.Height;
        foreach (IEnumerable<IAdornment> adornmentsGroup in adornments)
        {
          if (adornmentsGroup == null) continue;
          foreach (IAdornment adornment in adornmentsGroup)
          {
            if (adornment == null) continue;
            if (adornment.LineTransformBehavior == LineTransformBehavior.None)
              continue;
            if (line.ContainsBufferPosition(new SnapshotPoint(line.Snapshot, adornment.Span.GetStartPoint(line.Snapshot).Position)))
            {
              if (adornment.LineTransformBehavior == LineTransformBehavior.Above)
                return new LineTransform(adornment.Visual.DesiredSize.Height, 0d, 1d);
              else if (adornment.LineTransformBehavior == LineTransformBehavior.Below)
                return new LineTransform(0d, adornment.Visual.DesiredSize.Height, 1d);
              else if (adornment.LineTransformBehavior == LineTransformBehavior.BelowWithOneLineAbove)
              {
                return new LineTransform(lineHeight.Value, adornment.Visual.DesiredSize.Height, 1d);
              }
            }
          }
        }
        return new LineTransform(0, 0, 1);
      } catch (Exception exn) {
        _logger.PublicEntryException(exn, "GetLineTransform");
        return new LineTransform(0, 0, 1);
      }
    }    
Beispiel #23
0
		void DisplayLines(SnapshotPoint bufferPosition, double verticalDistance, ViewRelativePosition relativeTo, double viewportWidthOverride, double viewportHeightOverride, double? newViewportTop) {
			if (IsClosed)
				throw new InvalidOperationException();
			Dispatcher.VerifyAccess();
			if (bufferPosition.Snapshot != TextSnapshot)
				throw new ArgumentException();
			if (relativeTo != ViewRelativePosition.Top && relativeTo != ViewRelativePosition.Bottom)
				throw new ArgumentOutOfRangeException(nameof(relativeTo));
			if (viewportHeightOverride < 0 || double.IsNaN(viewportHeightOverride))
				throw new ArgumentOutOfRangeException(nameof(viewportHeightOverride));
			if (viewportWidthOverride < 0 || double.IsNaN(viewportWidthOverride))
				throw new ArgumentOutOfRangeException(nameof(viewportWidthOverride));

			bool invalidateAllLines = false;
			if (viewportWidthOverride != lastViewportWidth || viewportWidthOverride != lastFormattedLineSourceViewportWidth) {
				invalidateAllLines = true;
				lastViewportWidth = viewportWidthOverride;
			}

			// Make sure the scheduled method doesn't try to call this method
			delayLayoutLinesInProgress = false;

			if (invalidateAllLines) {
				invalidatedRegions.Clear();
				invalidatedRegions.Add(new SnapshotSpan(TextSnapshot, 0, TextSnapshot.Length));
			}
			var regionsToInvalidate = new NormalizedSnapshotSpanCollection(invalidatedRegions.Select(a => a.TranslateTo(TextSnapshot, SpanTrackingMode.EdgeInclusive)));
			invalidatedRegions.Clear();
			if (invalidatedRegions.Capacity > 100)
				invalidatedRegions.TrimExcess();

			if (!(FormattedLineSource.SourceTextSnapshot == TextSnapshot && FormattedLineSource.TopTextSnapshot == VisualSnapshot))
				invalidateAllLines = true;
			if (invalidateAllLines || formattedLineSourceIsInvalidated) {
				CreateFormattedLineSource(viewportWidthOverride);
				formattedLineSourceIsInvalidated = false;
			}
			Debug.Assert(FormattedLineSource.SourceTextSnapshot == TextSnapshot && FormattedLineSource.TopTextSnapshot == VisualSnapshot);

			var lineTransformProvider = LineTransformProvider;

			if (InLayout)
				throw new InvalidOperationException();
			InLayout = true;
			var oldVisibleLines = new HashSet<ITextViewLine>(wpfTextViewLineCollection == null ? (IList<ITextViewLine>)Array.Empty<ITextViewLine>() : wpfTextViewLineCollection);
			wpfTextViewLineCollection?.Invalidate();

			var layoutHelper = new LayoutHelper(lineTransformProvider, newViewportTop ?? 0, oldVisibleLines, GetValidCachedLines(regionsToInvalidate), FormattedLineSource, TextViewModel, VisualSnapshot, TextSnapshot);
			layoutHelper.LayoutLines(bufferPosition, relativeTo, verticalDistance, ViewportLeft, viewportWidthOverride, viewportHeightOverride);

			visiblePhysicalLines.AddRange(layoutHelper.AllVisiblePhysicalLines);
			wpfTextViewLineCollection = new WpfTextViewLineCollection(this, TextSnapshot, layoutHelper.AllVisibleLines);

			if (!InLayout)
				throw new InvalidOperationException();
			InLayout = false;

			textLayer.AddVisibleLines(layoutHelper.AllVisibleLines);
			var newOrReformattedLines = layoutHelper.NewOrReformattedLines.ToArray();
			var translatedLines = layoutHelper.TranslatedLines.ToArray();

			if (layoutHelper.NewViewportTop != viewportTop) {
				viewportTop = layoutHelper.NewViewportTop;
				SetTop(normalAdornmentLayerCollection, -viewportTop);
			}
			RaiseLayoutChanged(viewportWidthOverride, viewportHeightOverride, newOrReformattedLines, translatedLines);
		}
Beispiel #24
0
		public void DisplayTextLineContainingBufferPosition(SnapshotPoint bufferPosition, double verticalDistance, ViewRelativePosition relativeTo, double? viewportWidthOverride, double? viewportHeightOverride) =>
			DisplayLines(bufferPosition, verticalDistance, relativeTo, viewportWidthOverride ?? ViewportWidth, viewportHeightOverride ?? ViewportHeight, null);
			IFormattedLine AddLineTransform(IFormattedLine line, double yPosition, ViewRelativePosition placement) {
				if (line != null) {
					var lineTransform = lineTransformProvider.GetLineTransform(line, yPosition, placement);
					if (lineTransform != line.LineTransform) {
						line.SetLineTransform(lineTransform);
						line.SetChange(TextViewLineChange.NewOrReformatted);
					}
				}
				return line;
			}
Beispiel #26
0
 public void DisplayTextLineContainingBufferPosition(SnapshotPoint bufferPosition, double verticalDistance, ViewRelativePosition relativeTo, double?viewportWidthOverride, double?viewportHeightOverride)
 {
     throw new NotSupportedException();
 }
Beispiel #27
0
            List <LineInfo> CreateLineInfos(SnapshotPoint bufferPosition, ViewRelativePosition relativeTo, double verticalDistance, double viewportHeightOverride)
            {
                var lineInfos = new List <LineInfo>();
                var startLine = GetLine(bufferPosition);

                double newViewportBottom = NewViewportTop + viewportHeightOverride;
                double lineStartY;

                if (relativeTo == ViewRelativePosition.Top)
                {
                    lineStartY = NewViewportTop + verticalDistance;
                    AddLineTransform(startLine, lineStartY, ViewRelativePosition.Top);
                }
                else
                {
                    Debug.Assert(relativeTo == ViewRelativePosition.Bottom);
                    lineStartY = NewViewportTop + viewportHeightOverride - verticalDistance;
                    AddLineTransform(startLine, lineStartY, ViewRelativePosition.Bottom);
                    lineStartY -= startLine.Height;
                }

                var    currentLine = startLine;
                double y           = lineStartY;

                if (y + currentLine.Height > NewViewportTop)
                {
                    for (;;)
                    {
                        lineInfos.Add(new LineInfo(currentLine, y));
                        if (y <= NewViewportTop)
                        {
                            break;
                        }
                        currentLine = AddLineTransform(GetLineBefore(currentLine), y, ViewRelativePosition.Bottom);
                        if (currentLine == null)
                        {
                            break;
                        }
                        y -= currentLine.Height;
                    }
                    lineInfos.Reverse();
                }

                currentLine = startLine;
                for (y = lineStartY + currentLine.Height; y < newViewportBottom;)
                {
                    currentLine = AddLineTransform(GetLineAfter(currentLine), y, ViewRelativePosition.Top);
                    if (currentLine == null)
                    {
                        break;
                    }
                    lineInfos.Add(new LineInfo(currentLine, y));
                    y += currentLine.Height;
                }
                Debug.Assert(new HashSet <IWpfTextViewLine>(lineInfos.Select(a => a.Line)).Count == lineInfos.Count);

                // At least one line must be included
                if (lineInfos.Count == 0)
                {
                    lineInfos.Add(new LineInfo(startLine, NewViewportTop));
                }

                // Make sure that at least one line is shown
                var last = lineInfos[lineInfos.Count - 1];

                if (last.Y + last.Line.Height <= NewViewportTop)
                {
                    NewViewportTop = last.Y;
                }
                var first = lineInfos[0];

                if (first.Y >= newViewportBottom)
                {
                    NewViewportTop = first.Y;
                }

                return(lineInfos);
            }
Beispiel #28
0
            public LineTransform GetLineTransform(ITextViewLine line, double yPosition, ViewRelativePosition placement)
            {
                var transform = removeExtraTextLineVerticalPixels ?
                                new LineTransform(0, 0, line.DefaultLineTransform.VerticalScale, line.DefaultLineTransform.Right) :
                                line.DefaultLineTransform;

                foreach (var source in lineTransformSources)
                {
                    transform = LineTransform.Combine(transform, source.GetLineTransform(line, yPosition, placement));
                }
                return(transform);
            }
 public void DisplayTextLineContainingBufferPosition(Microsoft.VisualStudio.Text.SnapshotPoint bufferPosition, double verticalDistance, ViewRelativePosition relativeTo) {
     throw new NotImplementedException();
 }
Beispiel #30
0
		public void DisplayTextLineContainingBufferPosition(SnapshotPoint bufferPosition, double verticalDistance, ViewRelativePosition relativeTo) =>
			DisplayTextLineContainingBufferPosition(bufferPosition, verticalDistance, relativeTo, null, null);