internal TextContentChangedEventArgs ApplyReload(StringRebuilder newContent, EditOptions editOptions, object editTag) { // we construct a normalized change list where the inserted text is a reference string that // points "forward" to the next snapshot and whose deleted text is a reference string that points // "backward" to the prior snapshot. This pins both snapshots in memory but that's better than materializing // giant strings, and when (?) we have paging text storage, memory requirements will be minimal. TextVersion newVersion = new TextVersion(this, this.currentVersion.VersionNumber + 1, this.currentVersion.VersionNumber + 1, newContent.Length); ITextSnapshot oldSnapshot = this.currentSnapshot; TextSnapshot newSnapshot = new TextSnapshot(this, newVersion, newContent); ReferenceChangeString oldText = new ReferenceChangeString(new SnapshotSpan(oldSnapshot, 0, oldSnapshot.Length)); ReferenceChangeString newText = new ReferenceChangeString(new SnapshotSpan(newSnapshot, 0, newSnapshot.Length)); TextChange change = new TextChange(oldPosition: 0, oldText: oldText, newText: newText, currentSnapshot: oldSnapshot); this.currentVersion.AddNextVersion(NormalizedTextChangeCollection.Create(new FrugalList <TextChange>() { change }, editOptions.ComputeMinimalChange ? (StringDifferenceOptions?)editOptions.DifferenceOptions : null, this.textDifferencingService, oldSnapshot, newSnapshot), newVersion); this.builder = newContent; this.currentVersion = newVersion; this.currentSnapshot = newSnapshot; return(new TextContentChangedEventArgs(oldSnapshot, newSnapshot, editOptions, editTag)); }
internal static StringRebuilder StringRebuilderFromSnapshotSpan(SnapshotSpan span) { TextSnapshot snapshot = span.Snapshot as TextSnapshot; if (snapshot != null) { return(snapshot.Content.Substring(span)); } IProjectionSnapshot projectionSnapshot = span.Snapshot as IProjectionSnapshot; if (projectionSnapshot != null) { StringRebuilder content = SimpleStringRebuilder.Create(string.Empty); foreach (var childSpan in projectionSnapshot.MapToSourceSnapshots(span)) { content = content.Append(StringRebuilderFromSnapshotSpan(childSpan)); } return(content); } //The we don't know what to do fallback. This should never be called unless someone provides a new snapshot //implementation. return(SimpleStringRebuilder.Create(span.GetText())); }
internal TextContentChangedEventArgs ApplyReload(StringRebuilder newContent, EditOptions editOptions, object editTag) { // we construct a normalized change list where the inserted text is a reference string that // points "forward" to the next snapshot and whose deleted text is a reference string that points // "backward" to the prior snapshot. This pins both snapshots in memory but that's better than materializing // giant strings, and when (?) we have paging text storage, memory requirements will be minimal. ITextSnapshot oldSnapshot = this.currentSnapshot; StringRebuilder oldContent = BufferFactoryService.StringRebuilderFromSnapshotSpan(new SnapshotSpan(oldSnapshot, 0, oldSnapshot.Length)); TextChange change = TextChange.Create(oldPosition: 0, oldText: oldContent, newText: newContent, currentSnapshot: oldSnapshot); TextVersion newVersion = this.currentVersion.CreateNext(changes: null, newLength: newContent.Length, reiteratedVersionNumber: -1); TextSnapshot newSnapshot = new TextSnapshot(this, newVersion, newContent); this.currentVersion.SetChanges(NormalizedTextChangeCollection.Create(new TextChange[] { change }, editOptions.ComputeMinimalChange ? (StringDifferenceOptions?)editOptions.DifferenceOptions : null, this.textDifferencingService, oldSnapshot, newSnapshot)); this.currentVersion = newVersion; this.builder = newContent; this.currentSnapshot = newSnapshot; return(new TextContentChangedEventArgs(oldSnapshot, newSnapshot, editOptions, editTag)); }