à l'intérieur de l'éditeur

L'éditeur est composé d'un certain nombre de différents sous-systèmes, qui sont conçus pour conserver le modèle de texte d'éditeur distinct de l'affichage de texte et de l'interface utilisateur.

Les sections suivantes décrivent différents aspects de l'éditeur :

Les sections suivantes décrivent les fonctionnalités de l'éditeur :

Vue d'ensemble des sous-systèmes

Sous-système de modèle de texte

Le sous-système de modèle de texte est chargé de représenter le texte et de permettre sa manipulation. Le sous-système de modèle de texte contient l'interface d' ITextBuffer , qui décrit la séquence de caractères qui doit être affichée par l'éditeur. Ce texte peut être modifié, suivi, sinon et être manipulé de plusieurs façons. Le modèle de texte fournit également des types pour les aspects suivants :

  • un service qui associe le texte avec des fichiers, et gère la lecture et l'écriture elles dans le système de fichiers.

  • un service de différenciation qui recherche les différences minimales entre deux séquences d'objets.

  • Un système pour décrire le texte dans une mémoire tampon en termes de sous-ensembles du texte dans d'autres mémoires tampon.

Le sous-système de modèle de texte est exempt de concepts (UI) d'interface utilisateur. Par exemple, il n'est pas responsable de la disposition de mise en forme du texte ou de texte, et ne possède aucune connaissance des ornements visuels qui peuvent être associés à du texte.

Les types publics du sous-système de modèle de texte sont contenus dans Microsoft.VisualStudio.Text.Data.dll et Microsoft.VisualStudio.CoreUtilitiy.dll, lequel dépend uniquement de la bibliothèque de classes de base.NET Framework et de (MEF) managed extensibility framework.

sous-système d'affichage de texte

Le sous-système d'affichage de texte est responsable de la mise en forme et d'affichage du texte. Les types dans ce sous-système sont divisés en deux couches, selon que les types s'appuient sur Windows Presentation Foundation (WPF). Les types les plus importants sont ITextView et IWpfTextView, qui contrôlent l'ensemble de lignes de texte qui doivent être affichées, et également le signe insertion, la sélection, et les fonctionnalités pour ornementer le texte à l'aide de les éléments d'interface WPF. Ce sous-système fournit également des marges autour de la zone d'affichage du texte. Ces marges peuvent être étendues, et peuvent contenir différents types de contenu et d'effets visuels. Les exemples des marges sont des affichages et les barres de défilement de numéro de ligne.

les types publics du sous-système d'affichage de texte sont contenus dans Microsoft.VisualStudio.Text.UI.dl l et Microsoft.VisualStudio.Text.UI.Wp f.dll. Le premier assembly contient les éléments plateforme-indépendants, et le second contient les éléments spécifiques à WPF.

sous-système de classification

Le sous-système de classification est chargé de déterminer les propriétés de la police du texte. Un classifieur divise le texte dans différentes classes, par exemple, « motclé » ou « commentaire ». La carte de mise en forme de classification lie ces classes aux propriétés et de la police, par exemple, « Consolas bleu 10 pintes ». Ces informations sont utilisées par l'affichage de texte lorsqu'ils mettent en forme et restituent le texte. Référencer, qui est décrit plus en détail ultérieurement dans cette rubrique, permet aux données à associer à des étendues de texte.

Les types publics du sous-système de classification sont contenus dans Microsoft.VisualStudio.Text.Logic.dll, et ils interagissent avec les aspects visuels de la classification, contenues dans Microsoft.VisualStudio.Text.UI.Wp f.dll.

sous-système d'opérations

le sous-système d'opérations définit le comportement d'éditeur. Il fournit l'implémentation pour les touches d'édition de Visual Studio et le système d'annulation.

Une présentation détaillée au modèle de texte et à l'affichage de texte

Le modèle de texte

Le sous-système de modèle de texte se compose de différents groupes de classes types de texte. Ceux-ci incluent la mémoire tampon de texte, les instantanés de texte, et les étendues de texte.

