예제 #1
0
        public static void RenameDocument(ServiceProvider site, string oldName, string newName)
        {
            IVsRunningDocumentTable pRDT = (IVsRunningDocumentTable)site.QueryService(VsConstants.SID_SVsRunningDocumentTable, typeof(IVsRunningDocumentTable));
            IVsUIShellOpenDocument  doc  = (IVsUIShellOpenDocument)site.QueryService(VsConstants.SID_VsUIShellOpenDocument, typeof(IVsUIShellOpenDocument));
            IVsUIShell uiShell           = (IVsUIShell)site.QueryService(VsConstants.guidShellIID, typeof(IVsUIShell));

            if (pRDT == null || doc == null)
            {
                return;
            }

            IVsHierarchy pIVsHierarchy;
            uint         itemId;
            IntPtr       docData;
            uint         uiVsDocCookie;

            pRDT.FindAndLockDocument((uint)_VSRDTFLAGS.RDT_NoLock,
                                     oldName, out pIVsHierarchy, out itemId, out docData, out uiVsDocCookie);

            if (docData != IntPtr.Zero)
            {
                IntPtr pUnk = Marshal.GetIUnknownForObject(pIVsHierarchy);
                Guid   iid  = typeof(IVsHierarchy).GUID;
                IntPtr pHier;
                Marshal.QueryInterface(pUnk, ref iid, out pHier);
                try
                {
                    pRDT.RenameDocument(oldName, newName, pHier, itemId);
                }
                finally
                {
                    Marshal.Release(pHier);
                    Marshal.Release(pUnk);
                }

                string newCaption = Path.GetFileName(newName);

                // now we need to tell the windows to update their captions.
                IEnumWindowFrames ppenum;
                uiShell.GetDocumentWindowEnum(out ppenum);
                IVsWindowFrame[] rgelt = new IVsWindowFrame[1];
                uint             fetched;
                while (ppenum.Next(1, rgelt, out fetched) == 0 && fetched == 1)
                {
                    IVsWindowFrame windowFrame = rgelt[0];
                    object         data;
                    windowFrame.GetProperty((int)__VSFPROPID.VSFPROPID_DocData, out data);
                    IntPtr ptr = Marshal.GetIUnknownForObject(data);
                    if (ptr == docData)
                    {
                        windowFrame.SetProperty((int)__VSFPROPID.VSFPROPID_OwnerCaption, newCaption);
                    }
                    Marshal.Release(ptr);
                }
                Marshal.Release(docData);
            }
        }
예제 #2
0
        public static void OpenDocument(ServiceProvider provider, string fullPath, out IVsUIHierarchy hierarchy,
                                        out uint itemID, out IVsWindowFrame windowFrame, out IVsTextView view)
        {
            view        = null;
            windowFrame = null;
            itemID      = VsConstants.VSITEMID_NIL;
            hierarchy   = null;

            //open document
            IVsUIShellOpenDocument  shellOpenDoc = (IVsUIShellOpenDocument)provider.QueryService(VsConstants.SID_SVsUIShellOpenDocument, typeof(IVsUIShellOpenDocument));
            IVsRunningDocumentTable pRDT         = (IVsRunningDocumentTable)provider.QueryService(VsConstants.SID_SVsRunningDocumentTable, typeof(IVsRunningDocumentTable));

            if (pRDT != null)
            {
                IntPtr       punkDocData;
                uint         docCookie;
                uint         pitemid;
                IVsHierarchy ppIVsHierarchy;
                pRDT.FindAndLockDocument((uint)_VSRDTFLAGS.RDT_NoLock,
                                         fullPath, out ppIVsHierarchy, out pitemid, out punkDocData, out docCookie);
                if (punkDocData == IntPtr.Zero)
                {
                    Microsoft.VisualStudio.OLE.Interop.IServiceProvider psp;
                    uint itemid;
                    Guid logicalView = Guid.Empty;
                    shellOpenDoc.OpenDocumentViaProject(fullPath, ref logicalView, out psp, out hierarchy, out itemid, out windowFrame);
                    if (windowFrame != null)
                    {
                        windowFrame.Show();
                    }
                    psp = null;
                }
                else
                {
                    Marshal.Release(punkDocData);

                    Guid logicalView = Guid.Empty;
                    int  pfOpen;

                    shellOpenDoc.IsDocumentOpen((IVsUIHierarchy)ppIVsHierarchy, pitemid, fullPath,
                                                ref logicalView, (uint)__VSIDOFLAGS.IDO_IgnoreLogicalView,
                                                out hierarchy, out itemID, out windowFrame, out pfOpen);

                    if (windowFrame != null)
                    {
                        windowFrame.Show();
                    }
                }
            }

            //return objects
            WindowFrameGetTextView(windowFrame, out view);
        }
