in WPFDesigner_XML/WPFDesigner_XML/EditorFactory.cs [138:228]
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;
}