Mémoires tampons de texte et instantanés de texte

L'interface d' ITextBuffer représente une séquence de caractères Unicode qui sont encodés à l'aide de UTF-16, qui est l'encodage utilisé par String dans le.NET Framework. Une mémoire tampon de texte peut être persistante comme un document du système de fichiers, mais cela n'est pas obligatoire.

ITextBufferFactoryService est utilisé pour créer une mémoire tampon de texte vide, ou une mémoire tampon de texte qui est initialisée d'une chaîne ou d' TextReader. La mémoire tampon de texte peut être rendues persistantes au système de fichiers comme ITextDocument.

la mémoire tampon de texte peut être modifiée par n'importe quel thread jusqu'à ce qu'un thread prenne la propriété de la mémoire tampon de texte en appelant TakeThreadOwnership. Après cela, uniquement ce thread peut exécuter des modifications.

Une mémoire tampon de texte peut traverser plusieurs versions pendant sa durée de vie. une nouvelle version est générée chaque fois que la mémoire tampon est modifiée, et ITextSnapshot immuable représente le contenu de cette version de la mémoire tampon. Étant donné que les instantanés de texte sont immuables, vous pouvez accéder à un instantané de texte sur n'importe quel thread, sans restrictions, même si la mémoire tampon de texte qu'il représente continue à changer.

Instantanés de texte et lignes de l'instantané de texte

Vous pouvez afficher le contenu d'un instantané de texte comme une séquence de caractères ou comme une séquence de lignes. Les caractères et les lignes sont tous deux démarrer indexé à zéro. Un instantané de texte vide contenant aucun caractère et une ligne vide. Une ligne est délimitée par une séquence de caractères valide de saut de ligne Unicode, ou par le début ou la fin de la mémoire tampon. Les caractères de saut de ligne sont explicitement représentés dans l'instantané de texte, et tous les sauts de ligne dans un instantané de texte ne doivent pas être identiques.

Notes

Pour plus d'informations sur les caractères de soulignement dans l'éditeur Visual Studio, consultez Encodages et sauts de ligne.

Une ligne de texte est représentée par un objet d' ITextSnapshotLine , qui peut être obtenu à partir d'un instantané de texte pour un numéro de ligne donné ou d'une position de caractère particulière.

SnapshotPoints, SnapshotSpans, et NormalizedSnapshotSpanCollections

SnapshotPoint représente une position de caractère dans un instantané. La position est garantie reposer entre zéro et la longueur de l'instantané. SnapshotSpan représente une plage de texte dans un instantané. sa position de fin est garantie de reposer entre zéro et la longueur de l'instantané. NormalizedSnapshotSpanCollection se compose d'un ensemble d'objets d' SnapshotSpan du même instantané.

Étendues et NormalizedSpanCollections

Span représente un intervalle qui peut être appliqué à une plage de texte dans un instantané de texte. Les positions relatives aux instantanés sont de base zéro, le des étendues peuvent commencer à n'importe quelle position y compris zéro. La propriété d' End d'une étendue est égal à la somme de sa propriété d' Start et de sa propriété d' Length . Span n'inclut pas le caractère qui est indexé par la propriété d' End . Par exemple, une étendue qui a Start=5 et Length=3 a End=8, et inclut les caractères aux positions 5, 6, et 7. La notation pour cette étendue est 5..8).

Deux étendues se croisent si elles ont des positions en commun, y compris la position de fin. Par conséquent, l'intersection de [3, 5) et [2, 7) est (3, 5) et l'intersection de [3, 5) et [5, 7) est (5, 5). (Remarquez qui [5, 5) est une étendue vide).

Deux étendues se chevauchent si elles ont des positions en commun, à l'exception de la position de fin. Une étendue vide ne recoupe jamais toute autre étendue, et le chevauchement de deux étendues n'est jamais vide.

