Exécution de la table de document

L’IDE gère la liste de tous les documents actuellement ouverts dans une structure interne appelée table de documents en cours d’exécution (RDT). Cette liste inclut tous les documents ouverts en mémoire, que ces documents soient actuellement modifiés. Un document est tout élément persistant, y compris les fichiers d’un projet ou le fichier projet principal (par exemple, un fichier .vcxproj).

Éléments de la table de documents en cours d’exécution

Le tableau de documents en cours d’exécution contient les entrées suivantes.

Élément Description
Moniker de document Chaîne qui identifie de manière unique l’objet de données de document. Il s’agit du chemin d’accès absolu du fichier pour un système de projet qui gère les fichiers (par exemple, C :\MyProject\MyFile). Cette chaîne est également utilisée pour les projets enregistrés dans des magasins autres que les systèmes de fichiers, tels que les procédures stockées dans une base de données. Dans ce cas, le système de projet peut inventer une chaîne unique qu’il peut reconnaître et éventuellement analyser pour déterminer comment stocker le document.
Propriétaire de hiérarchie Objet de hiérarchie propriétaire du document, tel qu’il est représenté par une IVsHierarchy interface.
ID d’article Identificateur d’élément pour un élément spécifique dans la hiérarchie. Cette valeur est unique parmi tous les documents de la hiérarchie qui possède ce document, mais cette valeur n’est pas garantie d’être unique dans différentes hiérarchies.
Objet de données de document Au minimum, il s’agit d’une IUnknown

. L’IDE ne nécessite aucune interface particulière au-delà de l’interface pour l’objet IUnknown de données de document d’un éditeur personnalisé. Toutefois, pour un éditeur standard, l’implémentation de l’éditeur de l’interface IVsPersistDocData2 est nécessaire pour gérer les appels de persistance de fichiers à partir du projet. Pour plus d’informations, consultez l’enregistrement d’un document standard.
Indicateurs Indicateurs qui contrôlent si le document est enregistré, si un verrou de lecture ou de modification est appliqué, et ainsi de suite, peuvent être spécifiés lorsque les entrées sont ajoutées au RDT. Pour plus d’informations, consultez l’énumération _VSRDTFLAGS.
Modifier le nombre de verrous Nombre de verrous de modification. Un verrou d’édition indique que l’éditeur a ouvert le document pour modification. Lorsque le nombre de verrous d’édition passe à zéro, l’utilisateur est invité à enregistrer le document, s’il a été modifié. Par exemple, chaque fois que vous ouvrez un document dans un éditeur à l’aide de la commande Nouvelle fenêtre , un verrou d’édition est ajouté pour ce document dans le RDT. Pour qu’un verrou de modification soit défini, le document doit avoir une hiérarchie ou un ID d’élément.
Nombre de verrous en lecture Nombre de verrous de lecture. Un verrou de lecture indique que le document est lu via un mécanisme tel qu’un Assistant. Un verrou de lecture contient un document actif dans le RDT tout en indiquant que le document ne peut pas être modifié. Vous pouvez définir un verrou de lecture même si le document n’a pas de hiérarchie ou d’ID d’élément. Cette fonctionnalité vous permet d’ouvrir un document en mémoire et de l’entrer dans le RDT sans que le document soit détenu par une hiérarchie. Cette fonctionnalité est rarement utilisée.
Porte-verrou Instance d’une IVsDocumentLockHolder interface. Le porte-verrou est implémenté par des fonctionnalités telles que des Assistants qui ouvrent et modifient des documents en dehors d’un éditeur. Un porte-verrou permet à la fonctionnalité d’ajouter un verrou de modification au document pour empêcher la fermeture du document pendant qu’il est en cours de modification. Normalement, les verrous de modification sont ajoutés uniquement par les fenêtres de document (autrement dit, les éditeurs).

Chaque entrée dans le RDT a une hiérarchie ou un ID d’élément unique associé à celui-ci, ce qui correspond généralement à un nœud dans le projet. Tous les documents disponibles pour modification appartiennent généralement à une hiérarchie. Les entrées effectuées dans le contrôle RDT qui projetent ou, plus précisément, quelle hiérarchie possède actuellement l’objet de données de document en cours de modification. À l’aide des informations contenues dans rdT, l’IDE peut empêcher l’ouverture d’un document par plusieurs projets à la fois.

