public int CreateEditorInstance( uint grfCreateDoc, string pszMkDocument, string pszPhysicalView, IVsHierarchy pvHier, uint itemid, System.IntPtr punkDocDataExisting, out System.IntPtr ppunkDocView, out System.IntPtr ppunkDocData, out string pbstrEditorCaption, out Guid pguidCmdUI, out int pgrfCDW) { // Initialize to null ppunkDocView = IntPtr.Zero; ppunkDocData = IntPtr.Zero; pguidCmdUI = GuidList.guidVsTemplateDesignerEditorFactory; pgrfCDW = 0; pbstrEditorCaption = null; // Validate inputs if ((grfCreateDoc & (VSConstants.CEF_OPENFILE | VSConstants.CEF_SILENT)) == 0) { return(VSConstants.E_INVALIDARG); } IVsTextLines textBuffer = null; if (punkDocDataExisting == IntPtr.Zero) { // punkDocDataExisting is null which means the file is not yet open. // We need to create a new text buffer object // get the ILocalRegistry interface so we can use it to // create the text buffer from the shell's local registry try { ILocalRegistry localRegistry = (ILocalRegistry)GetService(typeof(SLocalRegistry)); if (localRegistry != null) { IntPtr ptr; Guid iid = typeof(IVsTextLines).GUID; Guid CLSID_VsTextBuffer = typeof(VsTextBufferClass).GUID; localRegistry.CreateInstance(CLSID_VsTextBuffer, null, ref iid, 1 /*CLSCTX_INPROC_SERVER*/, out ptr); try { textBuffer = Marshal.GetObjectForIUnknown(ptr) as IVsTextLines; } finally { Marshal.Release(ptr); // Release RefCount from CreateInstance call } // It is important to site the TextBuffer object IObjectWithSite objWSite = (IObjectWithSite)textBuffer; if (objWSite != null) { Microsoft.VisualStudio.OLE.Interop.IServiceProvider oleServiceProvider = (Microsoft.VisualStudio.OLE.Interop.IServiceProvider)GetService(typeof(Microsoft.VisualStudio.OLE.Interop.IServiceProvider)); objWSite.SetSite(oleServiceProvider); } } } catch (Exception ex) { Debug.WriteLine("Can not get IVsCfgProviderEventsHelper" + ex.Message); throw; } } else { // punkDocDataExisting is *not* null which means the file *is* already open. // We need to verify that the open document is in fact a TextBuffer. If not // then we need to return the special error code VS_E_INCOMPATIBLEDOCDATA which // causes the user to be prompted to close the open file. If the user closes the // file then we will be called again with punkDocDataExisting as null // QI existing buffer for text lines textBuffer = Marshal.GetObjectForIUnknown(punkDocDataExisting) as IVsTextLines; if (textBuffer == null) { return(VSConstants.VS_E_INCOMPATIBLEDOCDATA); } } // Create the Document (editor) EditorPane NewEditor = new EditorPane(editorPackage, pszMkDocument, textBuffer); ppunkDocView = Marshal.GetIUnknownForObject(NewEditor); ppunkDocData = Marshal.GetIUnknownForObject(textBuffer); pbstrEditorCaption = ""; return(VSConstants.S_OK); }
public int CreateEditorInstance( uint grfCreateDoc, string pszMkDocument, string pszPhysicalView, IVsHierarchy pvHier, uint itemid, IntPtr punkDocDataExisting, out IntPtr ppunkDocView, out IntPtr ppunkDocData, out string pbstrEditorCaption, out Guid pguidCmdUI, out int pgrfCDW) { // Initialize to null ppunkDocView = IntPtr.Zero; ppunkDocData = IntPtr.Zero; pguidCmdUI = GuidList.guidVsTemplateDesignerEditorFactory; pgrfCDW = 0; pbstrEditorCaption = null; // Validate inputs if ((grfCreateDoc & (VSConstants.CEF_OPENFILE | VSConstants.CEF_SILENT)) == 0) { return VSConstants.E_INVALIDARG; } IVsTextLines textBuffer = null; if (punkDocDataExisting == IntPtr.Zero) { // punkDocDataExisting is null which means the file is not yet open. // We need to create a new text buffer object // get the ILocalRegistry interface so we can use it to // create the text buffer from the shell's local registry try { ILocalRegistry localRegistry = (ILocalRegistry)GetService(typeof(SLocalRegistry)); if (localRegistry != null) { IntPtr ptr; Guid iid = typeof(IVsTextLines).GUID; Guid CLSID_VsTextBuffer = typeof(VsTextBufferClass).GUID; localRegistry.CreateInstance(CLSID_VsTextBuffer, null, ref iid, 1 /*CLSCTX_INPROC_SERVER*/, out ptr); try { textBuffer = Marshal.GetObjectForIUnknown(ptr) as IVsTextLines; } finally { Marshal.Release(ptr); // Release RefCount from CreateInstance call } // It is important to site the TextBuffer object IObjectWithSite objWSite = (IObjectWithSite)textBuffer; if (objWSite != null) { IOleServiceProvider oleServiceProvider = (IOleServiceProvider)GetService(typeof(IOleServiceProvider)); objWSite.SetSite(oleServiceProvider); } } } catch (Exception ex) { Debug.WriteLine("Can not get IVsCfgProviderEventsHelper" + ex.Message); throw; } } else { // punkDocDataExisting is *not* null which means the file *is* already open. // We need to verify that the open document is in fact a TextBuffer. If not // then we need to return the special error code VS_E_INCOMPATIBLEDOCDATA which // causes the user to be prompted to close the open file. If the user closes the // file then we will be called again with punkDocDataExisting as null // QI existing buffer for text lines textBuffer = Marshal.GetObjectForIUnknown(punkDocDataExisting) as IVsTextLines; if (textBuffer == null) { return VSConstants.VS_E_INCOMPATIBLEDOCDATA; } } // Create the Document (editor) EditorPane NewEditor = new EditorPane(editorPackage, pszMkDocument, textBuffer); ppunkDocView = Marshal.GetIUnknownForObject(NewEditor); ppunkDocData = Marshal.GetIUnknownForObject(textBuffer); pbstrEditorCaption = ""; return VSConstants.S_OK; }