-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Find best way to open diff view without scrolling to first diff #1631
Description
How diff viewer gets created
We currently use OpenComparisonWindow2 of:
Name: Microsoft.VisualStudio.Shell.Interop.IVsDifferenceService
Assembly: Microsoft.VisualStudio.Shell.Interop.11.0
Which is implemented in:
Name: Microsoft.VisualStudio.Differencing.Package.DiffPackage
Assembly: Microsoft.VisualStudio.Diff
Which opens DiffViewerCodeWindow via IVsUIShellOpenDocument.OpenDocumentViaProjectWithSpecific.
Name: Microsoft.VisualStudio.Differencing.Package.DiffViewerCodeWindow
Assembly: Microsoft.VisualStudio.Diff
.ctor calls _viewer = factory.WpfDifferenceViewerFactoryService.CreateUninitializedDifferenceView();
InitializeViewer calls _viewer.Initialize(differenceBuffer, createTextViewHost, null);
NOTE: The null passed in here is parentOptions below.
Name: Microsoft.VisualStudio.Text.Differencing.IWpfDifferenceViewerFactoryService
Assembly: Microsoft.VisualStudio.Text.UI.Wpf
public interface IWpfDifferenceViewerFactoryService
{
IWpfDifferenceViewer CreateDifferenceView(IDifferenceBuffer buffer, [Optional, DefaultParameterValue(null)] IEditorOptions parentOptions);
IWpfDifferenceViewer CreateDifferenceView(IDifferenceBuffer buffer, CreateTextViewHostCallback callback, [Optional, DefaultParameterValue(null)] IEditorOptions parentOptions);
IWpfDifferenceViewer CreateDifferenceView(IDifferenceBuffer buffer, ITextViewRoleSet roles, [Optional, DefaultParameterValue(null)] IEditorOptions parentOptions);
IWpfDifferenceViewer CreateUninitializedDifferenceView(); IWpfDifferenceViewer TryGetViewerForTextView(ITextView textView);
}Implemented in:
Name: Microsoft.VisualStudio.Text.Differencing.Implementation.DifferenceViewerFactoryService
Assembly: Microsoft.VisualStudio.Platform.VSEditor
Initialize calls:
// OptionsFactory is IEditorOptionsFactoryService
this.Options = this._factory.OptionsFactory.GetOptions(this);
if (parentOptions != null)
{
this.Options.Parent = parentOptions;
}
...
if (this.Options.GetOptionValue<bool>(DifferenceViewerOptions.ScrollToFirstDiffId))
{
if (this.DifferenceBuffer.CurrentSnapshotDifference != null)
{
this.ScrollToFirstChange();
}
}Summary
We really need to be able to pass in parentOptions, but this gets set to null using the IVsDifferenceService / DiffViewerCodeWindow.
The best alternative solution I can think of is to temporarily set DifferenceViewerOptions.ScrollToFirstDiffId to false via a global option.
This is what I'm doing here: 84a5e93