Skip to content

Commit

Permalink
Showing 10 changed files with 548 additions and 782 deletions.
7 changes: 2 additions & 5 deletions Codist/Codist.csproj
Original file line number Diff line number Diff line change
@@ -104,14 +104,11 @@
<Compile Include="Helpers\WpfHelper.cs" />
<Compile Include="Helpers\XmlDocParser.cs" />
<Compile Include="LineTransformers\LineHeightTransform.cs" />
<Compile Include="Margins\CommentMargin.cs" />
<Compile Include="Margins\LineNumberMargin.cs" />
<Compile Include="Margins\LineNumberMarginElement.cs" />
<Compile Include="Margins\CSharpMembersMargin.cs" />
<Compile Include="Margins\CommentMarginElement.cs" />
<Compile Include="Margins\LineNumberMargin.cs" />
<Compile Include="Margins\LineNumberMarginFactory.cs" />
<Compile Include="Margins\CommentMarginFactory.cs" />
<Compile Include="Margins\CSharpMembersMargin.cs" />
<Compile Include="Margins\CSharpMembersMarginElement.cs" />
<Compile Include="Margins\CSharpMembersMarginFactory.cs" />
<Compile Include="Margins\MarkerStyle.cs" />
<Compile Include="Options\CommentTaggerOptionPage.cs">
448 changes: 413 additions & 35 deletions Codist/Margins/CSharpMembersMargin.cs

Large diffs are not rendered by default.

440 changes: 0 additions & 440 deletions Codist/Margins/CSharpMembersMarginElement.cs

This file was deleted.

7 changes: 2 additions & 5 deletions Codist/Margins/CSharpMembersMarginFactory.cs
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
using System.ComponentModel.Composition;
using AppHelpers;
using Microsoft.VisualStudio.Text.Classification;
using Microsoft.VisualStudio.Text.Editor;
using Microsoft.VisualStudio.Text.OverviewMargin;
using Microsoft.VisualStudio.Text.Tagging;
using Microsoft.VisualStudio.Utilities;

namespace Codist.Margins
{
[Export(typeof(IWpfTextViewMarginProvider))]
[Name(CSharpMembersMargin.Name)]
[Name(CSharpMembersMargin.MarginName)]
[Order(After = PredefinedMarginNames.OverviewChangeTracking, Before = CommentMargin.MarginName)]
[MarginContainer(PredefinedMarginNames.VerticalScrollBar)]
[ContentType(Constants.CodeTypes.CSharp)]
@@ -23,7 +20,7 @@ sealed class CSharpMembersMarginFactory : IWpfTextViewMarginProvider
/// <param name="containerMargin">The margin that will contain the newly-created margin.</param>
public IWpfTextViewMargin CreateMargin(IWpfTextViewHost textViewHost, IWpfTextViewMargin containerMargin) {
var scrollBar = containerMargin as IVerticalScrollBar;
return Config.Instance.Features.MatchFlags(Features.ScrollbarMarkers) && scrollBar != null ? new CSharpMembersMargin(textViewHost, scrollBar, this) : null;
return Config.Instance.Features.MatchFlags(Features.ScrollbarMarkers) && scrollBar != null ? new CSharpMembersMargin(textViewHost.TextView, scrollBar) : null;
}
}
}
126 changes: 0 additions & 126 deletions Codist/Margins/CommentMargin.cs

This file was deleted.

19 changes: 16 additions & 3 deletions Codist/Margins/CommentMarginElement.cs
Original file line number Diff line number Diff line change
@@ -8,12 +8,13 @@
using Microsoft.VisualStudio.Text;
using Microsoft.VisualStudio.Text.Classification;
using Microsoft.VisualStudio.Text.Editor;
using Microsoft.VisualStudio.Text.Tagging;

