Beispiel #1
0
        internal Result <ITextBuffer> GetTextBufferForDocCookie(uint cookie)
        {
            var info                 = _table.GetDocumentInfo(cookie);
            var obj                  = info.DocData;
            var vsTextLines          = obj as IVsTextLines;
            var vsTextBufferProvider = obj as IVsTextBufferProvider;

            ITextBuffer textBuffer;

            if (vsTextLines != null)
            {
                textBuffer = _editorAdaptersFactoryService.GetDataBuffer(vsTextLines);
            }
            else if (vsTextBufferProvider != null &&
                     ErrorHandler.Succeeded(vsTextBufferProvider.GetTextBuffer(out vsTextLines)) &&
                     vsTextLines != null)
            {
                textBuffer = _editorAdaptersFactoryService.GetDataBuffer(vsTextLines);
            }
            else
            {
                textBuffer = null;
            }

            return(Result.CreateSuccessNonNull(textBuffer));
        }
Beispiel #2
0
        private Document FindDocument(uint docCookie)
        {
            var documentInfo = _runningDocumentTable.GetDocumentInfo(docCookie);
            var documentPath = documentInfo.Moniker;

            return(_dte.Documents.Cast <Document>().FirstOrDefault(doc => doc.FullName == documentPath));
        }
Beispiel #3
0
        private void GetDocumentInfo(uint cookie, ref IVsProject project, ref uint item, ref string path)
        {
            string     pbstrMkDocument = "";
            IVsProject pProject        = null;
            uint       pitemid         = 0;

            ThreadHelper.JoinableTaskFactory.Run(async() =>
            {
                await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();

                uint pgrfRDTFlags;
                uint pdwReadLocks;
                uint pdwEditLocks;
                IVsHierarchy ppHier;
                IntPtr ppunkDocData;

                ErrorHandler.ThrowOnFailure(RunningDocumentTable.GetDocumentInfo(
                                                cookie,
                                                out pgrfRDTFlags,
                                                out pdwReadLocks,
                                                out pdwEditLocks,
                                                out pbstrMkDocument,
                                                out ppHier,
                                                out pitemid,
                                                out ppunkDocData));
                pProject = ppHier as IVsProject;
            });

            project = pProject;
            path    = pbstrMkDocument;
            item    = pitemid;
        }
        int IVsRunningDocTableEvents.OnAfterFirstDocumentLock(uint docCookie, uint dwRDTLockType, uint dwReadLocksRemaining, uint dwEditLocksRemaining)
        {
            // Please note that this event is called multiple times when a document
            // is opened for editing.
            // This code tries to only call the Open Event once
            //
            if (dwEditLocksRemaining == 1 && dwReadLocksRemaining == 0)
            {
                if (Opened != null)
                {
                    string file = _rdt.GetDocumentInfo(docCookie).Moniker;
                    Opened.Invoke(file);
                }
            }

            return(VSConstants.S_OK);
        }
Beispiel #5
0
        /// <summary>
        /// Base class for all other RDT event wrappers.  Each event wrapper 
        /// stores event-specific information and formats it for display
        /// in the Properties window.
        /// </summary>
        /// <param name="rdt">Running Document Table instance</param>
        /// <param name="message">Message to be displayed in the grid</param>
        /// <param name="cookie">Cookie to unadvise RDT events</param>
        public GenericEvent(RunningDocumentTable rdt, string message, uint cookie)
        {
            this.message = message;
            if (rdt == null || cookie == 0) return;

            rdi = rdt.GetDocumentInfo(cookie);
            docNameShort = GetShortDocName(rdi.Moniker);
        }
Beispiel #6
0
        public int OnAfterSave(uint docCookie)
        {
            var info = _runningDocumentTable.GetDocumentInfo(docCookie);
            var path = info.Moniker;

            DocumentSaved?.Invoke(this, path);
            return(VSConstants.S_OK);
        }
Beispiel #7
0
        public int OnBeforeSave(uint docCookie)
        {
            ThreadHelper.ThrowIfNotOnUIThread();
            var documentInfo = _runningDocumentTable.GetDocumentInfo(docCookie);
            var documentPath = documentInfo.Moniker;

            _commands.EditFile(documentPath);

            return(VSConstants.S_OK);
        }
Beispiel #8
0
        private void RunningDocTableEventsOnDocumentOpened(object sender, VsDocumentEventArgs e)
        {
            var path = e.Path;
            var info = _runningDocumentTable.GetDocumentInfo(path.Value);

            // Call handlers
            var document = GetTextDocument(info);

            if (document != null)
            {
                document.FileActionOccurred += TextDocumentOnFileActionOccurred;
                // Add to table
                lock (_openDocumentsLock) {
                    _openDocuments[path] = document;
                }
                // Call handlers
                OnTextDocumentOpened(new TextDocumentEventArgs(document));
            }
        }
