2010-10-14 7 views
1

J'essaie de supprimer un corps de classe en utilisant le nouveau modèle de code de l'éditeur de texte dans une extension Visual Studio 2010. Autrement dit, j'essaie d'utiliser la méthode Delete sur ITextEdit pour tout supprimer entre accolades.Comment trouver la position équivalente dans un iTextEdit d'un EditPoint.AbsoluteCharOffset

je peux avoir accès à la position de caractère absolu du début et la fin de la classe en utilisant les

codeClass.GetStartPoint(vsCMPart.vsCMPartBody).CreateEditPoint().AbsoluteCharOffset 

et

codeClass.GetEndPoint(vsCMPart.vsCMPartBody).CreateEditPoint().AbsoluteCharOffset 

méthodes sur l'interface CodeClass. Si je puis obtenir un ITextEdit de la ITextBuffer de IWpfTextViewHost en cours, et puis essayer de supprimer:

iTextEdit.Delete(startCharOffset, endCharOffset - startCharOffset); 

la suppression est incorrecte. Il semble qu'il n'y ait pas de correspondance 1: 1 entre AbsoluteCharOffset sur l'ancien modèle et la position dans le nouveau modèle de texte.

Comment interagir entre les deux modèles?

Merci d'avance pour votre aide.

Répondre

4

AbsoluteCharOffset renvoie une valeur qui n'est en réalité pas le décalage de caractère absolu, comme always counts line break characters as 1 character long, même si "\ r \ n" correspond probablement à ce que votre fichier utilise. La meilleure façon de faire la traduction est d'obtenir le numéro de la ligne et de la colonne offset, peut-être une méthode d'assistance comme:

SnapshotPoint SnapshotPointFromEditPoint(EditPoint editPoint, ITextSnapshot snapshot) 
{ 
    int lineNumber = editPoint.Line - 1; 
    int offset = editPoint.LineCharOffset - 1; 
    return snapshot.GetLineFromLineNumber(lineNumber).Start + offset; 
} 

(je viens d'apprendre à ce sujet il y a quelques mois, d'un problème de performance dans Dev10 où le calcul du AbsoluteCharOffset est vraiment cher, je vous recommande d'éviter tous les endroits possibles)

Questions connexes