7 votes

Afficher les caractères cachés dans NSTextView

J'écris un éditeur de texte pour Mac OS X. J'ai besoin d'afficher les caractères cachés dans un NSTextView (comme les espaces, les tabulations et les caractères spéciaux). J'ai passé beaucoup de temps à chercher comment faire cela, mais je n'ai pas encore trouvé de réponse. Si quelqu'un pouvait m'indiquer la bonne direction, je lui en serais reconnaissant.

2voto

user3717478 Points 363

Voici la solution de Pol en Swift :

class MyLayoutManager: NSLayoutManager {
    override func drawGlyphsForGlyphRange(glyphsToShow: NSRange, atPoint origin: NSPoint) {
        if let storage = self.textStorage {
            let s = storage.string
            let startIndex = s.startIndex
            for var glyphIndex = glyphsToShow.location; glyphIndex < glyphsToShow.location + glyphsToShow.length; glyphIndex++ {
                let characterIndex = self.characterIndexForGlyphAtIndex(glyphIndex)
                let ch = s[startIndex.advancedBy(characterIndex)]
                switch ch {
                case " ":
                    let attrs = storage.attributesAtIndex(characterIndex, effectiveRange: nil)
                    if let font = attrs[NSFontAttributeName] {
                        let g = font.glyphWithName("periodcentered")
                        self.replaceGlyphAtIndex(glyphIndex, withGlyph: g)
                    }
                case "\n":
                    let attrs = storage.attributesAtIndex(characterIndex, effectiveRange: nil)
                    if let font = attrs[NSFontAttributeName] {
//                        let g = font.glyphWithName("carriagereturn")
                        let g = font.glyphWithName("paragraph")
                        self.replaceGlyphAtIndex(glyphIndex, withGlyph: g)
                    }
                case "\t":
                    let attrs = storage.attributesAtIndex(characterIndex, effectiveRange: nil)
                    if let font = attrs[NSFontAttributeName] {
                        let g = font.glyphWithName("arrowdblright")
                        self.replaceGlyphAtIndex(glyphIndex, withGlyph: g)
                    }
                default:
                    break
                }
            }
        }
        super.drawGlyphsForGlyphRange(glyphsToShow, atPoint: origin)
    }
}

Et de lister les noms des glyphes :

   func listFonts() {
        let font = CGFontCreateWithFontName("Menlo-Regular")
        for var i:UInt16 = 0; i < UInt16(CGFontGetNumberOfGlyphs(font)); i++ {
            if let name = CGFontCopyGlyphNameForGlyph(font, i) {
                print("name: \(name) at index \(i)")
            }
        }
    }

0voto

titaniumdecoy Points 7548

Ce que j'ai fait, c'est surcharger la méthode ci-dessous dans une sous-classe de NSLayoutManager.

- (void)drawGlyphsForGlyphRange:(NSRange)range atPoint:(NSPoint)origin
{
    [super drawGlyphsForGlyphRange:range atPoint:origin];

    for (int i = range.location; i != range.location + range.length; i++)
    {
        // test each character in this range
        // if appropriate replace it with -replaceGlyphAtIndex:withGlyph:
    }
}

Je passe en boucle sur l'index de chaque personnage. Le problème que je rencontre maintenant est de savoir comment déterminer quel caractère se trouve à chaque endroit. Dois-je utiliser une méthode NSLayoutManager ou demander au NSTextView lui-même ? Les indices dans le premier cas sont-ils les mêmes que dans le second ?

Je peux obtenir un glyphe individuel avec -glyphAtIndex : mais je n'arrive pas à déterminer à quel caractère il correspond.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X