internal void DocumentClosed(ITextSnapshot savedSnapshot) { Assumes.NotNull(_originalVersion); if ((savedSnapshot != null) && (savedSnapshot.Version.VersionNumber > _originalVersion.VersionNumber)) { // The document was saved and we want to line/column indices in the saved snapshot (& not the current snapshot) var savedSpan = new SnapshotSpan(savedSnapshot, Tracking.TrackSpanForwardInTime(_trackingMode, _originalSpan, _originalVersion, savedSnapshot.Version)); PersistentSpan.SnapshotPointToLineIndex(savedSpan.Start, out _startLine, out _startIndex); PersistentSpan.SnapshotPointToLineIndex(savedSpan.End, out _endLine, out _endIndex); } else { // The document was never saved (or was saved before we created) so continue to use the old line/column indices. // Since those are set when either the span is created (against an open document) or when the document is reopened, // they don't need to be changed. } //We set this to false when the document is closed because we have an accurate line/index and that is more stable //than a simple offset. _useLineIndex = true; _originalSpan = default(Span); _originalVersion = null; _span = null; }
private SnapshotSpan UpdateStartEnd() { SnapshotSpan span = _span.GetSpan(_span.TextBuffer.CurrentSnapshot); PersistentSpan.SnapshotPointToLineIndex(span.Start, out _startLine, out _startIndex); PersistentSpan.SnapshotPointToLineIndex(span.End, out _endLine, out _endIndex); return(span); }
private void UpdateStartEnd() { SnapshotSpan span = _span.GetSpan(_span.TextBuffer.CurrentSnapshot); _nonTrackingSpan = span; PersistentSpan.SnapshotPointToLineIndex(span.Start, out _startLine, out _startIndex); PersistentSpan.SnapshotPointToLineIndex(span.End, out _endLine, out _endIndex); }
internal PersistentSpan(SnapshotSpan span, SpanTrackingMode trackingMode, PersistentSpanSet spanSet) { _span = span.Snapshot.CreateTrackingSpan(span, trackingMode); _originalVersion = span.Snapshot.Version; _originalSpan = span; PersistentSpan.SnapshotPointToLineIndex(span.Start, out _startLine, out _startIndex); PersistentSpan.SnapshotPointToLineIndex(span.End, out _endLine, out _endIndex); _trackingMode = trackingMode; this.SpanSet = spanSet; }
public bool TryGetStartLineIndex(out int startLine, out int startIndex) { if (this.SpanSet == null) { throw new ObjectDisposedException("PersistentSpan"); } if (_span != null) { SnapshotSpan span = _span.GetSpan(_span.TextBuffer.CurrentSnapshot); PersistentSpan.SnapshotPointToLineIndex(span.Start, out startLine, out startIndex); return(true); } else if (_useLineIndex) { startLine = _startLine; startIndex = _startIndex; return(true); } startLine = startIndex = 0; return(false); }
internal void DocumentReopened() { ITextSnapshot snapshot = this.SpanSet.Document.TextBuffer.CurrentSnapshot; SnapshotPoint start; SnapshotPoint end; if (_useLineIndex) { start = PersistentSpan.LineIndexToSnapshotPoint(_startLine, _startIndex, snapshot); end = PersistentSpan.LineIndexToSnapshotPoint(_endLine, _endIndex, snapshot); if (end < start) { //Guard against the case where _start & _end are something like (100,2) & (101, 1). //Those points would pass the argument validation (since _endLine > _startLine) but //would cause problems if the document has only 5 lines since they would map to //(5, 2) & (5, 1). end = start; } } else { start = new SnapshotPoint(snapshot, Math.Min(_originalSpan.Start, snapshot.Length)); end = new SnapshotPoint(snapshot, Math.Min(_originalSpan.End, snapshot.Length)); } var snapshotSpan = new SnapshotSpan(start, end); _span = snapshot.CreateTrackingSpan(snapshotSpan, _trackingMode); _originalSpan = snapshotSpan; _originalVersion = snapshot.Version; PersistentSpan.SnapshotPointToLineIndex(snapshotSpan.Start, out _startLine, out _startIndex); PersistentSpan.SnapshotPointToLineIndex(snapshotSpan.End, out _endLine, out _endIndex); }