NormalizedSpanCollection est une liste d'étendues de la commande des propriétés de début des étendues. Dans la liste, des étendues qui se chevauchent ou de aboutements sont fusionnées. Par exemple, dans le jeu d'étendues [5..9), [0..1), [3..6), et [9..10), la liste normalisée d'étendues est [0..1), [3..10).

ITextEdit, TextVersion et notifications de modifications de texte

Le contenu d'une mémoire tampon de texte peut être modifié à l'aide d'un objet d' ITextEdit . Création d'un tel objet (à l'aide de l'une des méthodes d' CreateEdit() d' ITextBuffer) commence une transaction de texte qui se compose des modifications de texte. Chaque modification est un remplacement d'une certaine plage de texte dans la mémoire tampon par une chaîne. Les coordonnées et le contenu de chaque modification sont exprimés par rapport à l'instantané de la mémoire tampon lorsque la transaction a été démarrée. L'objet d' ITextEdit ajuste les coordonnées des modifications qui sont affectées par d'autres modifications dans la même transaction.

par exemple, considérez une mémoire tampon de texte qui contient cette chaîne :

abcdefghij

Appliquez une transaction qui contient deux modifications, une modification à laquelle remplace l'étendue [2..4) à l'aide de le caractère X et une deuxième modification qui remplace la plage [6..9) à l'aide de le caractère Y. le résultat est cette mémoire tampon :

abXefYj

Les coordonnées de la deuxième modification ont été calculées par rapport à le contenu de la mémoire tampon au début de la transaction, avant la première modification a été appliquée.

Les modifications apportées à la mémoire tampon entrent en vigueur lorsque l'objet d' ITextEdit est validé en appelant sa méthode d' Apply() . S'il y avait au moins une modification non vide, nouveaux ITextVersion est créé, nouveaux ITextSnapshot est créé, et un événement d' Changed est déclenché. Chaque version de texte a un instantané de texte différent. Un instantané de texte représente l'état terminé de la mémoire tampon de texte après qu'une transaction de modification, mais une version de texte décrive uniquement les modifications d'un instantané au suivant. En général des instantanés de texte sont conçus pour être utilisés une fois et de ensuite être ignorés, tandis que les versions de texte doivent rester actives longtemps.

Une version de texte contient INormalizedTextChangeCollection. Cette collection décrit les modifications qui, lorsqu'il est appliqué à l'instantané, entraîneront l'instantané suivant. Chaque ITextChange dans la collection contient la position du caractère de la modification, de la chaîne remplacée, et de la chaîne de remplacement. La chaîne remplacée est vide pour une insertion de base, et la chaîne de remplacement est vide pour une suppression de base. La collection normalisée est toujours null pour la dernière version de la mémoire tampon de texte.

Un seul objet d' ITextEdit peut être instancié d'une mémoire tampon de texte à tout moment, et toutes les modifications de texte doivent être exécutées sur le thread qui possède la mémoire tampon de texte (si la propriété a été réclamée). Une modification de texte peut être abandonnée en appelant sa méthode d' Cancel ou sa méthode d' Dispose .

ITextBuffer fournit également Insert(), Delete(), et les méthodes d' Replace() qui ressemblent à ceux trouvés sur ITextEdit interface. Appeler ces derniers a le même effet de créer un objet d' ITextEdit , qui effectue l'appel semblable, puis appliquer les modifications.

points et étendues de suivi de suivi

ITrackingPoint représente une position de caractère dans une mémoire tampon de texte. Si la mémoire tampon est modifiée d'une façon qui entraîne la position du caractère du décalage, le point de suivi se déplace avec lui. Par exemple, si un point de suivi fait référence à la position 10 dans une mémoire tampon, et cinq caractères sont insérés au début de la mémoire tampon, le point de suivi puis font référence à la position 15. Si une insertion se produit avec précision à la position représentée par le point de suivi, son comportement est déterminé par son PointTrackingMode, qui peut être Positive ou Negative. Si le mode de suivi est positif, le point de suivi fait référence au même caractère, qui est maintenant à la fin de la mise en place ; si le mode de suivi est négatif, le point de suivi fait référence au premier caractère inséré à la position d'origine. Si le caractère à la position qui est représentée par un point de trace est supprimé, le point de suivi se déplace au premier caractère qui suit la plage supprimée. Par exemple, si un point de suivi fait référence au caractère à la position 5, et les caractères aux positions 3 à 6 sont supprimés, le point de suivi fait référence au caractère à la position 3.