예제 #3
0
        public virtual void Init()
        {
            ILocalRegistry3 localRegistry = (ILocalRegistry3)site.QueryService(VsConstants.SID_SLocalRegistry, typeof(ILocalRegistry3));
            string          root          = null;

            if (localRegistry != null)
            {
                localRegistry.GetLocalRegistryRoot(out root);
            }
            if (root != null)
            {
                using (RegistryKey key = Registry.LocalMachine.OpenSubKey(root, true)) {
                    if (key != null)
                    {
                        InitMachinePreferences(key, editorName);
                    }
                }
                using (RegistryKey key = Registry.CurrentUser.OpenSubKey(root, true)) {
                    if (key != null)
                    {
                        InitUserPreferences(key, editorName);
                    }
                }
            }
            localRegistry = null;
        }
예제 #4
0
        public virtual void SetSite(Microsoft.VisualStudio.OLE.Interop.IServiceProvider psp)
        {
            this.site = new ServiceProvider(psp);

            extensions = new Hashtable();
            ILocalRegistry3 localRegistry = (ILocalRegistry3)site.QueryService(VsConstants.SID_SLocalRegistry, typeof(ILocalRegistry3));
            string          root          = null;

            if (localRegistry != null)
            {
                localRegistry.GetLocalRegistryRoot(out root);
            }
            using (RegistryKey rootKey = Registry.LocalMachine.OpenSubKey(root)) {
                if (rootKey != null)
                {
                    string relpath = "Editors\\{" + this.GetType().GUID.ToString() + "}\\Extensions";
                    using (RegistryKey key = rootKey.OpenSubKey(relpath, false)) {
                        if (key != null)
                        {
                            foreach (string ext in key.GetValueNames())
                            {
                                extensions.Add(ext.ToLower(), ext);
                            }
                        }
                    }
                }
            }
        }
예제 #5
0
 /// <summary>
 /// Gets the language preferences.
 /// </summary>
 public LanguagePreferences(ServiceProvider site, Guid langSvc, string editorName)
 {
     this.site       = site;
     this.textMgr    = (IVsTextManager)site.QueryService(VsConstants.SID_SVsTextManager, typeof(IVsTextManager));
     this.langSvc    = langSvc;
     this.user       = true;
     this.editorName = editorName;
     Init();
 }
예제 #6
0
        public static object CreateInstance(ServiceProvider provider, ref Guid clsid, ref Guid iid, Type t)
        {
            ILocalRegistry3 localRegistry = (ILocalRegistry3)provider.QueryService(VsConstants.SID_SLocalRegistry, typeof(ILocalRegistry3));

            IntPtr pUnk;

            localRegistry.CreateInstance(clsid, null, ref iid, VsConstants.CLSCTX_INPROC_SERVER, out pUnk);
            localRegistry = null;

            object result = Marshal.GetTypedObjectForIUnknown(pUnk, t);

            Marshal.Release(pUnk);
            return(result);
        }
