protected virtual void SetupNewTextView(IVsTextView textView) { Contract.ThrowIfNull(textView); var wpfTextView = EditorAdaptersFactoryService.GetWpfTextView(textView); Contract.ThrowIfNull(wpfTextView, "Could not get IWpfTextView for IVsTextView"); Debug.Assert(!wpfTextView.Properties.ContainsProperty(typeof(AbstractVsTextViewFilter))); var workspace = Package.ComponentModel.GetService <VisualStudioWorkspace>(); // The lifetime of CommandFilter is married to the view wpfTextView.GetOrCreateAutoClosingProperty(v => new StandaloneCommandFilter( v, Package.ComponentModel).AttachToVsTextView()); var isMetadataAsSource = false; var collapseAllImplementations = false; var openDocument = wpfTextView.TextBuffer.AsTextContainer().GetRelatedDocuments().FirstOrDefault(); if (openDocument?.Project.Solution.Workspace is MetadataAsSourceWorkspace masWorkspace) { isMetadataAsSource = true; // If the file is metadata as source, and the user has the preference set to collapse them, then // always collapse all metadata as source var globalOptions = this.Package.ComponentModel.GetService <IGlobalOptionService>(); var options = BlockStructureOptionsStorage.GetBlockStructureOptions(globalOptions, openDocument.Project.Language, isMetadataAsSource: masWorkspace is not null); collapseAllImplementations = masWorkspace.FileService.ShouldCollapseOnOpen(openDocument.FilePath, options); } ConditionallyCollapseOutliningRegions(textView, wpfTextView, collapseAllImplementations); // If this is a metadata-to-source view, we want to consider the file read-only and prevent // it from being re-opened when VS is opened if (isMetadataAsSource && ErrorHandler.Succeeded(textView.GetBuffer(out var vsTextLines))) { Contract.ThrowIfNull(openDocument); ErrorHandler.ThrowOnFailure(vsTextLines.GetStateFlags(out var flags)); flags |= (int)BUFFERSTATEFLAGS.BSF_USER_READONLY; ErrorHandler.ThrowOnFailure(vsTextLines.SetStateFlags(flags)); var runningDocumentTable = (IVsRunningDocumentTable)SystemServiceProvider.GetService(typeof(SVsRunningDocumentTable)); var runningDocumentTable4 = (IVsRunningDocumentTable4)runningDocumentTable; if (runningDocumentTable4.IsMonikerValid(openDocument.FilePath)) { var cookie = runningDocumentTable4.GetDocumentCookie(openDocument.FilePath); runningDocumentTable.ModifyDocumentFlags(cookie, (uint)_VSRDTFLAGS.RDT_DontAddToMRU | (uint)_VSRDTFLAGS.RDT_CantSave | (uint)_VSRDTFLAGS.RDT_DontAutoOpen, fSet: 1); } } }
protected virtual void SetupNewTextView(IVsTextView textView) { Contract.ThrowIfNull(textView); var wpfTextView = EditorAdaptersFactoryService.GetWpfTextView(textView); Contract.ThrowIfNull(wpfTextView, "Could not get IWpfTextView for IVsTextView"); Debug.Assert(!wpfTextView.Properties.ContainsProperty(typeof(AbstractVsTextViewFilter <TPackage, TLanguageService>))); var commandHandlerFactory = Package.ComponentModel.GetService <ICommandHandlerServiceFactory>(); var workspace = Package.ComponentModel.GetService <VisualStudioWorkspace>(); // The lifetime of CommandFilter is married to the view wpfTextView.GetOrCreateAutoClosingProperty(v => new StandaloneCommandFilter <TPackage, TLanguageService>( (TLanguageService)this, v, commandHandlerFactory, EditorAdaptersFactoryService).AttachToVsTextView()); // Ensure we start sending save events var saveEventsService = Package.ComponentModel.GetService <SaveEventsService>(); saveEventsService.StartSendingSaveEvents(); var openDocument = wpfTextView.TextBuffer.AsTextContainer().GetRelatedDocuments().FirstOrDefault(); var isOpenMetadataAsSource = openDocument != null && openDocument.Project.Solution.Workspace.Kind == WorkspaceKind.MetadataAsSource; ConditionallyCollapseOutliningRegions(textView, wpfTextView, workspace, isOpenMetadataAsSource); // If this is a metadata-to-source view, we want to consider the file read-only if (isOpenMetadataAsSource && ErrorHandler.Succeeded(textView.GetBuffer(out var vsTextLines))) { ((IVsTextBuffer)vsTextLines).SetStateFlags((uint)BUFFERSTATEFLAGS.BSF_USER_READONLY); var runningDocumentTable = (IVsRunningDocumentTable)SystemServiceProvider.GetService(typeof(SVsRunningDocumentTable)); var runningDocumentTable4 = (IVsRunningDocumentTable4)runningDocumentTable; if (runningDocumentTable4.IsMonikerValid(openDocument.FilePath)) { var cookie = runningDocumentTable4.GetDocumentCookie(openDocument.FilePath); runningDocumentTable.ModifyDocumentFlags(cookie, (uint)_VSRDTFLAGS.RDT_DontAddToMRU | (uint)_VSRDTFLAGS.RDT_CantSave, fSet: 1); } } }
protected virtual void SetupNewTextView(IVsTextView textView) { Contract.ThrowIfNull(textView); var wpfTextView = EditorAdaptersFactoryService.GetWpfTextView(textView); Contract.ThrowIfNull(wpfTextView, "Could not get IWpfTextView for IVsTextView"); Debug.Assert(!wpfTextView.Properties.ContainsProperty(typeof(AbstractVsTextViewFilter))); var workspace = Package.ComponentModel.GetService <VisualStudioWorkspace>(); // The lifetime of CommandFilter is married to the view wpfTextView.GetOrCreateAutoClosingProperty(v => new StandaloneCommandFilter( v, Package.ComponentModel).AttachToVsTextView()); var openDocument = wpfTextView.TextBuffer.AsTextContainer().GetRelatedDocuments().FirstOrDefault(); var isOpenMetadataAsSource = openDocument != null && openDocument.Project.Solution.Workspace.Kind == WorkspaceKind.MetadataAsSource; // If the file is metadata as source, and the user has the preference set to collapse them, then // always collapse all metadata as source var collapseAllImplementations = isOpenMetadataAsSource && workspace.Options.GetOption <bool>(BlockStructureOptionsStorage.CollapseMetadataImplementationsWhenFirstOpened, openDocument.Project.Language); ConditionallyCollapseOutliningRegions(textView, wpfTextView, collapseAllImplementations); // If this is a metadata-to-source view, we want to consider the file read-only if (isOpenMetadataAsSource && ErrorHandler.Succeeded(textView.GetBuffer(out var vsTextLines))) { ((IVsTextBuffer)vsTextLines).SetStateFlags((uint)BUFFERSTATEFLAGS.BSF_USER_READONLY); var runningDocumentTable = (IVsRunningDocumentTable)SystemServiceProvider.GetService(typeof(SVsRunningDocumentTable)); var runningDocumentTable4 = (IVsRunningDocumentTable4)runningDocumentTable; if (runningDocumentTable4.IsMonikerValid(openDocument.FilePath)) { var cookie = runningDocumentTable4.GetDocumentCookie(openDocument.FilePath); runningDocumentTable.ModifyDocumentFlags(cookie, (uint)_VSRDTFLAGS.RDT_DontAddToMRU | (uint)_VSRDTFLAGS.RDT_CantSave, fSet: 1); } } }
protected override void SetupNewTextView(IVsTextView textView) { Contract.ThrowIfNull(textView); var wpfTextView = EditorAdaptersFactoryService.GetWpfTextView(textView); Contract.ThrowIfNull(wpfTextView, "Could not get IWpfTextView for IVsTextView"); Contract.Assert(!wpfTextView.Properties.ContainsProperty(typeof(AbstractVsTextViewFilter <TPackage, TLanguageService, TProject>))); var commandHandlerFactory = Package.ComponentModel.GetService <ICommandHandlerServiceFactory>(); var workspace = Package.ComponentModel.GetService <VisualStudioWorkspace>(); var optionsService = workspace.Services.GetService <IOptionService>(); // The lifetime of CommandFilter is married to the view wpfTextView.GetOrCreateAutoClosingProperty(v => new StandaloneCommandFilter <TPackage, TLanguageService, TProject>( (TLanguageService)this, v, commandHandlerFactory, optionsService, EditorAdaptersFactoryService).AttachToVsTextView()); var openDocument = wpfTextView.TextBuffer.AsTextContainer().GetRelatedDocuments().FirstOrDefault(); bool isOpenMetadataAsSource = openDocument != null && openDocument.Project.Solution.Workspace.Kind == WorkspaceKind.MetadataAsSource; var outliningManagerService = this.Package.ComponentModel.GetService <IOutliningManagerService>(); var outliningManager = outliningManagerService.GetOutliningManager(wpfTextView); if (!optionsService.GetOption(FeatureOnOffOptions.Outlining, this.RoslynLanguageName)) { outliningManager.Enabled = false; } else { var viewEx = textView as IVsTextViewEx; if (viewEx != null) { // We need to get our outlining tag source to notify it to start blocking var outliningTaggerProvider = this.Package.ComponentModel.GetService <OutliningTaggerProvider>(); // If this file is a metadata-from-source file, we want to force-collapse if (isOpenMetadataAsSource) { var subjectBuffer = wpfTextView.TextBuffer; var snapshot = subjectBuffer.CurrentSnapshot; var fullSpan = snapshot.GetFullSpan(); var tagger = outliningTaggerProvider.CreateTagger <IOutliningRegionTag>(subjectBuffer); using (var disposable = tagger as IDisposable) { tagger.GetAllTags(new NormalizedSnapshotSpanCollection(fullSpan), CancellationToken.None); outliningManager.CollapseAll(fullSpan, c => c.Tag.IsImplementation); } } else { // Set the initial outlining state by reading from the suo file, this operation requires // us to synchronously compute the outlining region tags. viewEx.PersistOutliningState(); } } } // If this is a metadata-to-source view, we want to consider the file read-only IVsTextLines vsTextLines; if (isOpenMetadataAsSource && ErrorHandler.Succeeded(textView.GetBuffer(out vsTextLines))) { ((IVsTextBuffer)vsTextLines).SetStateFlags((uint)BUFFERSTATEFLAGS.BSF_USER_READONLY); var runningDocumentTable = (IVsRunningDocumentTable)SystemServiceProvider.GetService(typeof(SVsRunningDocumentTable)); var runningDocumentTable4 = (IVsRunningDocumentTable4)runningDocumentTable; if (runningDocumentTable4.IsMonikerValid(openDocument.FilePath)) { var cookie = runningDocumentTable4.GetDocumentCookie(openDocument.FilePath); runningDocumentTable.ModifyDocumentFlags(cookie, (uint)_VSRDTFLAGS.RDT_DontAddToMRU | (uint)_VSRDTFLAGS.RDT_CantSave, fSet: 1); } } }
protected override void SetupNewTextView(IVsTextView textView) { Contract.ThrowIfNull(textView); var wpfTextView = EditorAdaptersFactoryService.GetWpfTextView(textView); Contract.ThrowIfNull(wpfTextView, "Could not get IWpfTextView for IVsTextView"); Contract.Assert(!wpfTextView.Properties.ContainsProperty(typeof(AbstractVsTextViewFilter <TPackage, TLanguageService, TProject>))); var commandHandlerFactory = Package.ComponentModel.GetService <ICommandHandlerServiceFactory>(); var workspace = Package.ComponentModel.GetService <VisualStudioWorkspace>(); var optionsService = workspace.Services.GetService <IOptionService>(); // The lifetime of CommandFilter is married to the view wpfTextView.GetOrCreateAutoClosingProperty(v => new StandaloneCommandFilter <TPackage, TLanguageService, TProject>( (TLanguageService)this, v, commandHandlerFactory, optionsService, EditorAdaptersFactoryService).AttachToVsTextView()); var openDocument = wpfTextView.TextBuffer.AsTextContainer().GetRelatedDocuments().FirstOrDefault(); var isOpenMetadataAsSource = openDocument != null && openDocument.Project.Solution.Workspace.Kind == WorkspaceKind.MetadataAsSource; var outliningManagerService = this.Package.ComponentModel.GetService <IOutliningManagerService>(); var outliningManager = outliningManagerService.GetOutliningManager(wpfTextView); if (!optionsService.GetOption(FeatureOnOffOptions.Outlining, this.RoslynLanguageName)) { outliningManager.Enabled = false; } else { var viewEx = textView as IVsTextViewEx; if (viewEx != null) { if (isOpenMetadataAsSource) { // If this file is a metadata-from-source file, we want to force-collapse any implementations. // First make sure we know what all the outlining spans are. Then ask the outlining mananger // to collapse all the implementation spans. EnsureOutliningTagsComputed(wpfTextView); outliningManager.CollapseAll(wpfTextView.TextBuffer.CurrentSnapshot.GetFullSpan(), c => c.Tag.IsImplementation); } else { // We also want to automatically collapse any region tags *on the first // load of a file* if the file contains them. In order to not do expensive // parsing, we only do this if the file contains #region in it. if (ContainsRegionTag(wpfTextView.TextSnapshot)) { // Make sure we at least know what the outlining spans are. // Then when we call PersistOutliningState below the editor will // get these outlining tags and automatically collapse any // IsDefaultCollapsed spans the first time around. // // If it is not the first time opening a file, VS will simply use // the data stored in the SUO file. EnsureOutliningTagsComputed(wpfTextView); } viewEx.PersistOutliningState(); } } } // If this is a metadata-to-source view, we want to consider the file read-only IVsTextLines vsTextLines; if (isOpenMetadataAsSource && ErrorHandler.Succeeded(textView.GetBuffer(out vsTextLines))) { ((IVsTextBuffer)vsTextLines).SetStateFlags((uint)BUFFERSTATEFLAGS.BSF_USER_READONLY); var runningDocumentTable = (IVsRunningDocumentTable)SystemServiceProvider.GetService(typeof(SVsRunningDocumentTable)); var runningDocumentTable4 = (IVsRunningDocumentTable4)runningDocumentTable; if (runningDocumentTable4.IsMonikerValid(openDocument.FilePath)) { var cookie = runningDocumentTable4.GetDocumentCookie(openDocument.FilePath); runningDocumentTable.ModifyDocumentFlags(cookie, (uint)_VSRDTFLAGS.RDT_DontAddToMRU | (uint)_VSRDTFLAGS.RDT_CantSave, fSet: 1); } } }