Beispiel #9
0
        private bool TryGetDocumentInfo(uint cookie, out string name, out uint flags, out IVsHierarchy hier, out uint itemId, out object document)
        {
            ThreadHelper.ThrowIfNotOnUIThread();

            if (!_documentInfo_init)
            {
                _documentInfo_init = true;
                DocumentInfoInit();
            }

            if (GetDocumentMoniker_cb != null)
            {
                // Allow VS2013 to delayload windows
                try
                {
                    name  = GetDocumentMoniker_cb(cookie);
                    flags = GetDocumentFlags_cb(cookie);

                    hier     = null;
                    itemId   = VSItemId.Nil;
                    document = null;
                    return(true);
                }
                catch
                { }
            }

            IntPtr ppunkDocData;
            uint   locks;
            uint   editLocks;

            if (VSErr.Succeeded(RunningDocumentTable.GetDocumentInfo(cookie,
                                                                     out flags, out locks, out editLocks, out name, out hier, out itemId, out ppunkDocData)))
            {
                if (ppunkDocData != IntPtr.Zero)
                {
                    document = Marshal.GetUniqueObjectForIUnknown(ppunkDocData);
                    Marshal.Release(ppunkDocData);
                }
                else
                {
                    document = null;
                }

                return(true);
            }
            else
            {
                hier     = null;
                itemId   = VSItemId.Nil;
                document = null;
                return(false);
            }
        }
        private Document FindDocumentByCookie(uint docCookie)
        {
            var documentInfo = _runningDocumentTable.GetDocumentInfo(docCookie);

            return(_environmentService.JoinableTaskFactory.Run(async() =>
            {
                await _environmentService.JoinableTaskFactory.SwitchToMainThreadAsync();
                #pragma warning disable VSTHRD010
                return _environmentService.Dte.Documents.Cast <Document>().FirstOrDefault(doc => doc.FullName == documentInfo.Moniker);
            }));
        }
Beispiel #11
0
        /// <summary>
        /// Base class for all other RDT event wrappers.  Each event wrapper
        /// stores event-specific information and formats it for display
        /// in the Properties window.
        /// </summary>
        /// <param name="rdt">Running Document Table instance</param>
        /// <param name="message">Message to be displayed in the grid</param>
        /// <param name="cookie">Cookie to unadvise RDT events</param>
        public GenericEvent(RunningDocumentTable rdt, string message, uint cookie)
        {
            this.message = message;
            if (rdt == null || cookie == 0)
            {
                return;
            }

            rdi          = rdt.GetDocumentInfo(cookie);
            docNameShort = GetShortDocName(rdi.Moniker);
        }
        private string GetDocFullname(uint docCookie)
        {
            uint         pgrfRDTFlags;
            uint         pdwReadLocks;
            uint         pdwEditLocks;
            string       pbstrMkDocument;
            IVsHierarchy ppHier;
            uint         pitemid;
            IntPtr       ppunkDocData;

            RunningDocumentTable.GetDocumentInfo(docCookie, out pgrfRDTFlags, out pdwReadLocks, out pdwEditLocks, out pbstrMkDocument, out ppHier, out pitemid, out ppunkDocData);

            return(pbstrMkDocument);
        }
Beispiel #13
0
        private void ReloadXmlDoCompletionData(uint docCookie)
        {
            var doc = _rdt.GetDocumentInfo(docCookie);
            // var docTextBufferAdapter = doc.DocData as IVsTextBuffer;
            var textLines = doc.DocData as IVsTextLines;

            IVsUserData userData = textLines as IVsUserData;

            if (userData != null)
            {
                Guid id = typeof(XmlKeyRefCompletionCommandHandler).GUID;
                userData.GetData(ref id, out var cmdHandler);
                (cmdHandler as XmlKeyRefCompletionCommandHandler)?.DocumentDataLoader.ScheduleReloading(XmlDocumentLoader.InitTimeout);
            }
        }
Beispiel #14
0
        private Document FindDocumentByCookie(uint docCookie)
        {
            Document document = null;

            try
            {
                var documentInfo = mRunningDocumentTable.GetDocumentInfo(docCookie);
                document = mDte.Documents.Cast <Document>().FirstOrDefault(doc => doc.FullName == documentInfo.Moniker);
            }
            catch (Exception)
            {
            }

            return(document);
        }