ITrackingSpan représente une plage de caractères au lieu de simplement une position. son comportement est déterminé par son SpanTrackingMode. Si le mode de suivi de l'étendue est EdgeInclusive, l'étendue de suivi devient le texte incorporé inséré à ses bords ; si le mode de suivi de l'étendue est EdgeExclusive, l'étendue de suivi n'incorpore pas le texte inséré à ses bords. Toutefois, si le mode de suivi de l'étendue est EdgePositive, transmissions de type push d'une insertion la position actuelle vers le début, et si le mode de suivi EdgeNegatived'étendue, une insertion enfonce la position actuelle vers la fin.

Vous pouvez obtenir la position d'un point de suivi ou de l'étendue d'une étendue de suivi pour tout instantané de la mémoire tampon de texte à laquelle ils appartiennent. Les points et les étendues de suivi de traçage peuvent être sans risque référencés à partir de n'importe quel thread.

types de contenu

Les types de contenu sont un mécanisme pour définir différents types de contenu. Un type de contenu peut être un type de fichier tel que « texte », « code », ou « binaire », ou un type de technologie tel que « xml », « VB », ou « c# ». Par exemple, le mot « à » est un mot clé en c# et Visual Basic, mais pas dans d'autres langages de programmation. Par conséquent, la définition de ce mot clé est limitée aux types de contenu « c# » et « VB ».

Les types de contenu sont utilisés comme filtre des ornements et d'autres éléments de l'éditeur. De nombreuses fonctionnalités d'éditeur et de points d'extension sont définis par type de contenu ; par exemple, la coloration de texte est différente pour les fichiers texte brut, les fichiers de code source des fichiers XML, et Visual Basic. Les mémoires tampons de texte sont généralement assignées un type de contenu lorsqu'elles sont créées, et le type de contenu d'une mémoire tampon de texte peut être modifié.

Les types de contenu est multiple-hériter d'autres types de contenu. ContentTypeDefinition vous permet de spécifier des types de base multiples comme parents d'un type de contenu donné.

Les développeurs peuvent définir leurs propres types de contenu et les enregistrer à l'aide de IContentTypeRegistryService. De nombreuses fonctionnalités d'éditeur peuvent être définies par rapport à un type de contenu spécifique à l'aide de ContentTypeAttribute. Par exemple, les marges d'éditeur, les ornements, et des gestionnaires de souris peuvent être définis afin qu'elles s'appliquent uniquement aux éditeurs qui affichent des types de contenu spécifiques.

L'affichage de texte

La partie de vue du modèle de contrôleur (MVC) de la vue définit l'affichage de texte, la mise en forme de la vue, les éléments graphiques tels que la barre de défilement, et le signe insertion. Tous les éléments de présentation de l'éditeur Visual Studio sont basés sur WPF.

affichages de texte

l'interface d' ITextView est une représentation plateforme-indépendante d'un affichage de texte. Elle est utilisée essentiellement aux documents de texte dans une fenêtre, mais peut également être utilisée à d'autres fins, par exemple, dans une info-bulle.

L'affichage de texte référence différents genres de mémoires tampons de texte. La propriété d' TextViewModel fait référence à un objet d' ITextViewModel qui indique ces trois mémoires tampons de texte différentes : la mémoire tampon de données, qui est la mémoire tampon supérieure de donnée-niveau, le tampon d'édition, dans lequel la modification se produit, et la mémoire tampon visuelle, qui est la mémoire tampon qui est affichée dans l'affichage de texte.

Le texte est mis en forme en fonction de les classifieurs attachés à la mémoire tampon sous-jacente, et est ornementé à l'aide de fournisseurs d'ornements attachés à l'affichage de texte lui-même.