La hiérarchie contrôle également la persistance des données et utilise les informations du RDT pour mettre à jour les boîtes de dialogue Enregistrer et Enregistrer sous . Lorsque les utilisateurs modifient un document, puis choisissez la commande Quitter dans le menu Fichier , l’IDE les invite à utiliser la boîte de dialogue Enregistrer les modifications pour les afficher tous les projets et éléments de projet actuellement modifiés. Cela permet aux utilisateurs de choisir les documents à enregistrer. La liste des documents à enregistrer (c’est-à-dire les documents qui ont des modifications) est générée à partir du RDT. Tous les éléments que vous prévoyez de voir dans la boîte de dialogue Enregistrer les modifications lors de la sortie de l’application doivent avoir des enregistrements dans le RDT. Le RDT coordonne les documents enregistrés et indique si l’utilisateur est invité à effectuer une opération d’enregistrement à l’aide des valeurs spécifiées dans l’entrée Indicateurs pour chaque document. Pour plus d’informations sur les indicateurs RDT, consultez l’énumération _VSRDTFLAGS .

Modifier les verrous et les verrous de lecture

Modifiez les verrous et les verrous de lecture résident dans le RDT. La fenêtre de document incrémente et décrémente le verrou d’édition. Par conséquent, lorsqu’un utilisateur ouvre une nouvelle fenêtre de document, le nombre de verrous d’édition est incrémenté d’un. Lorsque le nombre de verrous d’édition atteint zéro, la hiérarchie est signalée pour conserver ou enregistrer les données du document associé. La hiérarchie peut ensuite conserver les données de n’importe quelle façon, y compris la persistance en tant que fichier ou en tant qu’élément dans un référentiel. Vous pouvez utiliser la LockDocument méthode dans l’interface IVsRunningDocumentTable pour ajouter des verrous de modification et lire des verrous, et la UnlockDocument méthode pour supprimer ces verrous.

Normalement, lorsque la fenêtre de document d’un éditeur est instanciée, le cadre de la fenêtre ajoute automatiquement un verrou d’édition pour le document dans le RDT. Toutefois, si vous créez une vue personnalisée d’un document qui n’utilise pas de fenêtre de document standard (autrement dit, elle n’implémente pas l’interface IVsWindowFrame ), vous devez définir votre propre verrou de modification. Par exemple, dans un Assistant, un document est modifié sans être ouvert dans un éditeur. Pour que les verrous de document soient ouverts par des Assistants et des entités similaires, ces entités doivent implémenter l’interface IVsDocumentLockHolder . Pour inscrire votre porte-verrou de document, appelez la RegisterDocumentLockHolder méthode et transmettez votre IVsDocumentLockHolder implémentation. Cela ajoute votre porte-verrou de document au RDT. Un autre scénario d’implémentation d’un verrou de document est si vous ouvrez un document via une fenêtre d’outil spéciale. Dans cette instance, vous ne pouvez pas fermer la fenêtre outil du document. Toutefois, en s’inscrivant en tant que titulaire de verrou de document dans le RDT, l’IDE peut appeler votre implémentation de la CloseDocumentHolder méthode pour inviter une fermeture du document.

Autres utilisations de la table de documents en cours d’exécution

D’autres entités de l’IDE utilisent rdT pour obtenir des informations sur les documents. Par exemple, le gestionnaire de contrôle de code source utilise rdT pour indiquer au système de recharger un document dans l’éditeur, après avoir obtenu la dernière version du fichier. Pour ce faire, le gestionnaire de contrôle de code source recherche les fichiers dans rdT pour voir si l’un d’eux est ouvert. S’ils le sont, le gestionnaire de contrôle de code source case activée d’abord pour voir que la hiérarchie implémente la ReloadItem méthode. Si le projet n’implémente pas la ReloadItem méthode, le gestionnaire de contrôle de code source case activée pour une implémentation de la ReloadDocData méthode sur l’objet de données de document directement.

L’IDE utilise également le RDT pour ressurfacer (apporter à l’avant) un document ouvert, si un utilisateur demande ce document. Pour plus d’informations, consultez Affichage des fichiers à l’aide de la commande Ouvrir un fichier. Pour déterminer si un fichier est ouvert dans rdT, effectuez l’une des opérations suivantes.

  • Recherchez le moniker de document (autrement dit, le chemin complet du document) pour savoir si l’élément est ouvert.

  • Utilisez la hiérarchie ou l’ID d’élément pour demander au système de projet le chemin d’accès complet du document, puis recherchez l’élément dans le RDT.

Voir aussi