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); } } } } } }
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); } }
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; }
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; }
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 ); }
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); } }