connaitre la fenêtre qui est en premier plan

wiskywisky Membre
07:28 modifié dans API AppKit #1
Hello à  tous,

Dans un programme Document Based, j'aimerais savoir quel est la fenêtre qui ce trouve au premier plan.
L'application comporte des fenêtres venant de plug-in.
Ce que je cherche à  faire c'est de changer la vue ce trouvant dans une palette d'outils selon la fenêtre et selon le plug-in.
Donc je cherche à  savoir quel est la fenêtre active (ou qui vient d'être activé) puis à  quel plug-in elle appartient et à  partir de là  je charge les outils correspondant.

J'ai donc essayer ça :
[tt]//notification pour savoir quel est la fenêtre au premier plan
- (void)windowDidBecomeMain:(NSNotification *)aNotification
{
NSLog(@windowDidBecomeMain::%@",aNotification);
}

- (void)windowDidBecomeKey:(NSNotification *)aNotification
{
NSLog(@windowDidBecomeKey::%@",aNotification);
}[/tt]
Malheureusement ça ne marche pas. J'ai bien une liaison delegate entre File's owner et le contrôleur qui à  le code ci-dessus.
Je suis perdu  :why?:

Réponses

  • BruBru Membre
    07:28 modifié #2
    dans 1144602358:

    Dans un programme Document Based, j'aimerais savoir quel est la fenêtre qui ce trouve au premier plan.


    C'est dans NSApplication que tu trouveras ton bonheur :
    NSWindow *fenetreActive;<br />fenetreActive=[NSApp mainWindow];
    



    dans 1144602358:

    ...puis à  quel plug-in elle appartient et à  partir de là  je charge les outils correspondant.


    Pour savoir à  quel plug-in la fenêtre appartient, il faudrait en savoir un peu plus...
    Une fenêtre, c'est une fenêtre, quelque soit l'origine du code (classe, application ou plug-in) qui l'a créé.

    .
  • maconnectmaconnect Membre
    07:28 modifié #3
    j'aurais plutôt utilisé:
    [NSApp keyWindow]
    non ? Au moins on est sûr que c'est la fenêtre qui reçois les événements (donc celle est premier plan)
  • 07:28 modifié #4
    Pas forcément. Si tu as un document ouvert et un inspecteur et que le controle actif est un champ dans l'inspecteur, la mainWindow est le document, la keyWindow est l'inspecteur.
  • maconnectmaconnect Membre
    07:28 modifié #5
    ok. Mais s'il y a une sheet, la keywindow (=fenêtre en 1er plan) c'est la sheet, et la mainWindow c'est le document ? (donc pas la fenêtre en 1er plan?)
    Je testerai ça...
  • 07:28 modifié #6
    Pour les sheets, je ne le jurerais pas. Dans le cas des inspecteurs, on utilise souvent des NSPanel qui ont des attributs particuliers. Dans le cas d'un sheet, on peut utiliser n'importe quel type de fenetre, donc je ne sais pas et je n'ai pas trop le temps de chercher pour le moment.
  • wiskywisky Membre
    07:28 modifié #7
    En fait mon problème est de pouvoir charger dans une palette une vue d'outils selon la fenêtre sélectionné. Les fenêtres sont générer par les plug-in chargé. La vue des outils est envoyé par une foncion de class du plug-in générateur de la fenêtre (getViewTool est défini dans le protocole).
    Dans mon module pricipal j'ai 2 array: un qui contient la liste des plug-in charger et l'autre contient les instances des plug-in utilisés.
    J'aimerai savoir quel est l'intance d'une fenêtre pour demander au bon plug-in la vue des outils.

    Merci pour le code, mais j'aimerai recevoir une notification quand il y a une changement de niveau des fenêtres ;)
  • BruBru Membre
    07:28 modifié #8
    dans 1144907924:

    Merci pour le code, mais j'aimerai recevoir une notification quand il y a une changement de niveau des fenêtres ;)


    Installe ça dans le code d'initialisation de ton contrôleur :
    <br />[[NSNotificationCenter defaultCenter] addObserver:self<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  selector:@selector(windowDidBecomeMainNotification:)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  name:NSWindowDidBecomeMainNotification<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  object:nil];<br />
    

    Ceci installe un observer sur la notification de passage d'une fenêtre en main.
    Dès qu'une fenêtre devient main, la méthode windowDidBecomeMainNotification: sera appellée.


    Ensuite, toujours dans ce contrôleur :
    <br />- (void)windowDidBecomeMainNotification:(NSNotification *)notification<br />{<br />&nbsp; &nbsp; NSString *theMainWindowTitle;<br /><br />&nbsp; &nbsp; theMainWindowTitle=[[NSApp mainWindow] title];<br /><br />&nbsp; &nbsp; if ([theMainWindowTitle isEqual:@&quot;fenetre 1&quot;])<br />&nbsp; &nbsp; {<br />&nbsp; &nbsp; &nbsp; &nbsp; // j&#39;affiche la palette pour la fenêtre 1<br />&nbsp; &nbsp; }<br /><br />&nbsp; &nbsp; if ([theMainWindowTitle isEqual:@&quot;fenetre 2&quot;])<br />&nbsp; &nbsp; {<br />&nbsp; &nbsp; &nbsp; &nbsp; // j&#39;affiche la palette pour la fenêtre 2<br />&nbsp; &nbsp; }<br /><br />&nbsp; &nbsp; // etc...<br />}<br />
    

    Il suffit de récupérer la fenêtre qui vient de devenir main pour ensuite faire le traitement adéquat.
    Dans l'exemple, j'utilise le titre de la fenêtre au premier plan pour déterminer quelle palette je dois afficher.
    A toi d'utiliser une autre méthode de différenciation des fenêtres.

    .
  • wiskywisky Membre
    07:28 modifié #9
    Merci  <3 o:) o:) o:) o:)
Connectez-vous ou Inscrivez-vous pour répondre.