Le système de coordonnées d'affichage de texte

Le système de coordonnées d'affichage de texte spécifie des endroits dans l'affichage de texte. Dans ce système de coordonnées, la valeur 0,0 d' x correspond au bord gauche du texte affiché, et la valeur 0,0 d' y correspond au bord supérieur du texte affiché. La coordonnée d' x augmente de gauche à droite, et la coordonnée d' y augmente de haut en bas.

Une fenêtre d'affichage (la partie du texte visible dans la fenêtre de texte) ne peut pas être accompli défiler de la même façon horizontalement telle qu'elle est faite défilement vertical. Une fenêtre d'affichage est effectuée défilement horizontal en changeant la coordonnée gauche afin qu'il déplace par rapport à la zone de dessin. Toutefois, une fenêtre d'affichage est possible de faire défiler verticalement uniquement en modifiant le texte rendu, ce qui déclenche un événement d' LayoutChanged à déclencher.

les distances dans le système de coordonnées correspondent aux pixels logiques. Si la surface de rendu de texte est affichée sans transformation de mise à l'échelle, une unité dans le système de coordonnées d'affichage du texte correspond à un pixel dans l'affichage.

Marges

l'interface d' ITextViewMargin représente une marge et active le contrôle de la visibilité de la marge et de sa taille. Il existe quatre marges prédéfinies, qui sont nommées « haut », « a démarré », « droit sur », et « bas » et est attaché vers le bord supérieur, inférieur, le gauche, ou droit d'une vue. Les marges sont des conteneurs dans lesquels d'autres marges peuvent être placées. L'interface définit les méthodes qui retournent la taille de la marge et la visibilité à une plage. Les marges sont des éléments visuels qui fournissent des informations supplémentaires sur l'affichage de texte auquel elles sont attachées. par exemple, la marge de numéro de ligne affiche des numéros de ligne pour l'affichage de texte. La marge de glyphe affiche des éléments d'interface utilisateur.

l'interface d' IWpfTextViewMarginProvider gère la création et le positionnement des marges. Les marges peuvent être classées par rapport à d'autres marges. Les marges plus élevée se trouvent plus proche de l'affichage de texte. Par exemple, s'il y a deux marges gauche, met en marge A et met en marge B, et marge B a une priorité plus basse que margin A, B marge apparaît à gauche de la marge A.

L'hôte d'affichage de texte

L'interface d' IWpfTextViewHost contient l'affichage de texte et toutes les ornements de contiguës qui accompagnent la vue, par exemple, les barres de défilement. L'hôte d'affichage de texte contient également les marges qui sont attachées à une bordure de la vue.

texte mis en forme

Le texte affiché dans un affichage de texte est composé des objets d' ITextViewLine . chaque ligne d'affichage de texte correspond à une ligne de texte dans l'affichage de texte. Les longues lignes dans la mémoire tampon sous-jacente peuvent être partiellement masquées (si le retour automatique à la ligne n'est pas activée) ou réparti sur plusieurs lignes d'affichage de texte. L'interface d' ITextViewLine contient des méthodes et des propriétés pour le mappage entre les coordonnées et des caractères, et pour les ornements qui peuvent être associés à la ligne.

les objets d'ITextViewLine sont créés à l'aide d'une interface d' IFormattedLineSource . Si vous avez juste besoin de savoir le texte actuellement affiché dans la vue, vous pouvez ignorer la source de mise en forme. Si vous vous intéressez au format du texte qui n'est pas affiché dans la vue (par exemple, pour prendre en charge un couper-coller de texte enrichi), vous pouvez utiliser IFormattedLineSource pour mettre en forme le texte dans une mémoire tampon de texte.

l'affichage de texte met en forme un ITextSnapshotLine à la fois.

fonctionnalités d'éditeur

Les fonctionnalités de l'éditeur sont destinées afin que la définition de la fonctionnalité soit distinct de son implémentation. L'éditeur inclut les fonctionnalités suivantes :

  • Balises et classifieurs

  • ornements

  • Projection

  • Mode Plan

  • souris et combinaisons de touches

  • opérations et primitifs

  • IntelliSense