Beispiel #15
0
        protected override void OnBeforeHandleXmlModelTransactionCompleted(object sender, XmlTransactionEventArgs args)
        {
            base.OnBeforeHandleXmlModelTransactionCompleted(sender, args);

#if DEBUG
            var  rDT    = new RunningDocumentTable(PackageManager.Package);
            uint cookie = 0;
            rDT.FindDocument(Uri.LocalPath, out cookie);

            var info = rDT.GetDocumentInfo(cookie);
            Debug.Print(
                string.Format(
                    CultureInfo.CurrentCulture, "There are now {0} Edit Locks, and {1} Read Locks.", info.EditLocks, info.ReadLocks));
#endif
        }
Beispiel #16
0
        public int OnAfterAttributeChangeEx(
            uint docCookie, uint grfAttribs, IVsHierarchy pHierOld, uint itemidOld, string pszMkDocumentOld, IVsHierarchy pHierNew,
            uint itemidNew, string pszMkDocumentNew)
        {
            // We only need to worry about linked undo for artifacts that are not cached code gen models, since code gen artifacts don't exist
            // when the designer is open
            if (!IsCodeGenArtifact)
            {
                // First check to see if this is our document and it's being reloaded
                if (!_disabledBufferUndo &&
                    (grfAttribs & (uint)__VSRDTATTRIB.RDTA_DocDataReloaded) == (uint)__VSRDTATTRIB.RDTA_DocDataReloaded)
                {
                    var rdt = new RunningDocumentTable(Services.ServiceProvider);
                    var rdi = rdt.GetDocumentInfo(docCookie);
                    if (rdi.Moniker.Equals(Uri.LocalPath, StringComparison.OrdinalIgnoreCase))
                    {
                        // DocData is XmlModelDocData
                        var textBufferProvider = rdi.DocData as IVsTextBufferProvider;
                        Debug.Assert(
                            textBufferProvider != null,
                            "The XML Model DocData over the diagram file is not IVsTextBufferProvider. Linked undo may not work correctly");
                        if (textBufferProvider != null)
                        {
                            IVsTextLines textLines;
                            var          hr = textBufferProvider.GetTextBuffer(out textLines);
                            Debug.Assert(
                                textLines != null,
                                "The IVsTextLines could not be found from the IVsTextBufferProvider. Linked undo may not work correctly");
                            if (NativeMethods.Succeeded(hr) && textLines != null)
                            {
                                IOleUndoManager bufferUndoMgr;
                                hr = textLines.GetUndoManager(out bufferUndoMgr);

                                Debug.Assert(
                                    bufferUndoMgr != null, "Couldn't find the buffer undo manager. Linked undo may not work correctly");
                                if (NativeMethods.Succeeded(hr) && bufferUndoMgr != null)
                                {
                                    bufferUndoMgr.Enable(0);
                                    _disabledBufferUndo = true;
                                }
                            }
                        }
                    }
                }
            }

            return(VSConstants.S_OK);
        }
        public int OnAfterAttributeChangeEx(
            uint docCookie, uint grfAttribs, IVsHierarchy pHierOld, uint itemidOld, string pszMkDocumentOld, IVsHierarchy pHierNew,
            uint itemidNew, string pszMkDocumentNew)
        {
            // We only need to worry about linked undo for artifacts that are not cached code gen models, since code gen artifacts don't exist
            // when the designer is open
            if (!IsCodeGenArtifact)
            {
                // First check to see if this is our document and it's being reloaded
                if (!_disabledBufferUndo
                    && (grfAttribs & (uint)__VSRDTATTRIB.RDTA_DocDataReloaded) == (uint)__VSRDTATTRIB.RDTA_DocDataReloaded)
                {
                    var rdt = new RunningDocumentTable(Services.ServiceProvider);
                    var rdi = rdt.GetDocumentInfo(docCookie);
                    if (rdi.Moniker.Equals(Uri.LocalPath, StringComparison.OrdinalIgnoreCase))
                    {
                        // DocData is XmlModelDocData
                        var textBufferProvider = rdi.DocData as IVsTextBufferProvider;
                        Debug.Assert(
                            textBufferProvider != null,
                            "The XML Model DocData over the diagram file is not IVsTextBufferProvider. Linked undo may not work correctly");
                        if (textBufferProvider != null)
                        {
                            IVsTextLines textLines;
                            var hr = textBufferProvider.GetTextBuffer(out textLines);
                            Debug.Assert(
                                textLines != null,
                                "The IVsTextLines could not be found from the IVsTextBufferProvider. Linked undo may not work correctly");
                            if (NativeMethods.Succeeded(hr) && textLines != null)
                            {
                                IOleUndoManager bufferUndoMgr;
                                hr = textLines.GetUndoManager(out bufferUndoMgr);

                                Debug.Assert(
                                    bufferUndoMgr != null, "Couldn't find the buffer undo manager. Linked undo may not work correctly");
                                if (NativeMethods.Succeeded(hr) && bufferUndoMgr != null)
                                {
                                    bufferUndoMgr.Enable(0);
                                    _disabledBufferUndo = true;
                                }
                            }
                        }
                    }
                }
            }

            return VSConstants.S_OK;
        }
        Document FindDocument(uint docCookie)
        {
            ThreadHelper.ThrowIfNotOnUIThread();
            var documentInfo = _runningDocumentTable.GetDocumentInfo(docCookie);
            var documentPath = documentInfo.Moniker;

            foreach (Document doc in Dte.Documents)
            {
                if (doc.FullName == documentPath)
                {
                    return(doc);
                }
            }

            return(null);
        }
