NSTextField et "Drag & Drop"

tabliertablier Membre
février 2012 modifié dans API AppKit #1
J'ai un textField que je veux pouvoir éditer, mais je ne veux pas que ce textfield accepte le "drag & drop".

Dans IB, je rends bien le textField editable mais cela autorise le "drag & drop".

L'héritage de NSTextField est NSControl : NSView : NSResponder : NSObject

L'interface utilisateur d'un NSTextField est gérée par un NSTextFieldCell dont l'héritage est NSActionCell : NSCell : NSObject.

La seule méthode que je trouve pour invalider le " drag & drop" est (dans NSView):

- (void)unregisterDraggedTypes

Mais, ça n'invalide rien du tout. Si le textField est editable, il accepte d'office le "drag & drop".



Quelle est la bonne solution pour qu'un textField soit editable et refuse le "drag & drop" ?
Mots clés:

Réponses

  • tabliertablier Membre
    février 2012 modifié #2
    Je vais répondre à  ma question:

    Je n'ai trouvé que deux solutions sur le web, uniquement pour des TextView.

    En sous-classant NSTextView:
    @implementation monTextView



    - (NSDragOperation)draggingEntered:(id)sender {



    //hide so that the drop event falls through into superview's drag/drop view

    color=#FF0000]self[/color] setHidden:[color=#FF0000]YES[/color;

    return NSDragOperationNone;

    }



    - (void)draggingExited:(id)sender

    {

    //show our field editor again since dragging is all over with

    color=#FF0000]self[/color] setHidden:[color=#FF0000]NO[/color;

    }

    @end
    à  l'expérience, ça marche si on ne change pas la taille du TextView.

    Si on change sa taille, le textView accepte les "drag&drop" (incompréhensible!).

    L'autre solution consiste à  ajouter une catégorie:
    @implementation NSTextView (csstest)



    - (NSDraggingSession*)beginDraggingSessionWithItems:(NSArray*)items event:(NSEvent*)event source:(id)source

    {

    return nil;

    }

    @end
    cette deuxième solution est (parait-il) à  éviter
  • AliGatorAliGator Membre, Modérateur
    Pourquoi la catégorie ? Je veux dire tu peux pas surcharger la méthode dans une sous-classe plutôt que l'ajouter par catégorie ?

    En plus j'ai pas regardé mais si cette méthode existe dans l'API, c'est en effet une très mauvaise idée d'utiliser une catégorie, ne jamais surcharger une méthode existante par catégorie on n'a aucune garantie de l'ordre de chargement des diverses images binaires (frameworks, librairies, etc) et donc qui va supplanter l'autre.
  • Tu peux essayer aussi



    de mettre un NSTrackingArea dans 'initialisation de ton contrôle,



    puis de mettre les fonctions suivantes:


    <br />
    -(void)mouseEntered:(NSEvent *)theEvent<br />
    {<br />
      [self setEnabled:YES];<br />
    }<br />
    <br />
    <br />
    <br />
    -(void)keyDown:(NSEvent *)theEvent<br />
    {<br />
      [self setEnabled:YES];<br />
    }<br />
    -(void)mouseExited:(NSEvent *)theEvent<br />
    {<br />
      [self setEnabled:NO];<br />
    <br />
    }<br />
    <br />
    
  • @Aligator

    J'ai trouvé la deuxième méthode sur le réseau. Je ne l'ai pas essayé vu les commentaires qui ont suivis et qui sont les mêmes que les tiens.



    @devulder

    Je n'ai pas tout compris de la philosophie de ce que tu décris:

    Le NSTrackingArea est à  mettre sur la partie ou le drag&drop doit être invalidé ?

    Suivant ce que tu indiques, je vais obtenir un event quand la souris rentrera sur la zone et je n'en aurai pas lorsque la souris en sortira.

    Donc, je ne comprends pas comment cela va interdire le drag&drop sur le NSTexField.
  • 'tablier' a écrit:


    @Aligator

    J'ai trouvé la deuxième méthode sur le réseau. Je ne l'ai pas essayé vu les commentaires qui ont suivis et qui sont les mêmes que les tiens.



    @devulder

    Je n'ai pas tout compris de la philosophie de ce que tu décris:

    Le NSTrackingArea est à  mettre sur la partie ou le drag&drop doit être invalidé ?

    Suivant ce que tu indiques, je vais obtenir un event quand la souris rentrera sur la zone et je n'en aurai pas lorsque la souris en sortira.

    Donc, je ne comprends pas comment cela va interdire le drag&drop sur le NSTexField.




    Etape 1



    Tu met le NSTrackingArea pour toute la surface de ton contrôle,



    Etape 2



    Tu désactives ton contrôle.



    Maintenant quand la souris rentrera dans la zone le drag & drop sera invalidé vu que le contrôle est désactivé !



    J'ai tester ça marche nickel
  • Ah, oui! je n'avais pas vu ça comme ça. Ok, je vais essayer.
  • Dans la NSDraggingSource : draggingSourceOperationMaskForLocal:

    avec NSDragOperationNone qui n'autorise aucune opération.
Connectez-vous ou Inscrivez-vous pour répondre.