Balises et classifieurs

Les balises sont les marqueurs qui sont associées à une étendue de texte. Ils peuvent être présentés de différentes façons, par exemple, en utilisant la coloration de texte, des soulignements, des graphiques, ou de fenêtres contextuelles. Les classifieurs sont un type de balise.

D'autres types de balises sont TextMarkerTag pour le texte mise en surbrillance, OutliningRegionTag pour esquisser, et ErrorTag pour les erreurs de compilation.

types de classification

une interface d' IClassificationType représente une classe d'équivalence, qui est une catégorie abstraite de texte. Les types de classification peuvent multiple-hériter d'autres types de classifications. Par exemple, les classifications de langages de programmation peuvent inclure « motclé », « commentaire », et « identificateur », que toutes héritent de « code ». Les types de classifications de langages naturels peuvent inclure le « nom », « mangera », et « adjectif », que tous héritent de « de langage naturel ».

Classifications

Une classification est une instance d'un type de classification particulier, généralement sur une étendue de texte. ClassificationSpan est utilisé pour représenter une classification. Une étendue de classification peut être considérée comme un nom qui couvre une étendue de texte particulière et indique au système que cette étendue de texte est d'un type de classification particulier.

Classifieurs

IClassifier est un mécanisme qui divise le texte en un jeu de classifications. Les classifieurs doivent être définis pour les types de contenu spécifiques et être instanciés pour les mémoires tampons de texte spécifiques. Les clients doivent implémenter IClassifier pour participer à la classification de texte.

Agrégations de classifieur

Une agrégation du classifieur est un mécanisme qui combine tous les classifieurs d'une mémoire tampon de texte simplement un en un jeu de classifications. Par exemple, un classifieur c# et un classifieur de langue anglaise peuvent créer des classifications sur un commentaire dans un fichier c#. Prenons le commentaire :

// This method produces a classifier

Un classifieur c# peut ajouter une étiquette à l'étendue entière commentaire, et le classifieur en anglais peut classer « product » en tant que « mangera » et « méthode » comme « nom ». L'agrégation produit un jeu de classifications non-recouvertes, et le type de l'ensemble est basé sur toutes les contributions.

Une agrégation du classifieur est également un classifieur car il divise le texte en un jeu de classifications. L'agrégation du classifieur garantie qu'il n'y a pas de classification la et que les classifications sont triées. Les différents classifieurs sont libres de retourner jeu de classifications, n'importe quel ordre, et en se chevauchant de quelque manière que ce soit.

Mise en forme de classification et coloration de texte

La mise en forme du texte est un exemple d'une fonctionnalité qui repose sur la classification de texte. Elle est utilisée par la couche d'affichage de texte pour déterminer l'affichage de texte dans une application. la zone de mise en forme du texte dépend de WPF, mais la définition logique des classifications n'est pas.

Un format de classification est un ensemble de propriétés de mise en forme pour un type spécifique de classification. ces formats héritent du format du parent du type de classification.

IClassificationFormatMap est un mappage d'un type de classification à un ensemble de propriétés de mise en forme du texte. L'implémentation de la carte de mise en forme dans l'éditeur gère toutes les exportations les formats de classification.

ornements

Les ornements sont des effets graphiques qui ne sont pas directement lié à la police et la couleur des caractères dans l'affichage de texte. Par exemple, le soulignement rouge de tilde qui est utilisé pour marquer non-compiler code dans de nombreux langages de programmation est un ornement incorporé, et les info-bulles sont les ornements contextuels. les ornements sont dérivés d' UIElement et implémentent ITag. Deux types spécifiques de balises d'ornements sont SpaceNegotiatingAdornmentTag, pour les ornements qui occupent le même espace que le texte d'une vue, et ErrorTag, pour le soulignement de tilde.