Beispiel #19
0
        private Document FindDocumentByCookie(uint docCookie)
        {
            Document document = null;

            try
            {
                var documentInfo = mRunningDocumentTable.GetDocumentInfo(docCookie);

                if (VsServiceProvider.TryGetService(typeof(DTE), out object dte))
                {
                    document = (dte as DTE).Documents.Cast <Document>().FirstOrDefault(doc => doc.FullName == documentInfo.Moniker);
                }
            }
            catch (Exception)
            {
            }

            return(document);
        }
Beispiel #20
0
        public void OpenFile(string filePath, bool isReadOnly)
        {
            ThreadHelper.ThrowIfNotOnUIThread();

            var rdt = new RunningDocumentTable(_serviceProvider);

            IVsWindowFrame?windowFrame = null;

            try
            {
                // Open the document.
                VsShellUtilities.OpenDocument(
                    _serviceProvider,
                    filePath,
                    VSConstants.LOGVIEWID_Primary,
                    out _,
                    out _,
                    out windowFrame);

                // Set it as read only if necessary.
                if (isReadOnly)
                {
                    RunningDocumentInfo rdtInfo = rdt.GetDocumentInfo(filePath);

                    // Set it as read only if necessary.
                    if (rdtInfo.DocData is IVsTextBuffer textBuffer)
                    {
                        textBuffer.GetStateFlags(out uint flags);
                        textBuffer.SetStateFlags(flags | (uint)BUFFERSTATEFLAGS.BSF_USER_READONLY);
                    }
                }

                // Show the document window
                if (windowFrame != null)
                {
                    ErrorHandler.ThrowOnFailure(windowFrame.Show());
                }
            }
            catch (Exception ex) when(!ex.IsCritical())
            {
                windowFrame?.CloseFrame(0);
            }
        }
