NSTextView et Tooltips [RESOLU]

GramboGrambo Membre
février 2009 modifié dans API AppKit #1
Bonjour,

Je souhaiterais pouvoir afficher dans un tooltip la traduction d'un mot lorsque je le survole dans un NSTextView. LA traduction est à   la charge de mon programme.
J'utilise pour l'affichage des tooltips la fonction delegate - (NSString *)textView:(NSTextView *)textView willDisplayToolTip:(NSString *)tooltip forCharacterAtIndex:(NSUInteger)characterIndex

Or je n'obtiens un toolTip que lorsque j'active "Continuous Spell Checking" dans Interface Builder, mais pas toujours. La plupart des mots du textView sont soulignés en rouge (mot inconnu) et j'obtiens le tooltip qui me convient lorsque je passe ma souris dessus. En revanche je n'obtiens aucun tooltip pour les mots qui ne sont pas soulignés.
Dans l'absolu je préférerais qu'aucun mot ne soit souligné en rouge.

J'ai donc deux questions:
La gestion des toolitps de NSTextView est elle liée au Spell Checking?
Comment activer les tooltips pour tous les mots de mon NsTextView?

Merci de votre aide.

Réponses

  • Philippe49Philippe49 Membre
    février 2009 modifié #2
    Effectivement, cela semble être le comportement automatique.

    Peut-être plus de renseignements dans le document sur OnlineHelp et sur le protocole NSToolTipOwner

    On peut aussi essayer d'installer le mécanisme "à  la main" avec les méthodes de NSView du type addTrackingArea:
  • Philippe49Philippe49 Membre
    février 2009 modifié #3
    Une autre piste de recherche serait de laisser le mécanisme graphique standard en place, et de jouer sur le correcteur orthographique lui-même
  • NoNo Membre
    06:56 modifié #4
    Bien sûr Philippe, bien sûr...
    Et dis lui aussi, tant qu'il y est, de ré-écrire OS X...


    Le delegate textView:willDisplayToolTip:forCharacterAtIndex: de NSTextView est appelé que si il y a déjà  un tootip à  modifier. Ce delegate permet donc d'en modifier le texte à  la volée.

    Si ton texte ne contient pas de tooltip, alors le delegate n'est pas appelé.

    Pour ajouter des tooltips à  tes mots, faut simplement ajouter l'attribut NSToolTipAttributeName pour chaque mot dont tu veux un tooltip à  l'attributedString qui est affichée dans la text view.

    Je te donne un petit exemple :
    <br />- (void)awakeFromNib<br />{<br />&nbsp;  NSMutableAttributedString *as;<br />&nbsp;  NSDictionary *attr;<br /><br />&nbsp;  // création d&#39;un texte pour la text-view<br />&nbsp;  as=[[NSMutableAttributedString alloc] initWithString:@&quot;Coco le asticot&quot;];<br /><br />&nbsp;  // création d&#39;un attribut &quot;tooltip&quot; attaché au mot &quot;coco&quot;<br />&nbsp;  attr=[[NSDictionary alloc] initWithObjectsAndKeys:@&quot;Coco&quot;, NSToolTipAttributeName, nil];<br />&nbsp;  [as setAttributes:attr range:NSMakeRange(0, 4)];<br />&nbsp;  [attr release];<br /><br />&nbsp;  // création d&#39;un attribut &quot;tooltip&quot; attaché au mot &quot;asticot&quot;<br />&nbsp;  attr=[[NSDictionary alloc] initWithObjectsAndKeys:@&quot;asticot&quot;, NSToolTipAttributeName, nil];<br />&nbsp;  [as setAttributes:attr range:NSMakeRange(8, 7)];<br />&nbsp;  [attr release];<br /><br />&nbsp;  // mise en place du texte dans la text-view<br />&nbsp;  [[textView textStorage] setAttributedString:as];<br />&nbsp;  [as release];<br />}<br /><br />- (NSString *)textView:(NSTextView *)textView willDisplayToolTip:(NSString *)tooltip forCharacterAtIndex:(NSUInteger)characterIndex<br />{<br />&nbsp;  if ([tooltip isEqual:@&quot;coco&quot;]) return @&quot;Pepere&quot;;<br />&nbsp;  if ([tooltip isEqual:@&quot;asticot&quot;]) return @&quot;ver de terre&quot;;<br />&nbsp;  return nil;<br />}<br />
    


  • Philippe49Philippe49 Membre
    06:56 modifié #5
    dans 1234087922:

    Bien sûr Philippe, bien sûr...
    Et dis lui aussi, tant qu'il y est, de ré-écrire OS X...


    Autant pour moi :) , je l'avais oublié cet attribut !
    Mais bon c'était rigolo à  la main ...  ;D 

  • AliGatorAliGator Membre, Modérateur
    06:56 modifié #6
    Pfff t'es pas joueur, No  :)
  • GramboGrambo Membre
    06:56 modifié #7
    Je n'avais pas encore eu l'occasion de tester le code. C'est maintenant chose faite.
    L'utilisation de l'attribut d'un NSMutableAttributedString m'a effectivement permis de résoudre le problème sans ré-écrire OSX! En plus je n'ai plus besoin de la fonction delegate.
    Mon problème est résolu.
    Merci.
  • NoNo Membre
    06:56 modifié #8
    dans 1234300185:

    Je n'avais pas encore eu l'occasion de tester le code. C'est maintenant chose faite.
    L'utilisation de l'attribut d'un NSMutableAttributedString m'a effectivement permis de résoudre le problème sans ré-écrire OSX! En plus je n'ai plus besoin de la fonction delegate.
    Mon problème est résolu.
    Merci.


    Tout dépend comment tu vas générer les tootips.
    - soit tu créés un tooltip par mot dans ton texte (et donc autant d'attributs),
    - soit tu ne créés qu'un seul tootip qui fait tout ton texte, et dans ce cas tu utilises le delegate, et via le paramètre forCharacterAtIndex, tu récupères la position du caractère survolé par la souris au moment de l'affichage du tooltip afin de modifier son contenu.

    Ce sont 2 gestions différentes, chacune à  ses avantages, et c'est le design de ton code qui décidera.
Connectez-vous ou Inscrivez-vous pour répondre.