예제 #7
0
        public static uint GetProviderLocale(ServiceProvider provider)
        {
            CultureInfo ci   = CultureInfo.CurrentCulture;
            uint        lcid = (uint)ci.LCID;

            if (provider != null)
            {
                try {
                    IUIHostLocale locale = (IUIHostLocale)provider.QueryService(VsConstants.SID_SUIHostLocale, typeof(IUIHostLocale));
                    locale.GetUILocale(out lcid);
                } catch (Exception) {
                }
            }
            return(lcid);
        }
예제 #8
0
        public virtual void Close()
        {
            if (this.site != null)
            {
                if (this.editorFactory != null)
                {
                    Guid editorGuid        = this.editorFactory.GetType().GUID;
                    IVsRegisterEditors vre = (IVsRegisterEditors)site.QueryService(VsConstants.SID_SVsRegisterEditors, typeof(IVsRegisterEditors));
                    vre.UnregisterEditor(this.editorFactoryCookie);
                    this.editorFactory.Close();
                    this.editorFactory = null;
                }
                if (this.projectFactory != null)
                {
                    IVsRegisterProjectTypes rpt = (IVsRegisterProjectTypes)this.site.QueryService(VsConstants.SID_IVsRegisterProjectTypes, typeof(IVsRegisterProjectTypes));
                    if (rpt != null)
                    {
                        rpt.UnregisterProjectType(this.projectFactoryCookie);
                    }
                    this.projectFactoryCookie = 0;
                    this.projectFactory.Close();
                    this.projectFactory = null;
                }
            }
            foreach (LanguageService svc in this.languageServices.Values)
            {
                svc.Done();
            }
            this.languageServices.Clear();

            if (this.componentID != 0)
            {
                this.componentManager.FRevokeComponent(this.componentID);
                this.componentID = 0;
            }
            this.componentManager = null;

            if (site != null)
            {
                site.Dispose();
            }
            this.site = null;
            GC.Collect();
        }