Beispiel #21
0
        private Document FindDocumentByCookie(uint docCookie)
        {
            Document document = null;

            try
            {
                var documentInfo = mRunningDocumentTable.GetDocumentInfo(docCookie);

                if (VsServiceProvider.TryGetService(typeof(DTE), out object dte))
                {
                    document = (dte as DTE).Documents.Cast <Document>().FirstOrDefault(doc => doc.FullName == documentInfo.Moniker);
                }
            }
            catch (Exception)
            {
                //TODO find solution for DTE not intialized correctly sometimes
                // MessageBox.Show(e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            return(document);
        }
Beispiel #22
0
        private void GetDocumentInfo(uint cookie, ref IVsProject project, ref uint item, ref string path)
        {
            uint         pgrfRDTFlags;
            uint         pdwReadLocks;
            uint         pdwEditLocks;
            string       pbstrMkDocument;
            IVsHierarchy ppHier;
            uint         pitemid;
            IntPtr       ppunkDocData;

            ErrorHandler.ThrowOnFailure(RunningDocumentTable.GetDocumentInfo(
                                            cookie,
                                            out pgrfRDTFlags,
                                            out pdwReadLocks,
                                            out pdwEditLocks,
                                            out pbstrMkDocument,
                                            out ppHier,
                                            out pitemid,
                                            out ppunkDocData));

            project = ppHier as IVsProject;
            path    = pbstrMkDocument;
            item    = pitemid;
        }
Beispiel #23
0
        public bool TryGetTextBufferForDocCookie(uint cookie, out ITextBuffer buffer)
        {
            var info                 = _table.GetDocumentInfo(cookie);
            var obj                  = info.DocData;
            var vsTextLines          = obj as IVsTextLines;
            var vsTextBufferProvider = obj as IVsTextBufferProvider;

            if (vsTextLines != null)
            {
                buffer = _editorAdaptersFactoryService.GetDataBuffer(vsTextLines);
            }
            else if (vsTextBufferProvider != null &&
                     ErrorHandler.Succeeded(vsTextBufferProvider.GetTextBuffer(out vsTextLines)) &&
                     vsTextLines != null)
            {
                buffer = _editorAdaptersFactoryService.GetDataBuffer(vsTextLines);
            }
            else
            {
                buffer = null;
            }

            return(buffer != null);
        }
        public Task <bool> TryHandleCommandAsync(IImmutableSet <IProjectTree> items, long commandId, bool focused, long commandExecuteOptions, IntPtr variantArgIn, IntPtr variantArgOut)
        {
            if (IsOpenCommand(commandId) && items.All(CanOpenFile))
            {
                OpenItems();

                return(TaskResult.True);
            }

            return(TaskResult.False);

            void OpenItems()
            {
                Assumes.NotNull(_configuredProject.UnconfiguredProject.Services.HostObject);
                var hierarchy = (IVsUIHierarchy)_configuredProject.UnconfiguredProject.Services.HostObject;
                var rdt       = new RunningDocumentTable(_serviceProvider);

                // Open all items.
                RunAllAndAggregateExceptions(items, OpenItem);

                void OpenItem(IProjectTree item)
                {
                    IVsWindowFrame?windowFrame = null;

                    try
                    {
                        // Open the document.
                        Guid   logicalView = IsOpenWithCommand(commandId) ? LOGVIEWID_UserChooseView : LOGVIEWID.Primary_guid;
                        IntPtr docData     = IntPtr.Zero;

                        ErrorHandler.ThrowOnFailure(
                            _uiShellOpenDocument.Value.OpenStandardEditor(
                                (uint)__VSOSEFLAGS.OSE_ChooseBestStdEditor,
                                item.FilePath,
                                ref logicalView,
                                item.Caption,
                                hierarchy,
                                item.GetHierarchyId(),
                                docData,
                                _oleServiceProvider.Value,
                                out windowFrame));

                        RunningDocumentInfo rdtInfo = rdt.GetDocumentInfo(item.FilePath);

                        // Set it as read only if necessary.
                        bool isReadOnly = item.Flags.Contains(ImportTreeProvider.ProjectImportImplicit);

                        if (isReadOnly && rdtInfo.DocData is IVsTextBuffer textBuffer)
                        {
                            textBuffer.GetStateFlags(out uint flags);
                            textBuffer.SetStateFlags(flags | (uint)BUFFERSTATEFLAGS.BSF_USER_READONLY);
                        }

                        // Detach the document from this project.
                        // Ignore failure. It may be that we've already transferred the item to Miscellaneous Files.
                        _externalFilesManager.Value.TransferDocument(item.FilePath, item.FilePath, windowFrame);

                        // Show the document window
                        if (windowFrame != null)
                        {
                            ErrorHandler.ThrowOnFailure(windowFrame.Show());
                        }
                    }
                    catch
                    {
                        windowFrame?.CloseFrame(0);
                        throw;
                    }
                }
            }
        }
Beispiel #25
0
 public string GetDocumentName(uint docCookie)
 {
     return(_table.GetDocumentInfo(docCookie).Moniker);
 }
Beispiel #26
0
        private Document FindDocumentByCookie(uint docCookie)
        {
            var documentInfo = mRunningDocumentTable.GetDocumentInfo(docCookie);

            return(mDte.Documents.Cast <Document>().FirstOrDefault(doc => doc.FullName == documentInfo.Moniker));
        }
 public IRunningDocumentInfo GetDocumentInfo(uint docCookie)
 => new RunningDocumentInfoWrapper(
     runningDocumentTable.GetDocumentInfo(docCookie));
Beispiel #28
0
        protected override void OnBeforeHandleXmlModelTransactionCompleted(object sender, XmlTransactionEventArgs args)
        {
            base.OnBeforeHandleXmlModelTransactionCompleted(sender, args);

#if DEBUG
            var rDT = new RunningDocumentTable(PackageManager.Package);
            uint cookie = 0;
            rDT.FindDocument(Uri.LocalPath, out cookie);

            var info = rDT.GetDocumentInfo(cookie);
            Debug.Print(
                string.Format(
                    CultureInfo.CurrentCulture, "There are now {0} Edit Locks, and {1} Read Locks.", info.EditLocks, info.ReadLocks));
#endif
        }