Fábricas de editor
Uma fábrica de editor cria objetos do editor e coloca-os em um quadro de janela, conhecido como um modo de exibição físico. Ele cria os dados do documento e os objetos de exibição de documento que são necessários para criar editores e designers. Uma fábrica de editor é necessária para criar o editor de núcleo Visual Studio e qualquer editor padrão. Um editor personalizado como opção, também pode ser criado com uma fábrica de editor.
Você cria uma fábrica de editor ao implementar a IVsEditorFactory interface. O exemplo a seguir ilustra como implementar IVsEditorFactory para criar uma fábrica de editor:
<Guid(GuidList.guidEditorFactory)> _
Public NotInheritable Class SingleViewEditorFactory
Implements IVsEditorFactory
Implements IDisposable
Private MyPackage As PackageSingleViewEditor
Private vsServiceProvider As ServiceProvider
Public Sub New(ByVal packageEditor As PackageSingleViewEditor)
Trace.WriteLine(String.Format(CultureInfo.CurrentCulture,
"Entering {0} constructor", Me.ToString()))
MyPackage = packageEditor
End Sub
#Region "IVsEditorFactorySupport"
Public Function Close() As Integer Implements VisualStudio.Shell.Interop.IVsEditorFactory.Close
Throw New NotImplementedException
End Function
Public Function CreateEditorInstance(ByVal grfCreateDoc As UInteger, ByVal pszMkDocument As String, ByVal pszPhysicalView As String, ByVal pvHier As VisualStudio.Shell.Interop.IVsHierarchy, ByVal itemid As UInteger, ByVal punkDocDataExisting As System.IntPtr, ByRef ppunkDocView As System.IntPtr, ByRef ppunkDocData As System.IntPtr, ByRef pbstrEditorCaption As String, ByRef pguidCmdUI As System.Guid, ByRef pgrfCDW As Integer) As Integer Implements VisualStudio.Shell.Interop.IVsEditorFactory.CreateEditorInstance
Throw New NotImplementedException
End Function
Public Function MapLogicalView(ByRef rguidLogicalView As System.Guid, ByRef pbstrPhysicalView As String) As Integer Implements VisualStudio.Shell.Interop.IVsEditorFactory.MapLogicalView
Throw New NotImplementedException
End Function
Public Function SetSite(ByVal psp As VisualStudio.OLE.Interop.IServiceProvider) As Integer Implements VisualStudio.Shell.Interop.IVsEditorFactory.SetSite
Throw New NotImplementedException
End Function
#End Region
#Region "IDisposable Support"
Public Sub Dispose() Implements IDisposable.Dispose
Throw New NotImplementedException
End Sub
#End Region
End Class
[Guid(GuidList.guidEditorFactory)]
public sealed class SingleViewEditorFactory : IVsEditorFactory, IDisposable
{
private PackageSingleViewEditor MyPackage;
private ServiceProvider vsServiceProvider;
public SingleViewEditorFactory(PackageSingleViewEditor packageEditor)
{
Trace.WriteLine(string.Format(CultureInfo.CurrentCulture,
"Entering {0} constructor", this.ToString()));
MyPackage = packageEditor;
}
#region "IVsEditorFactory Support"
public int Close()
{
throw new NotImplementedException();
}
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 System.Guid pguidCmdUI, out int pgrfCDW)
{
throw new NotImplementedException();
}
public int MapLogicalView(ref System.Guid rguidLogicalView, out string pbstrPhysicalView)
{
throw new NotImplementedException();
}
public int SetSite(Microsoft.VisualStudio.OLE.Interop.IServiceProvider psp)
{
throw new NotImplementedException();
}
#endregion
#region "IDisposable Support"
public void Dispose()
{
throw new NotImplementedException();
}
#endregion
}
Um editor está carregado na primeira vez que você abrir um tipo de arquivo tratado por esse editor. Você pode optar por abrir o editor padrão ou um editor específico. Se você selecionar o editor padrão, o ambiente de desenvolvimento integrado (IDE) determina o editor correto para abrir e abre-lo. Para obter mais informações, consulte Determinando quais abre no Editor de um arquivo em um projeto..
Registrando as fábricas de Editor
Antes de usar um editor que você criou, primeiro você deve registrar informações sobre ele, incluindo as extensões de arquivo, que ele pode manipular.
Se seu VSPackage é escrito em código gerenciado, você pode usar o método de estrutura de pacote gerenciado (MPF) RegisterEditorFactory para registrar a fábrica de editor, após o seu VSPackage é carregado. Se seu VSPackage é escrito em código não gerenciado, você deve registrar sua fábrica de editor usando o SVsRegisterEditors service.
Registrar uma fábrica de Editor usando código gerenciado
Você deve registrar sua fábrica de editor do seu VSPackage a Initialize método. Primeiro chamar base.Initializee, em seguida, chame RegisterEditorFactory para cada fábrica de editor
No código gerenciado, não é necessário cancelar o registro de uma fábrica de editor, porque o VSPackage irá lidar com isso para você. Além disso, se sua fábrica de editor implementa IDisposable, ele é automaticamente descartado quando ele foi cancelado.
Registrando uma fábrica de editor usando código não gerenciado
No SetSite implementação no pacote do editor, uso o QueryService método para chamar SVsRegisterEditors. Isso retorna um ponteiro para IVsRegisterEditors. Chamar o RegisterEditor , passando a implementação do método da IVsEditorFactory interface. Você deve mplement IVsEditorFactory em uma classe separada.
O processo de registro da fábrica de Editor
O seguinte processo ocorre quando Visual Studio é carregado em seu editor usando sua fábrica de editor:
O Visual Studio chamadas de sistema do projeto OpenStandardEditor.
Esse método retorna a fábrica de editor. Visual Studio atrasos de carregar o pacote do editor, no entanto, até que um sistema de projeto precisa, na verdade, o editor.
Quando um sistema de projeto requer o editor, chama de Visual Studio CreateEditorInstance, um método especializado que retorna o modo de exibição do documento e o documento de objetos de dados.
Se chama por Visual Studio ao seu uso de fábrica de editor CreateEditorInstance retornam um objeto de dados do documento e de um objeto de exibição do documento, Visual Studio, em seguida, cria a janela de documento coloca o objeto de exibição de documento nele e cria uma entrada na tabela de documento em execução (RDT) para o objeto de dados do documento.