Les ornements incorporés sont des graphiques qui font partie de la vue de texte mis en forme. Ils sont organisés dans différentes couches de l'ordre de plan. Il existe trois couches prédéfinies, comme suit : texte, le signe insertion, et la sélection. Toutefois, les développeurs peuvent définir des couches et les mettre dans l'ordre par rapport à une autre. Les trois types d'ornements incorporés sont des ornements de texte-parent (qui déplacez lorsque le texte se déplace, et sont supprimés lorsque le texte est rogné), les ornements de vue-parent (qui concernent les éléments non-texte de la vue), et des ornements propriétaire-contrôlés (le développeur doit gérer leur positionnement.)

Les ornements contextuels sont des graphiques qui s'affichent dans une petite fenêtre au-dessus de l'affichage de texte, par exemple, info-bulles.

Projection

La projection est une technique permettant de construire un type différent de mémoire tampon de texte qui ne stocke pas le texte, mais plutôt les combine le texte d'autres mémoires tampon de texte. Par exemple, une mémoire tampon de projection peut être utilisée pour concaténer le texte de deux autres mémoires tampons et pour présenter le résultat comme si elle est dans une seule mémoire tampon, ou pour masquer des parties du texte dans une mémoire tampon. Une mémoire tampon de projection peut jouer le rôle d'une mémoire tampon source à une autre mémoire tampon de projection. Un ensemble de mémoires tampons associées par projection peut être développé pour réorganiser le texte de différentes façons. (Ce jeu est également appelé un graphique de mémoire tampon.) La fonctionnalité mode Plan de texte de Visual Studio est implémenté à l'aide d'une mémoire tampon de projection pour masquer du texte réduit, et l'éditeur Visual Studio pour les pages ASP.NET. utilise la projection pour prendre en charge les langues incorporés tels que Visual Basic et c#.

IProjectionBuffer est créé à l'aide de IProjectionBufferFactoryService. Une mémoire tampon de projection est représentée par une séquence classée d'objets d' ITrackingSpan appelées des étenduessources. Le contenu de ces étendues est présenté comme une séquence de caractères. Les mémoires tampons de texte dont les étendues de sources sont effectuées sont appelées des mémoires tampon source. Les clients d'une mémoire tampon de projection ne doivent pas savoir qu'elle diffère d'une mémoire tampon de texte ordinaire.

La mémoire tampon de projection écoute les événements de texte-modification sur la mémoire tampon source. Lorsque le texte dans une étendue de source change, la mémoire tampon de projection mappe les coordonnées modifiées de texte à ses propres coordonnées et déclenche robustesse et les événements de texte-modification. Par exemple, considérez les mémoires tampons A et B sources qui ont ce contenu :

A: ABCDE
B: vwxyz

Si la mémoire tampon de projection P est formée de deux étendues de texte, une qui ont toute la mémoire tampon Un et l'autre qui ont tous les mémoire tampon B, P a le contenu suivant :

P: ABCDEvwxyz

Si la sous-chaîne xy est supprimée de la mémoire tampon B, la mémoire tampon P déclenche un événement qui indique que les caractères aux positions 7 et 8 ont été supprimés.

