Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
                }
            }
        }
Esempio n. 3
0
        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);
        }