using System.ComponentModel.Composition;
using System.Windows;
using System.Windows.Shapes;
using System.Windows.Media;
using System.Windows.Controls;
using Microsoft.VisualStudio.Text;
using Microsoft.VisualStudio.Text.Editor;
using Microsoft.VisualStudio.Text.Formatting;
using Microsoft.VisualStudio.Text.Tagging;
using Microsoft.VisualStudio.Utilities;
public UIElement GenerateGlyph(IWpfTextViewLine line, IGlyphTag tag)
{
// Ensure we can draw a glyph for this marker.
if (tag == null || !(tag is TodoTag))
{
return null;
}
System.Windows.Shapes.Ellipse ellipse = new Ellipse();
ellipse.Fill = Brushes.LightBlue;
ellipse.StrokeThickness = 2;
ellipse.Stroke = Brushes.DarkBlue;
ellipse.Height = m_glyphSize;
ellipse.Width = m_glyphSize;
return ellipse;
}
Public Function GenerateGlyph(ByVal line As IWpfTextViewLine, ByVal tag As IGlyphTag) As System.Windows.UIElement Implements IGlyphFactory.GenerateGlyph
' Ensure we can draw a glyph for this marker.
If tag Is Nothing OrElse Not (TypeOf tag Is TodoTag) Then
Return Nothing
End If
Dim ellipse As Ellipse = New Ellipse()
ellipse.Fill = Brushes.LightBlue
ellipse.StrokeThickness = 2
ellipse.Stroke = Brushes.DarkBlue
ellipse.Height = m_glyphSize
ellipse.Width = m_glyphSize
Return ellipse
End Function
public IGlyphFactory GetGlyphFactory(IWpfTextView view, IWpfTextViewMargin margin)
{
return new TodoGlyphFactory();
}
Public Function GetGlyphFactory(ByVal view As IWpfTextView, ByVal margin As IWpfTextViewMargin) As IGlyphFactory Implements IGlyphFactoryProvider.GetGlyphFactory
Return New TodoGlyphFactory()
End Function
Todo 태그 및 태거 정의
이전 단계에서 정의한 UI 요소와 표시기 여백 간 관계를 정의합니다. 태그 형식 및 태거를 만들고 태거 공급자를 사용하여 내보냅니다.
using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using Microsoft.VisualStudio.Text;
using Microsoft.VisualStudio.Text.Tagging;
using Microsoft.VisualStudio.Text.Editor;
using Microsoft.VisualStudio.Text.Classification;
using Microsoft.VisualStudio.Utilities;
IEnumerable<ITagSpan<TodoTag>> ITagger<TodoTag>.GetTags(NormalizedSnapshotSpanCollection spans)
{
foreach (SnapshotSpan span in spans)
{
//look at each classification span \
foreach (ClassificationSpan classification in m_classifier.GetClassificationSpans(span))
{
//if the classification is a comment
if (classification.ClassificationType.Classification.ToLower().Contains("comment"))
{
//if the word "todo" is in the comment,
//create a new TodoTag TagSpan
int index = classification.Span.GetText().ToLower().IndexOf(m_searchText);
if (index != -1)
{
yield return new TagSpan<TodoTag>(new SnapshotSpan(classification.Span.Start + index, m_searchText.Length), new TodoTag());
}
}
}
}
}
Private Function GetTags(ByVal spans As NormalizedSnapshotSpanCollection) As IEnumerable(Of ITagSpan(Of TodoTag)) Implements ITagger(Of TodoTag).GetTags
Dim list As List(Of ITagSpan(Of TodoTag))
list = New List(Of ITagSpan(Of TodoTag))()
For Each span As SnapshotSpan In spans
'look at each classification span \
For Each classification As ClassificationSpan In m_classifier.GetClassificationSpans(span)
'if the classification is a comment
If classification.ClassificationType.Classification.ToLower().Contains("comment") Then
'if the word "todo" is in the comment,
'create a new TodoTag TagSpan
Dim index As Integer = classification.Span.GetText().ToLower().IndexOf(m_searchText)
If index <> -1 Then
list.Add(New TagSpan(Of TodoTag)(New SnapshotSpan(classification.Span.Start + index, m_searchText.Length), New TodoTag()))
End If
End If
Next classification
Next span
Return list
End Function
public event EventHandler<SnapshotSpanEventArgs> TagsChanged;
Public Event TagsChanged(ByVal sender As Object, ByVal e As Microsoft.VisualStudio.Text.SnapshotSpanEventArgs) Implements Microsoft.VisualStudio.Text.Tagging.ITagger(Of TodoTag).TagsChanged
public ITagger<T> CreateTagger<T>(ITextBuffer buffer) where T : ITag
{
if (buffer == null)
{
throw new ArgumentNullException("buffer");
}
return new TodoTagger(AggregatorService.GetClassifier(buffer)) as ITagger<T>;
}
Public Function CreateTagger(Of T As Microsoft.VisualStudio.Text.Tagging.ITag)(ByVal buffer As Microsoft.VisualStudio.Text.ITextBuffer) As Microsoft.VisualStudio.Text.Tagging.ITagger(Of T) Implements Microsoft.VisualStudio.Text.Tagging.ITaggerProvider.CreateTagger
If buffer Is Nothing Then
Throw New ArgumentNullException("buffer")
End If
Return TryCast(New TodoTagger(AggregatorService.GetClassifier(buffer)), ITagger(Of T))
End Function
코드 빌드 및 테스트
이 코드를 테스트하려면 TodoGlyphTest 솔루션을 빌드하고 실험적 인스턴스에서 실행합니다.
TodoGlyphTest 솔루션을 빌드하고 테스트하려면
솔루션을 빌드합니다.
F5 키를 눌러 프로젝트를 실행합니다. Visual Studio의 두 번째 인스턴스가 시작됩니다.
표시기 여백이 표시되는지 확인합니다. (도구 메뉴에서 옵션을 클릭합니다. 텍스트 편집기 페이지에서 표시기 여백이 선택되어 있는지 확인합니다.)
주석이 있는 코드 파일을 엽니다. 주석 섹션 중 하나에 “todo”라는 단어를 추가합니다.