La mémoire tampon de projection peut également être modifiées directement. Il propage des modifications aux mémoires tampons appropriées de source. Par exemple, si une chaîne est insérée dans la mémoire tampon P à la position 6 (la position d'origine du caractère « v »), l'insertion est propagée pour mettre B en mémoire tampon à la position 1.

Il existe des restrictions sur les étendues de source contribuant à une mémoire tampon de projection. Les étendues de sources peuvent ne pas se chevaucher ; un emplacement dans une mémoire tampon de projection ne peut pas mapper à plusieurs emplacements dans une mémoire tampon source, et un emplacement dans une mémoire tampon source ne peut pas mapper à plusieurs emplacements dans une mémoire tampon de projection. Aucune circularité n'est autorisée dans la relation de mémoire tampon source.

Les événements sont déclenchés lorsque l'ensemble des mémoires tampons source d'une mémoire tampon de projection change et lorsque le jeu d'étendues de source change.

Une mémoire tampon d'élision est un genre de mémoire tampon de projection. Elle est principalement utilisée pour esquisser et pour les opérations qui permettent de développer et de réduire des blocs de texte. Une mémoire tampon d'élision est basé sur une seule la mémoire tampon source, et les étendues de la mémoire tampon d'élision doivent être classées les mêmes qu'elles sont classés dans la mémoire tampon source.

Le graphique de mémoire tampon

L'interface d' IBufferGraph active le mappage entre un graphique des mémoires tampon de projection. Toutes les mémoires tampons de texte et mémoires tampons de projection sont collectées dans un graphique acyclique exécuté, comme l'arborescence de syntaxe abstraite qui a généré par un compilateur de langage. Le graphique est défini par la mémoire tampon supérieure, qui peut être toute mémoire tampon de texte. Le graphique de mémoire tampon peut mapper d'un point de la mémoire tampon supérieure à un point dans une mémoire tampon source, ou d'une étendue dans une mémoire tampon supérieure à un jeu d'étendues dans une mémoire tampon source. De même, il peut mapper un point ou une étendue d'une mémoire tampon source à un point dans la mémoire tampon supérieure. Les graphiques de mémoire tampon sont créés à l'aide de IBufferGraphFactoryService.

Événements et mémoires tampons de projection

Lorsqu'une mémoire tampon de projection est modifiée, les modifications sont envoyées de la mémoire tampon de projection aux mémoires tampons qui en dépendent. Une fois toutes les mémoires tampons sont modifiées, les événements de modification de mémoire tampon sont contrôlées, en commençant par la mémoire tampon la plus profonde.

Mode Plan

Le mode Plan est la possibilité de développer ou réduire des blocs de texte dans un affichage de texte. Le mode Plan est défini comme type d' ITag, de la même façon que les ornements sont définis. OutliningRegionTag est une balise qui définit une zone de texte qui peut être développée ou réduite. pour utiliser le mode Plan, vous devez importer IOutliningManagerService pour obtenir IOutliningManager. Le gestionnaire de mode Plan énumère, réduit, et développe les divers blocs, qui sont représentés comme objets d' ICollapsible , et déclenche des événements en conséquence.

liaisons de souris

Les liaisons de souris lient les déplacements de la souris vers différentes commandes. Les liaisons de souris sont définies à l'aide de IMouseProcessorProvider, et les combinaisons de touches sont définies à l'aide de IKeyProcessorProvider. IWpfTextViewHost instancie automatiquement toutes les liaisons et les connecte aux événements de souris dans la vue.

L'interface d' IMouseProcessor contient prétraitent et post-processus des gestionnaires d'événements pour différents événements de souris. pour gérer un des événements, vous pouvez substituer certaines des méthodes dans MouseProcessorBase.

opérations d'éditeur

Les opérations d'éditeur peuvent être utilisées pour automatiser l'interaction avec l'éditeur, pour les scripts ou d'autres. Vous pouvez importer IEditorOperationsFactoryService pour accéder aux opérations sur ITextViewdonné. Vous pouvez ensuite utiliser ces objets pour modifier la sélection, pour faire défiler la vue, ou pour déplacer le signe insertion à différentes parties de la vue.

IntelliSense

IntelliSense prend en charge la saisie semi-automatique des instructions, assistance de signature (également appelés informations sur les paramètres), info express, et balises actives.

La saisie semi-automatique des instructions fournit les listes contextuelles de saisies semi-automatiques potentiels pour les noms de méthode, des éléments XML, et d'autres programmation ou éléments de balisage. En général une entrée tactile d'utilisateur appelle une session de saisie semi-automatique. La session affiche la liste des saisies semi-automatiques potentiels, et l'utilisateur peut sélectionner un ou quittez la liste. ICompletionBroker est chargé de créer et de déclencher ICompletionSession. ICompletionSource calcule CompletionSet les éléments de saisie semi-automatique pour la session.

Voir aussi

Concepts

Points d'extension de l'éditeur

importations d'éditeur