Tutorial: Adición de características a un editor personalizado
Después de crear un editor personalizado, puede agregarle más características.
Para crear un editor para un VSPackage
Cree un editor personalizado mediante la plantilla de proyecto Paquete de Visual Studio.
Para obtener más información, vea Tutorial: Creación de un editor personalizado.
Decida si desea que el editor admita una sola vista o varias vistas.
Un editor que admita el comando Nueva ventana , o que tenga vista de formulario y vista de código, requiere objetos de datos de documento independientes y objetos de vista de documentos. En un editor que solo admite una sola vista, el objeto de datos del documento y el objeto de vista de documento se pueden implementar en el mismo objeto.
Para obtener un ejemplo de varias vistas, consulte Compatibilidad con varias vistas de documento.
Implemente un generador de editores mediante la configuración de la IVsEditorFactory interfaz .
Para obtener más información, consulte Generadores de editores.
Decida si desea que el editor use la activación local o la inserción simplificada para administrar la ventana del objeto de vista de documentos.
Una ventana del editor de inserción simplificada hospeda una vista de documento estándar, mientras que una ventana del editor de activación local hospeda un control ActiveX u otro objeto activo como vista de documento. Para obtener más información, consulte Inserción simplificada y activación en contexto.
Implemente la IOleCommandTarget interfaz para controlar los comandos.
Proporcione persistencia del documento y respuesta a los cambios de archivos externos:
Para conservar el archivo, implemente IVsPersistDocData2 y IPersistFileFormat en el objeto de datos del documento del editor.
Para responder a los cambios de archivos externos, implemente IVsFileChangeEx y IVsDocDataFileChangeControl en el objeto de datos del documento del editor.
Nota:
Llame
QueryService
a para SVsFileChangeEx obtener un puntero aIVsFileChangeEx
.
Coordinar eventos de edición de documentos con control de código fuente. Siga estos pasos:
Obtenga un puntero a
IVsQueryEditQuerySave2
mediante una llamada aQueryService
en SVsQueryEditQuerySave.Cuando se produce el primer evento de edición, llame al QueryEditFiles método .
Este método solicita al usuario que desproteger el archivo si aún no está desprotegido. Asegúrese de controlar una condición de "archivo no desprotegido" para evitar errores.
Del mismo modo, antes de guardar el archivo, llame al QuerySaveFile método .
Este método solicita al usuario que guarde el archivo si no se ha guardado o si ha cambiado desde el último guardado.
Habilite la ventana Propiedades para mostrar las propiedades del texto seleccionado en el editor. Siga estos pasos:
Llame a OnSelectChange cada vez que cambie la selección de texto y pase la implementación de ISelectionContainer.
Llame al
QueryService
servicio para obtener un puntero a ITrackSelection.STrackSelection
Permitir que los usuarios arrastren y coloquen elementos entre el editor y el Cuadro de herramientas, o entre editores externos (como Microsoft Word) y el Cuadro de herramientas. Siga estos pasos:
Implemente
IDropTarget
en el editor para alertar al IDE de que el editor es un destino de eliminación.Implemente la IVsToolboxUser interfaz en la vista para que el editor pueda habilitar y deshabilitar elementos en el Cuadro de herramientas.
Implemente ResetDefaults y llame
QueryService
al SVsToolbox servicio para obtener un puntero a las IVsToolbox2 interfaces y IVsToolbox3 .Estos pasos permiten que VSPackage agregue nuevos elementos al Cuadro de herramientas.
Decida si desea otras características opcionales para el editor.
Si desea que el editor admita comandos de búsqueda y reemplazo, implemente IVsFindTarget.
Si desea usar una ventana de herramientas de esquema de documento en el editor, implemente
IVsDocOutlineProvider
.Si desea usar una barra de estado en el editor, implemente IVsStatusbarUser y llame
QueryService
a para SVsStatusbar obtener un puntero aIVsStatusBar
.Por ejemplo, un editor puede mostrar información de líneas o columnas, el modo de selección (secuencia/cuadro) y el modo de inserción (insertar o sobrestrike).
Si desea que el editor admita el
Undo
comando, el método recomendado es usar el modelo de administrador de deshacer OLE. Como alternativa, puede hacer que el editor controle elUndo
comando directamente.
Cree información del Registro, incluidos los GUID para VSPackage, los menús, el editor y otras características.
A continuación se muestra un ejemplo genérico de código que colocaría en el script de archivo .rgs para demostrar cómo registrar correctamente un editor.
NoRemove Editors { ForceRemove {...guidEditor...} = s 'RTF Editor' { val Package = s '{...guidVsPackage...}' ForceRemove Extensions { val rtf = d 50 } } } NoRemove Menus { val {...guidVsPackage...} = s ',203,11' }
Implemente la compatibilidad con ayuda contextual.
Este paso le permite proporcionar compatibilidad con la ventana Ayuda F1 y Ayuda dinámica para los elementos del editor. Para obtener más información, vea How to: Provide context for editors (Cómo: Proporcionar contexto para editores).
Exponga un modelo de objetos de Automation desde el editor mediante la implementación de la
IDispatch
interfaz .Para más información, consulte Introducción al modelo de Automation.
Programación sólida
La instancia del editor se crea cuando el IDE llama al CreateEditorInstance método . Si el editor admite varias vistas,
CreateEditorInstance
crea los datos del documento y los objetos de vista de documento. Si el objeto de datos del documento ya está abierto, se pasa un valor distinto de NULLpunkDocDataExisting
aIVsEditorFactory::CreateEditorInstance
. La implementación del generador de editores debe determinar si un objeto de datos de documento existente es compatible consultando las interfaces adecuadas en él. Para obtener más información, consulte Compatibilidad con varias vistas de documentos.Si usa el enfoque de inserción simplificado, implemente la IVsWindowPane interfaz .
Si decide usar la activación local, implemente las interfaces siguientes:
Nota:
La
IOleInPlaceComponent
interfaz se usa para evitar la combinación de menús OLE 2.La
IOleCommandTarget
implementación controla comandos como Cortar, Copiar y Pegar. Al implementarIOleCommandTarget
, decida si el editor requiere su propio archivo .vsct para definir su propia estructura de menús de comandos o si puede implementar comandos estándar definidos por Visual Studio. Normalmente, los editores usan y amplían los menús del IDE y definen sus propias barras de herramientas. Sin embargo, a menudo es necesario que un editor defina sus propios comandos específicos además de usar el conjunto de comandos estándar del IDE. El editor debe declarar los comandos estándar que usa y, a continuación, definir los nuevos comandos, menús contextuales, menús de nivel superior y barras de herramientas en un archivo .vsct . Si crea un editor de activación local, implemente IOleInPlaceComponent y defina los menús y barras de herramientas para el editor en un archivo .vsct en lugar de usar la combinación de menús OLE 2.Para evitar la multitud de comandos de menú en la interfaz de usuario, debe usar los comandos existentes en el IDE antes de inventar nuevos comandos. Los comandos compartidos se definen en SharedCmdDef.vsct y ShellCmdDef.vsct. Estos archivos se instalan de forma predeterminada en el subdirectorio VisualStudioIntegration\Common\Inc de la instalación del SDK de Visual Studio.
ISelectionContainer
puede expresar selecciones únicas y múltiples. Cada objeto seleccionado se implementa como unIDispatch
objeto .El IDE implementa
IOleUndoManager
como un servicio accesible desde o CreateInstance como un objeto que se puede crear una instancia a través CreateInstancede . El editor implementa laIOleUndoUnit
interfaz para cadaUndo
acción.Hay dos lugares en los que un editor personalizado puede exponer objetos de automatización:
Document.Object
Window.Object