internal IEnumerable <IVsTextView> GetTextViews(ITextBuffer textBuffer) { var vsTextBuffer = _editorAdaptersFactoryService.GetBufferAdapter(textBuffer); if (vsTextBuffer == null) { return(Enumerable.Empty <IVsTextView>()); } IVsEnumTextViews vsEnum; ErrorHandler.ThrowOnFailure(_textManager.EnumViews(vsTextBuffer, out vsEnum)); var list = new List <IVsTextView>(); var done = false; var array = new IVsTextView[1]; do { uint found = 0; var hr = vsEnum.Next((uint)array.Length, array, ref found); ErrorHandler.ThrowOnFailure(hr); if (VSConstants.S_OK == hr && array[0] != null) { list.Add(array[0]); } else { done = true; } }while (!done); return(list); }
private void OnBeforeSaveWorker(uint docCookie) { // We want to raise a save event for this document. First let's try to get the docData uint flags; uint readLocks; uint writeLocks; string moniker; IVsHierarchy hierarchy; uint itemid; var docData = IntPtr.Zero; try { Marshal.ThrowExceptionForHR(_runningDocumentTable.GetDocumentInfo(docCookie, out flags, out readLocks, out writeLocks, out moniker, out hierarchy, out itemid, out docData)); var textBuffer = TryGetTextBufferFromDocData(docData); // Do a quick check that this is a Roslyn file at all before we go do more expensive things if (textBuffer != null && textBuffer.ContentType.IsOfType(ContentTypeNames.RoslynContentType)) { var textBufferAdapter = _editorAdaptersFactoryService.GetBufferAdapter(textBuffer); if (textBufferAdapter != null) { // OK, we want to go and raise a save event. Currently, CommandArgs demands that we have a view, so let's try to go and find one. IVsEnumTextViews enumTextViews; _textManager.EnumViews(textBufferAdapter, out enumTextViews); IVsTextView[] views = new IVsTextView[1]; uint fetched = 0; if (ErrorHandler.Succeeded(enumTextViews.Next(1, views, ref fetched)) && fetched == 1) { var view = _editorAdaptersFactoryService.GetWpfTextView(views[0]); var commandHandlerService = _commandHandlerServiceFactory.GetService(textBuffer); commandHandlerService.Execute(textBuffer.ContentType, new SaveCommandArgs(view, textBuffer)); } } } } finally { if (docData != IntPtr.Zero) { Marshal.Release(docData); } } }
internal IEnumerable <IVsTextView> GetTextViews(ITextBuffer textBuffer) { var vsTextBuffer = _editorAdaptersFactoryService.GetBufferAdapter(textBuffer); if (vsTextBuffer == null) { return(Enumerable.Empty <IVsTextView>()); } IVsEnumTextViews vsEnum; if (ErrorHandler.Failed(_textManager.EnumViews(vsTextBuffer, out vsEnum))) { // When run as a result of navigation for NavigateTo this method can fail. The reason // isn't understood but it can fail so we must handle it. return(Enumerable.Empty <IVsTextView>()); } var list = new List <IVsTextView>(); var done = false; var array = new IVsTextView[1]; do { uint found = 0; var hr = vsEnum.Next((uint)array.Length, array, ref found); if (ErrorHandler.Failed(hr)) { return(Enumerable.Empty <IVsTextView>()); } if (VSConstants.S_OK == hr && array[0] != null) { list.Add(array[0]); } else { done = true; } }while (!done); return(list); }