Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/microsoft/vs-editor-api.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/Text/Impl/TextModel/PersistentSpanSet.cs')
-rw-r--r--src/Text/Impl/TextModel/PersistentSpanSet.cs125
1 files changed, 125 insertions, 0 deletions
diff --git a/src/Text/Impl/TextModel/PersistentSpanSet.cs b/src/Text/Impl/TextModel/PersistentSpanSet.cs
new file mode 100644
index 0000000..8370eeb
--- /dev/null
+++ b/src/Text/Impl/TextModel/PersistentSpanSet.cs
@@ -0,0 +1,125 @@
+//
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See License.txt in the project root for license information.
+//
+// This file contain implementations details that are subject to change without notice.
+// Use at your own risk.
+//
+namespace Microsoft.VisualStudio.Text.Implementation
+{
+ using System;
+ using System.Collections.Generic;
+
+ sealed class PersistentSpanSet : IDisposable
+ {
+ internal FileNameKey FileKey;
+ internal ITextDocument Document;
+ internal readonly HashSet<PersistentSpan> Spans = new HashSet<PersistentSpan>();
+ private readonly PersistentSpanFactory Factory;
+
+ private ITextSnapshot _savedSnapshot = null;
+
+ internal PersistentSpanSet(FileNameKey filePath, ITextDocument document, PersistentSpanFactory factory)
+ {
+ this.FileKey = filePath;
+ this.Document = document;
+ this.Factory = factory;
+
+ if (document != null)
+ {
+ document.FileActionOccurred += this.OnFileActionOccurred;
+ }
+ }
+
+ public void Dispose()
+ {
+ Assumes.True(this.Spans.Count == 0);
+
+ if (this.Document != null)
+ {
+ this.Document.FileActionOccurred -= this.OnFileActionOccurred;
+ this.Document = null;
+ }
+ }
+
+ internal PersistentSpan Create(int startLine, int startIndex, int endLine, int endIndex, SpanTrackingMode trackingMode)
+ {
+ PersistentSpan persistentSpan = new PersistentSpan(startLine, startIndex, endLine, endIndex, trackingMode, this);
+ this.Spans.Add(persistentSpan);
+ return persistentSpan;
+ }
+
+ internal PersistentSpan Create(Span span, SpanTrackingMode trackingMode)
+ {
+ var persistentSpan = new PersistentSpan(span, trackingMode, this);
+ this.Spans.Add(persistentSpan);
+ return persistentSpan;
+ }
+
+ internal PersistentSpan Create(ITextSnapshot snapshot, int startLine, int startIndex, int endLine, int endIndex, SpanTrackingMode trackingMode)
+ {
+ var start = PersistentSpan.LineIndexToSnapshotPoint(startLine, startIndex, snapshot);
+ var end = PersistentSpan.LineIndexToSnapshotPoint(endLine, endIndex, snapshot);
+ if (end < start)
+ {
+ end = start;
+ }
+
+ return this.Create(new SnapshotSpan(start, end), trackingMode);
+ }
+
+ internal PersistentSpan Create(SnapshotSpan span, SpanTrackingMode trackingMode)
+ {
+ var persistentSpan = new PersistentSpan(span, trackingMode, this);
+ this.Spans.Add(persistentSpan);
+ return persistentSpan;
+ }
+
+ internal void Delete(PersistentSpan span)
+ {
+ this.Factory.Delete(this, span);
+ }
+
+ internal void DocumentReopened(ITextDocument document)
+ {
+ Requires.NotNull(document, nameof(document));
+ Assumes.Null(this.Document);
+
+ this.Document = document;
+ document.FileActionOccurred += this.OnFileActionOccurred;
+
+ foreach (var s in this.Spans)
+ {
+ s.DocumentReopened();
+ }
+ }
+
+ internal void DocumentClosed()
+ {
+ Assumes.NotNull(this.Document);
+
+ this.FileKey = new FileNameKey(this.Document.FilePath);
+
+ foreach (var s in this.Spans)
+ {
+ s.DocumentClosed(_savedSnapshot);
+ }
+
+ this.Document.FileActionOccurred -= this.OnFileActionOccurred;
+ this.Document = null;
+ }
+
+ private void OnFileActionOccurred(object sender, TextDocumentFileActionEventArgs e)
+ {
+ if (e.FileActionType == FileActionTypes.ContentSavedToDisk)
+ {
+ _savedSnapshot = this.Document.TextBuffer.CurrentSnapshot;
+ }
+ else if (e.FileActionType == FileActionTypes.DocumentRenamed)
+ {
+ this.FileKey = new FileNameKey(this.Document.FilePath);
+ this.Factory.DocumentRenamed(this);
+ }
+ }
+ }
+}