Satimage Précédent
do menu
Accueil Documentation Smile Les objets de Smile La programmation des objets Rédaction d'un script objet do menu  
Lorsque l'utilisateur choisit un article de menu, soit dans la barre des menus, soit dans le menu contextuel, soit dans un menu situé dans la propre barre d'outils de la fenêtre, (ou encore si l'utilisateur clique un bouton dans la barre d'outils de la fenêtre), Smile envoie un événement do menu au script de la fenêtre active.
  • Pour gérer l'événement do menu, installez dans le script de l'objet une procédure telle que ci-dessous :
    on do menu the_cmd to the_object
        if the_cmd is command_1 then
            -- gestion de la commande command_1
        else if the_cmd is command_2 then
            -- gestion de la commande command_1
        [...]
        else
            continue do menu the_cmd to the_object
        end if
    end do menu

    the_cmd contient la commande, à savoir une chaîne de caractères. the_object contient une référence à l'objet auquel la commande s'adresse, à savoir le propriétaire du script. Attention : le paramètre to est obligatoire.
  • Quand on installe une procédure do menu dans le script d'un objet, la procédure doit propager l'événement au moyen de l'instruction continue pour les commandes qu'elle ne gère pas, sans quoi l'objet perd son comportement par défaut. Par exemple, en l'absence d'une ligne continue le menu Enregistrer ne fonctionnera plus.
  • Les erreurs AppleScript survenant dans une procédure do menu sont "silencieuses" : elles ne sont pas propagées, et elles ne donnent pas lieu à un message d'erreur. Si vous souhaitez être averti d'une erreur survenant dans une procédure do menu vous devez installer un gestionnaire d'erreur try [...] end try comme dans l'exemple ci-dessous.
    on do menu the_cmd to the_object
        continue do menu the_cmd to the_object
        if the_cmd is some_command then
            try
                -- gestion de la commande some_command
            on error err_msg
                FatalAlert(err_msg)
            end try
        end if
    end do menu
    Notez que ce script utilise FatalAlert, une procédure que Smile installe par défaut au lancement, utile pour afficher un message d'erreur.
Gestion des commandes menu d'origine
Lorsque l'utilisateur choisit un article de menu de la barre des menus, le nom de la commande est une chaîne de quatre caractères. En principe c'est le script de classe ("Class script") de l'objet qui gère ce type de commande. Vous pouvez néanmoins intercepter la commande et afficher son code en installant provisoirement la procédure suivante dans le script de l'objet :
on do menu the_cmd to the_object
    dd("Réception de la commande : " & the_cmd)
    continue do menu the_cmd to the_object
end do menu
Le script de l'objet peut donc recouvrir le comportement par défaut. Par exemple, il peut être nécessaire de procéder à une opération spécifique au moment où l'utilisateur ferme la fenêtre, ou bien au moment où il l'enregistre.
on do menu the_cmd to the_object
    continue do menu the_cmd to the_object
    if the_cmd is "save" then upload_data(the_object)
end do menu
Dans tous les cas vous devez propager l'événement au moyen de l'instruction continue pour invoquer le comportement par défaut.
Gestion du menu contextuel
Lorsque l'utilisateur sélectionne un article dans le menu contextuel, la commande est la chaîne de caractères affichée par l'article en question.
Pour installer un menu contextuel dans une fenêtre, vous devez installer une procédure CustomMenuItems dans son script, et cette procédure doit renvoyer une liste de chaînes de caractères : la liste des articles du menu.
on CustomMenuItems(the_object)
    return {"Copier l'adresse", "Copier l'adresse électronique", "Copier le numéro de téléphone", "Copier le nom"}
end CustomMenuItems
Votre procédure CustomMenuItems peut utiliser le menu contextuel par défaut, dont elle obtient la liste des articles au moyen de l'instruction continue CustomMenuItems(the_object).

Voici un exemple de procédure de gestion d'un menu contextuel.
on do menu the_cmd to the_object
    if the_cmd is "Copier l'adresse" then
        set clipboard to curr_address(the_object)
    else if the_cmd is "Copier l'adresse électronique" then
        set clipboard to curr_email(the_object)
    [...]
    else
        continue do menu the_cmd to the_object
    end if
end do menu
Le menu contextuel fonctionne dans tous les types de fenêtres, mais dans les dialogues le menu contextuel n'est actif que lorsque le dialogue est en mode édition (il est donc à l'usage du dévelopeur, pas de l'utilisateur).
English version
Copyright ©2008 Paris, Satimage