namespace Codist.Margins
{
sealed class CommentMarginElement : FrameworkElement, IDisposable
sealed class CommentMargin : FrameworkElement, IWpfTextViewMargin
{
public const string MarginName = nameof(CommentMargin);

readonly IWpfTextView _TextView;
readonly IEditorFormatMap _EditorFormatMap;
readonly IVerticalScrollBar _ScrollBar;
@@ -55,7 +56,7 @@ sealed class CommentMarginElement : FrameworkElement, IDisposable
const double MarkSize = 4.0;
const double HalfMarkSize = MarkSize / 2 + MarkPadding;

public CommentMarginElement(IWpfTextView textView, ITagAggregator<ClassificationTag> tagger, IVerticalScrollBar verticalScrollbar) {
public CommentMargin(IWpfTextView textView, IVerticalScrollBar verticalScrollbar) {
_TextView = textView;

IsHitTestVisible = false;
@@ -75,6 +76,14 @@ public CommentMarginElement(IWpfTextView textView, ITagAggregator<Classification
_ScrollBar.TrackSpanChanged += OnMappingChanged;
}

FrameworkElement IWpfTextViewMargin.VisualElement => this;
double ITextViewMargin.MarginSize => ActualWidth;
bool ITextViewMargin.Enabled => true;

ITextViewMargin ITextViewMargin.GetTextViewMargin(string marginName) {
return string.Equals(marginName, MarginName, StringComparison.OrdinalIgnoreCase) ? this : null;
}

void Config_Updated(object sender, ConfigUpdatedEventArgs e) {
if (e.UpdatedFeature.HasAnyFlag(Features.SyntaxHighlight | Features.ScrollbarMarkers) == false) {
return;
@@ -269,6 +278,10 @@ void Dispose(bool disposing) {
public void Dispose() {
Dispose(true);
}

void IDisposable.Dispose() {
throw new NotImplementedException();
}
#endregion
}
}
6 changes: 2 additions & 4 deletions Codist/Margins/CommentMarginFactory.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
using System.ComponentModel.Composition;
using Microsoft.VisualStudio.Text.Classification;
using AppHelpers;
using Microsoft.VisualStudio.Text.Editor;
using Microsoft.VisualStudio.Text.Tagging;
using Microsoft.VisualStudio.Utilities;
using AppHelpers;

namespace Codist.Margins
{
@@ -31,7 +29,7 @@ sealed class CommentMarginFactory : IWpfTextViewMarginProvider
public IWpfTextViewMargin CreateMargin(IWpfTextViewHost wpfTextViewHost, IWpfTextViewMargin marginContainer) {
var scrollBarContainer = marginContainer as IVerticalScrollBar;
return Config.Instance.Features.MatchFlags(Features.ScrollbarMarkers) && scrollBarContainer != null
? new CommentMargin(wpfTextViewHost, scrollBarContainer)
? new CommentMargin(wpfTextViewHost.TextView, scrollBarContainer)
: null;
}

141 changes: 111 additions & 30 deletions Codist/Margins/LineNumberMargin.cs
Original file line number Diff line number Diff line change
@@ -1,56 +1,137 @@
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using AppHelpers;
using Codist.Classifiers;
using Microsoft.VisualStudio.Text;
using Microsoft.VisualStudio.Text.Classification;
using Microsoft.VisualStudio.Text.Editor;
using Microsoft.VisualStudio.Text.Tagging;

namespace Codist.Margins
{
/// <summary>
/// Margin's canvas and visual definition including both size and content
/// </summary>
sealed class LineNumberMargin : Canvas, IWpfTextViewMargin
sealed class LineNumberMargin : FrameworkElement, IDisposable, IWpfTextViewMargin
{
/// <summary>
/// Margin name.
/// </summary>
public const string MarginName = nameof(LineNumberMargin);
const double LineNumberRenderPadding = -3;
readonly IWpfTextView _TextView;
readonly IEditorFormatMap _EditorFormatMap;
readonly IVerticalScrollBar _ScrollBar;
readonly TaggerResult _Tags;

readonly LineNumberMarginElement _LineNumberMarginElement;
readonly IWpfTextViewHost _TextView;
bool isDisposed;
static readonly SolidColorBrush LineNumberBrush = Brushes.DarkGray;
static readonly Pen LineNumberPen = new Pen(LineNumberBrush, 1) { DashStyle = DashStyles.Dash };

/// <summary>
/// Initializes a new instance of the <see cref="LineNumberMargin"/> class for a given <paramref name="textView"/>.
/// </summary>
/// <param name="textView">The <see cref="IWpfTextView"/> to attach the margin to.</param>
public LineNumberMargin(IWpfTextViewHost textView, IVerticalScrollBar scrollBar, LineNumberMarginFactory container) {
_LineNumberMarginElement = new LineNumberMarginElement(textView.TextView, scrollBar);
textView.Closed += TextView_Closed;
double _ScrollbarWidth;

public LineNumberMargin(IWpfTextView textView, IVerticalScrollBar scrollBar) {
_TextView = textView;

IsHitTestVisible = false;

_ScrollBar = scrollBar;
_Tags = textView.Properties.GetOrCreateSingletonProperty(() => new TaggerResult());
_EditorFormatMap = ServicesHelper.Instance.EditorFormatMap.GetEditorFormatMap(textView);

Width = 0;

Visibility = Config.Instance.MarkerOptions.MatchFlags(MarkerOptions.LineNumber) ? Visibility.Visible : Visibility.Collapsed;
Config.Updated += Config_Updated;
_TextView.TextBuffer.Changed += TextView_TextBufferChanged;
_ScrollBar.TrackSpanChanged += OnMappingChanged;
_TextView.Closed += (s, args) => Dispose();
}

public FrameworkElement VisualElement => this;
public double MarginSize => ActualWidth;
public bool Enabled => true;

public double MarginSize => _LineNumberMarginElement.ActualWidth;
public ITextViewMargin GetTextViewMargin(string marginName) {
return string.Equals(marginName, MarginName, StringComparison.OrdinalIgnoreCase) ? this : null;
}

public FrameworkElement VisualElement => _LineNumberMarginElement;
void Config_Updated(object sender, ConfigUpdatedEventArgs e) {
if (e.UpdatedFeature.MatchFlags(Features.ScrollbarMarkers) == false) {
return;
}
var setVisible = Config.Instance.MarkerOptions.MatchFlags(MarkerOptions.LineNumber);
var visible = Visibility == Visibility.Visible;
if (setVisible == false && visible) {
Visibility = Visibility.Collapsed;
_TextView.TextBuffer.Changed -= TextView_TextBufferChanged;
_ScrollBar.TrackSpanChanged -= OnMappingChanged;
InvalidateVisual();
}
else if (setVisible && visible == false) {
Visibility = Visibility.Visible;
_TextView.TextBuffer.Changed += TextView_TextBufferChanged;
_ScrollBar.TrackSpanChanged += OnMappingChanged;
InvalidateVisual();
}
}

public void Dispose() {
if (!isDisposed) {
_TextView.Closed -= TextView_Closed;
GC.SuppressFinalize(this);
isDisposed = true;
void TextView_TextBufferChanged(object sender, TextContentChangedEventArgs args) {
if (args.Changes.Count == 0) {
return;
}
InvalidateVisual();
}

public ITextViewMargin GetTextViewMargin(string marginName) {
return string.Equals(marginName, MarginName, StringComparison.OrdinalIgnoreCase) ? this : null;
/// <summary>
/// Handler for the scrollbar changing its coordinate mapping.
/// </summary>
void OnMappingChanged(object sender, EventArgs e) {
InvalidateVisual();
}
/// <summary>
/// Override for the FrameworkElement's OnRender. When called, redraw all markers.
/// </summary>
/// <param name="drawingContext">The <see cref="DrawingContext"/> used to render the margin.</param>
protected override void OnRender(DrawingContext drawingContext) {
base.OnRender(drawingContext);
if (_TextView.IsClosed) {
return;
}
if (Config.Instance.MarkerOptions.MatchFlags(MarkerOptions.LineNumber)) {
DrawLineNumbers(drawingContext);
}
}

protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo) {
base.OnRenderSizeChanged(sizeInfo);
_ScrollbarWidth = (_ScrollBar as FrameworkElement).ActualWidth + LineNumberRenderPadding;
}

void TextView_Closed(object sender, EventArgs e) {
_LineNumberMarginElement.Dispose();
void DrawLineNumbers(DrawingContext drawingContext) {
var snapshot = _TextView.TextSnapshot;
var lc = snapshot.LineCount;
var step = lc < 500 ? 50 : lc < 2000 ? 100 : lc < 3000 ? 200 : lc < 5000 ? 500 : lc < 20000 ? 1000 : lc < 100000 ? 5000 : 10000;
for (int i = step; i < lc; i += step) {
var y = _ScrollBar.GetYCoordinateOfBufferPosition(new SnapshotPoint(snapshot, snapshot.GetLineFromLineNumber(i - 1).Start));
drawingContext.DrawLine(LineNumberPen, new Point(-100, y), new Point(100, y));
var t = WpfHelper.ToFormattedText(i.ToString(), 9, LineNumberBrush);
drawingContext.DrawText(t, new Point(_ScrollbarWidth - t.Width, y));
}
}

#region IDisposable Support
bool disposedValue = false;

void Dispose(bool disposing) {
if (!disposedValue) {
if (disposing) {
//_TextView.VisualElement.IsVisibleChanged -= OnViewOrMarginVisiblityChanged;
Config.Updated -= Config_Updated;
_TextView.TextBuffer.Changed -= TextView_TextBufferChanged;
_ScrollBar.TrackSpanChanged += OnMappingChanged;
}

disposedValue = true;
}
}

public void Dispose() {
Dispose(true);
}
#endregion
}
}
126 changes: 0 additions & 126 deletions Codist/Margins/LineNumberMarginElement.cs

This file was deleted.

10 changes: 2 additions & 8 deletions Codist/Margins/LineNumberMarginFactory.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
using System.ComponentModel.Composition;
using AppHelpers;
using Microsoft.VisualStudio.Text.Classification;
using Microsoft.VisualStudio.Text.Editor;
using Microsoft.VisualStudio.Text.Tagging;
using Microsoft.VisualStudio.Utilities;

namespace Codist.Margins
@@ -11,19 +9,15 @@ namespace Codist.Margins
[Name(LineNumberMargin.MarginName)]
[Order(Before = PredefinedMarginNames.OverviewChangeTracking)]
[MarginContainer(PredefinedMarginNames.VerticalScrollBar)]
[ContentType("text")]
[ContentType(Constants.CodeTypes.Text)]
[TextViewRole(PredefinedTextViewRoles.Interactive)]
sealed class LineNumberMarginFactory : IWpfTextViewMarginProvider
{
#region IWpfTextViewMarginProvider

public IWpfTextViewMargin CreateMargin(IWpfTextViewHost wpfTextViewHost, IWpfTextViewMargin marginContainer) {
var scrollBarContainer = marginContainer as IVerticalScrollBar;
return Config.Instance.Features.MatchFlags(Features.ScrollbarMarkers) && scrollBarContainer != null
? new LineNumberMargin(wpfTextViewHost, scrollBarContainer, this)
? new LineNumberMargin(wpfTextViewHost.TextView, scrollBarContainer)
: null;
}

#endregion
}
}

0 comments on commit 2ea94fd

Please sign in to comment.