blob: 100773db9770b5145bf19b0d055ec623902738e1 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using Microsoft.VisualStudio.Text;
using Microsoft.VisualStudio.Text.Editor;
using Microsoft.VisualStudio.Text.Editor.Commanding;
using Microsoft.VisualStudio.Text.Projection;
using Microsoft.VisualStudio.Text.Utilities;
using Microsoft.VisualStudio.Utilities;
namespace Microsoft.VisualStudio.UI.Text.Commanding.Implementation
{
[Export(typeof(ICommandingTextBufferResolverProvider))]
[ContentType("any")]
internal class DefaultBufferResolverProvider : ICommandingTextBufferResolverProvider
{
public ICommandingTextBufferResolver CreateResolver(ITextView textView)
{
return new DefaultBufferResolver(textView);
}
}
internal class DefaultBufferResolver : ICommandingTextBufferResolver
{
private readonly ITextView _textView;
public DefaultBufferResolver(ITextView textView)
{
_textView = textView ?? throw new ArgumentNullException(nameof(textView));
}
public IEnumerable<ITextBuffer> ResolveBuffersForCommand<TArgs>() where TArgs : EditorCommandArgs
{
var sourceSnapshotPoints = new FrugalList<SnapshotPoint>(new[] { _textView.Caret.Position.BufferPosition });
var resolvedBuffers = new FrugalList<ITextBuffer>();
for (int i = 0; i < sourceSnapshotPoints.Count; i++)
{
SnapshotPoint curSnapshotPoint = sourceSnapshotPoints[i];
if (curSnapshotPoint.Snapshot is IProjectionSnapshot curProjectionSnapshot)
{
sourceSnapshotPoints.AddRange(curProjectionSnapshot.MapToSourceSnapshots(curSnapshotPoint));
}
// As the set of buffers isn't likely to exceed 5, just use the list to determine whether we've seen it before
ITextBuffer curBuffer = curSnapshotPoint.Snapshot.TextBuffer;
if (!resolvedBuffers.Contains(curBuffer))
{
resolvedBuffers.Add(curBuffer);
}
}
return resolvedBuffers;
}
}
}
|