예제 #9
0
        public static void OpenItem(ServiceProvider site, bool newFile, bool openWith, ref Guid logicalView,
                                    IntPtr punkDocDataExisting, IVsHierarchy pHierarchy,
                                    uint hierarchyId, out IVsWindowFrame windowFrame)
        {
            windowFrame = null;
            IntPtr docData = punkDocDataExisting;

            try {
                uint itemid = hierarchyId;

                object pvar;
                pHierarchy.GetProperty(hierarchyId, (int)__VSHPROPID.VSHPROPID_Caption, out pvar);
                string caption = (string)pvar;

                string fullPath = null;

                if (punkDocDataExisting != IntPtr.Zero)
                {
                    try  {
                        // if interface is not supported, return null
                        IPersistFileFormat pff = (IPersistFileFormat)Marshal.GetTypedObjectForIUnknown(punkDocDataExisting, typeof(IPersistFileFormat));
                        uint format;
                        pff.GetCurFile(out fullPath, out format);
                    }
                    catch  {
                    };
                }
                if (fullPath == null)
                {
                    string dir;
                    pHierarchy.GetProperty((uint)VsConstants.VSITEMID_ROOT, (int)__VSHPROPID.VSHPROPID_ProjectDir, out pvar);
                    dir = (string)pvar;
                    pHierarchy.GetProperty(hierarchyId, (int)__VSHPROPID.VSHPROPID_SaveName, out pvar);
                    fullPath = dir != null?Path.Combine(dir, (string)pvar) : (string)pvar;
                }

                IVsUIHierarchy pRootHierarchy = null;
                pHierarchy.GetProperty((uint)VsConstants.VSITEMID_ROOT, (int)__VSHPROPID.VSHPROPID_Root, out pvar);
                IntPtr ptr;
                if (pvar == null)
                {
                    pRootHierarchy = (IVsUIHierarchy)pHierarchy;
                }
                else
                {
                    ptr            = (IntPtr)pvar;
                    pRootHierarchy = (IVsUIHierarchy)Marshal.GetTypedObjectForIUnknown(ptr, typeof(IVsUIHierarchy));
                    Marshal.Release(ptr);
                }
                IVsUIHierarchy pVsUIHierarchy = pRootHierarchy;

                IVsUIShellOpenDocument doc = (IVsUIShellOpenDocument)site.QueryService(VsConstants.SID_VsUIShellOpenDocument, typeof(IVsUIShellOpenDocument));
                const uint             OSE_ChooseBestStdEditor = 0x20000000;
                const uint             OSE_UseOpenWithDialog   = 0x10000000;
                const uint             OSE_OpenAsNewFile       = 0x40000000;

                if (openWith)
                {
                    doc.OpenStandardEditor(OSE_UseOpenWithDialog, fullPath, ref logicalView, caption,
                                           pVsUIHierarchy, itemid, docData, site.Unwrap(), out windowFrame);
                }
                else
                {
                    // First we see if someone else has opened the requested view of the file and if so,
                    // simply activate that view.
                    IVsRunningDocumentTable pRDT = (IVsRunningDocumentTable)site.QueryService(VsConstants.SID_SVsRunningDocumentTable, typeof(IVsRunningDocumentTable));
                    if (pRDT != null)
                    {
                        uint         docCookie;
                        IVsHierarchy ppIVsHierarchy;
                        pRDT.FindAndLockDocument((uint)_VSRDTFLAGS.RDT_NoLock,
                                                 fullPath, out ppIVsHierarchy, out itemid, out docData, out docCookie);
                        if (ppIVsHierarchy != null && docCookie != VsConstants.VSDOCCOOKIE_NIL &&
                            pHierarchy != ppIVsHierarchy && pVsUIHierarchy != ppIVsHierarchy)
                        {
                            // not opened by us, so call IsDocumentOpen with the right IVsUIHierarchy so we avoid the
                            // annoying "This document is opened by another project" message prompt.
                            pVsUIHierarchy = (IVsUIHierarchy)ppIVsHierarchy;
                            itemid         = (uint)VsConstants.VSITEMID_SELECTION;
                        }
                        ppIVsHierarchy = null;
                    }
                    IVsUIHierarchy ppHierOpen;
                    uint           pitemidOpen;
                    int            pfOpen;
                    doc.IsDocumentOpen(pVsUIHierarchy, itemid, fullPath,
                                       ref logicalView, (uint)__VSIDOFLAGS.IDO_ActivateIfOpen,
                                       out ppHierOpen, out pitemidOpen, out windowFrame, out pfOpen);
                    if (pfOpen != 1)
                    {
                        uint openFlags = OSE_ChooseBestStdEditor;
                        if (newFile)
                        {
                            openFlags |= OSE_OpenAsNewFile;
                        }

                        //NOTE: we MUST pass the IVsProject in pVsUIHierarchy and the itemid
                        // of the node being opened, otherwise the debugger doesn't work.
                        doc.OpenStandardEditor(openFlags, fullPath, ref logicalView, caption,
                                               pRootHierarchy, hierarchyId, docData,
                                               site.Unwrap(), out windowFrame);
                        if (windowFrame != null)
                        {
                            if (newFile)
                            {
                                object var;
                                windowFrame.GetProperty((int)__VSFPROPID.VSFPROPID_DocData, out var);
                                IVsPersistDocData ppd = (IVsPersistDocData)var;
                                ppd.SetUntitledDocPath(fullPath);
                            }
                        }
                    }
                }
                if (windowFrame != null)
                {
                    windowFrame.Show();
                }
            } catch (COMException e) {
                if ((uint)e.ErrorCode != (uint)OleErrors.OLE_E_PROMPTSAVECANCELLED)
                {
#if DEBUG
                    MessageBox.Show(e.Message);
#endif
                }
            } catch (Exception e) {
#if DEBUG
                MessageBox.Show(e.Message);
#endif
            }
            if (docData != punkDocDataExisting)
            {
                Marshal.Release(docData);
            }
        }