Problème de firstResponder...
Chacha
Membre
Salut,
Dans LaTeXit (juste pour situer), la fenêtre principale dispose d'un NSImageView et d'un NSTextView qui est assez logiquement le firstReponder, pour qu'on puisse y taper du texte directement à l'ouverture.
Ce NSTextView n'est pas "graphics enabled", donc on ne peut y copier/coller d'images.
Or, je voudrais que lorsqu'on a une image dans le presse-papier (NSGeneralPboard), on puisse la "coller" dans le document avec Pomme-V; elle serait alors mise dans l'imageView.
Problème : le "coller" n'est pas disponible puisque le NSTextView n'est pas graphics enabled.
J'ai essayé de contourner le problème ainsi :
-dans ma NSImageView (qui est subclassée) j'implémente une méthode -(IBAction) paste:(sender) (c'est un truc que j'ai trouvé dans le Cocoa Programming for MacOS XÂ : le copy/cut/paste peut être implémenté ainsi dans une NSView grâce au mécanisme de FirstResponder/nextResponder)
-dans mon document, je déclare la imageView comme nextResponder du NSTextView.
Mais ça ne marche pas.
Autre idée : rendre l'imageView initialFirstResponder et déclarer le NSTextView comme nextResponder.
Mais ça ne marche pas non plus.
Auriez-vous d'autre idées, d'autre voies à suivre, d'autres méthodes à proposer ?
+
Chacha
Dans LaTeXit (juste pour situer), la fenêtre principale dispose d'un NSImageView et d'un NSTextView qui est assez logiquement le firstReponder, pour qu'on puisse y taper du texte directement à l'ouverture.
Ce NSTextView n'est pas "graphics enabled", donc on ne peut y copier/coller d'images.
Or, je voudrais que lorsqu'on a une image dans le presse-papier (NSGeneralPboard), on puisse la "coller" dans le document avec Pomme-V; elle serait alors mise dans l'imageView.
Problème : le "coller" n'est pas disponible puisque le NSTextView n'est pas graphics enabled.
J'ai essayé de contourner le problème ainsi :
-dans ma NSImageView (qui est subclassée) j'implémente une méthode -(IBAction) paste:(sender) (c'est un truc que j'ai trouvé dans le Cocoa Programming for MacOS XÂ : le copy/cut/paste peut être implémenté ainsi dans une NSView grâce au mécanisme de FirstResponder/nextResponder)
-dans mon document, je déclare la imageView comme nextResponder du NSTextView.
Mais ça ne marche pas.
Autre idée : rendre l'imageView initialFirstResponder et déclarer le NSTextView comme nextResponder.
Mais ça ne marche pas non plus.
Auriez-vous d'autre idées, d'autre voies à suivre, d'autres méthodes à proposer ?
+
Chacha
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Ben non, moi je ne veux pas que l'image apparaisse dans le texte ! Je veux au contraire détourner l'endroit où elle sera copiée.
Entre temps, j'ai trouvé une solution:
-ajouter une méthode "paste:" à un objet AppController de mon MainMenu.nib (singleton qui centralise pas mal de trucs)
-connecter le "Coller" du menu edit au paste: de AppController plutôt qu'au first responder du MainMenu.nib
-dans le validateMenuItem de mon AppController, activer le "coller" quand il y a une image dans le NSGeneralPasteboard
-dans le paste: de AppController, faire un "sendAction:... to:nil from..." pour avoir le comportement par défaut
-surcharger le paste: de ma NSTextView pour que si le NSGeneralPasteboard contienne une image, cette view ne fasse rien mais le redirige vers son nextResponder. Si ce n'est pas une image, alors faire [super paste:]
Avec ça, ça marche.
+
Chacha
Bah, en fait, c'est a peu pres ce que je te proposais ::) :P
Ah, ouais, j'avais mal lu, en fait (hi hi). Sinon, si vous voulez des explications sur le pourquoi du comment de cette solution, je peux vous les donner. Mais j'ai trouvé ça un peu compliqué. Je suis toujours preneur d'un solution plus simple.
En gros :
-il fallait surcharger la gestion de l'activation/désactivation du menuitem Edit>paste. D'où sa prise en compte dans le "validateMenuItem:".
-Mais pour que le "validateMenuItem:" de AppController soit appelé sur le menuItem Edit>paste, il fallait que se dernier soit connecté à AppControlleur. D'où la déclaration d'un méthode paste: dedans.
-La suite me semblait logique : on singe le comportement par défaut avec le sendAction, et on intercepte le paste: à l'endroit qui nous intéresse (c'est à dire dans la NSTextview, puisque ce paste n'aurait pas dû, en théorie, arriver à cet endroit, et qu'on a employé tout ce pataquès pour l'avoir quand même).
-Ensuite, on redirige vers le nextResponder (qu'on aura pris soin de définir correctement, bien sûr) pour rediriger à nouveau.
+
Chacha