Procédure pas à pas : ajouter des fonctionnalités à un éditeur personnalisé
Après avoir créé un éditeur personnalisé, vous pouvez y ajouter d’autres fonctionnalités.
Pour créer un éditeur pour un VSPackage
Créez un éditeur personnalisé à l’aide du modèle de projet Package Visual Studio.
Pour plus d’informations, consultez Procédure pas à pas : Créer un éditeur personnalisé.
Déterminez si vous souhaitez que votre éditeur prend en charge une vue unique ou plusieurs vues.
Un éditeur qui prend en charge la commande Nouvelle fenêtre , ou qui dispose d’une vue de formulaire et d’une vue de code, nécessite des objets de données de document distincts et des objets d’affichage de document. Dans un éditeur qui ne prend en charge qu’une seule vue, l’objet de données de document et l’objet d’affichage de document peut être implémenté sur le même objet.
Pour obtenir un exemple de plusieurs vues, consultez Prise en charge de plusieurs affichages de documents.
Implémentez une fabrique d’éditeur en configurant l’interface IVsEditorFactory .
Pour plus d’informations, consultez Fabriques d’éditeurs.
Déterminez si vous souhaitez que votre éditeur utilise l’activation sur place ou l’incorporation simplifiée pour gérer la fenêtre d’objet d’affichage de document.
Une fenêtre d’éditeur d’incorporation simplifiée héberge un affichage de document standard, tandis qu’une fenêtre d’éditeur d’activation sur place héberge un contrôle ActiveX ou un autre objet actif en tant qu’affichage de document. Pour plus d’informations, consultez Activation simplifiée de l’incorporation et de l’activation sur place.
Implémentez l’interface IOleCommandTarget pour gérer les commandes.
Fournissez la persistance et la réponse des documents aux modifications apportées aux fichiers externes :
Pour conserver le fichier, implémentez IVsPersistDocData2 et IPersistFileFormat sur l’objet de données de document de votre éditeur.
Pour répondre aux modifications de fichiers externes, implémentez IVsFileChangeEx et IVsDocDataFileChangeControl sur l’objet de données de document de votre éditeur.
Remarque
Appelez
QueryService
pour obtenir un pointeur versIVsFileChangeEx
.SVsFileChangeEx
Coordonnez les événements de modification de document avec le contrôle de code source. Effectuez les étapes suivantes :
Obtenir un pointeur vers lequel
IVsQueryEditQuerySave2
appeler SVsQueryEditQuerySaveQueryService
.Lorsque le premier événement de modification se produit, appelez la QueryEditFiles méthode.
Cette méthode invite l’utilisateur à case activée le fichier s’il n’est pas déjà case activée sorti. Veillez à gérer une condition « file not case activée ed out » pour éviter les erreurs.
De même, avant d’enregistrer le fichier, appelez la QuerySaveFile méthode.
Cette méthode invite l’utilisateur à enregistrer le fichier s’il n’a pas été enregistré ou s’il a changé depuis le dernier enregistrement.
Activez la fenêtre Propriétés pour afficher les propriétés du texte sélectionné dans l’éditeur. Effectuez les étapes suivantes :
Appelez OnSelectChange chaque fois que la sélection de texte change, en passant votre implémentation de ISelectionContainer.
Appelez
QueryService
le STrackSelection service pour obtenir un pointeur vers ITrackSelection.
Permettre aux utilisateurs de glisser-déplacer des éléments entre l’éditeur et la boîte à outils, ou entre les éditeurs externes (comme Microsoft Word) et la boîte à outils. Effectuez les étapes suivantes :
Implémentez
IDropTarget
sur votre éditeur pour alerter l’IDE que votre éditeur est une cible de suppression.Implémentez l’interface IVsToolboxUser sur la vue afin que votre éditeur puisse activer et désactiver des éléments dans la boîte à outils.
Implémentez et appelez ResetDefaults
QueryService
le SVsToolbox service pour obtenir un pointeur vers les interfaces et IVsToolbox3 les IVsToolbox2 interfaces.Ces étapes permettent à votre VSPackage d’ajouter de nouveaux éléments à la boîte à outils.
Déterminez si vous souhaitez d’autres fonctionnalités facultatives pour votre éditeur.
Si vous souhaitez que votre éditeur prend en charge les commandes rechercher et remplacer, implémentez IVsFindTarget.
Si vous souhaitez utiliser une fenêtre d’outil de plan de document dans votre éditeur, implémentez
IVsDocOutlineProvider
.Si vous souhaitez utiliser une barre d’état dans votre éditeur, implémentez IVsStatusbarUser et appelez
QueryService
pour SVsStatusbar obtenir un pointeur versIVsStatusBar
.Par exemple, un éditeur peut afficher les informations de ligne/colonne, le mode de sélection (flux/zone) et le mode d’insertion (insertion/overstrike).
Si vous souhaitez que votre éditeur prend en charge la
Undo
commande, la méthode recommandée consiste à utiliser le modèle de gestionnaire d’annulation OLE. En guise d’alternative, vous pouvez disposer de l’éditeur pour gérer laUndo
commande directement.
Créez des informations de Registre, notamment les GUID pour vsPackage, les menus, l’éditeur et d’autres fonctionnalités.
Voici un exemple générique de code que vous devez placer dans votre script de fichier .rgs pour montrer comment inscrire correctement un éditeur.
NoRemove Editors { ForceRemove {...guidEditor...} = s 'RTF Editor' { val Package = s '{...guidVsPackage...}' ForceRemove Extensions { val rtf = d 50 } } } NoRemove Menus { val {...guidVsPackage...} = s ',203,11' }
Implémentez la prise en charge de l’aide contextuelle.
Cette étape vous permet de fournir l’aide F1 et la prise en charge de la fenêtre Aide dynamique pour les éléments de votre éditeur. Pour plus d’informations, consultez Guide pratique pour fournir un contexte aux éditeurs.
Exposez un modèle objet Automation à partir de votre éditeur en implémentant l’interface
IDispatch
.Pour plus d’informations, consultez vue d’ensemble du modèle Automation.
Programmation fiable
L’instance de l’éditeur est créée lorsque l’IDE appelle la CreateEditorInstance méthode. Si l’éditeur prend en charge plusieurs vues,
CreateEditorInstance
crée les données de document et les objets d’affichage de document. Si l’objet de données de document est déjà ouvert, une valeur non nullpunkDocDataExisting
est passée àIVsEditorFactory::CreateEditorInstance
. L’implémentation de votre fabrique d’éditeur doit déterminer si un objet de données de document existant est compatible en interrogeant les interfaces appropriées sur celui-ci. Pour plus d’informations, consultez Prise en charge de plusieurs affichages de documents.Si vous utilisez l’approche d’incorporation simplifiée, implémentez l’interface IVsWindowPane .
Si vous décidez d’utiliser l’activation sur place, implémentez les interfaces suivantes :
Remarque
L’interface
IOleInPlaceComponent
est utilisée pour éviter la fusion de menus OLE 2.Votre
IOleCommandTarget
implémentation gère les commandes telles que Couper, Copier et Coller. Lors de l’implémentationIOleCommandTarget
, déterminez si votre éditeur nécessite son propre fichier .vsct pour définir sa propre structure de menu de commandes ou s’il peut implémenter des commandes standard définies par Visual Studio. En règle générale, les éditeurs utilisent et étendent les menus de l’IDE et définissent leurs propres barres d’outils. Toutefois, il est souvent nécessaire qu’un éditeur définisse ses propres commandes spécifiques en plus de l’utilisation du jeu de commandes standard de l’IDE. Votre éditeur doit déclarer les commandes standard qu’il utilise, puis définir les nouvelles commandes, menus contextuels, menus de niveau supérieur et barres d’outils dans un fichier .vsct . Si vous créez un éditeur d’activation sur place, implémentez et définissez IOleInPlaceComponent les menus et barres d’outils de l’éditeur dans un fichier .vsct au lieu d’utiliser la fusion de menus OLE 2.Pour empêcher le regroupement de commandes de menu dans l’interface utilisateur, vous devez utiliser les commandes existantes dans l’IDE avant d’inventer de nouvelles commandes. Les commandes partagées sont définies dans SharedCmdDef.vsct et ShellCmdDef.vsct. Ces fichiers sont installés par défaut dans le sous-répertoire VisualStudioIntegration\Common\Inc de votre installation du Kit de développement logiciel (SDK) Visual Studio.
ISelectionContainer
peut exprimer des sélections uniques et multiples. Chaque objet sélectionné est implémenté en tant qu’objetIDispatch
.L’IDE implémente
IOleUndoManager
en tant que service accessible à partir d’un CreateInstance ou en tant qu’objet qui peut être instancié via CreateInstance. Votre éditeur implémente l’interfaceIOleUndoUnit
pour chaqueUndo
action.Il existe deux emplacements où un éditeur personnalisé peut exposer des objets Automation :
Document.Object
Window.Object