2009-03-20 5 views
2

Je développe une application Cocoa/Objective C qui lit le document actif depuis n'importe quelle application utilisant AppScript. J'ai réussi cette partie, mais ce serait vraiment bien de pouvoir dire avec certitude si l'application est basée sur un document ou non.Comment puis-je détecter si une application est basée sur un document?

L'approche évidente est de regarder l'attribut AXDocument de la fenêtre active dans l'application et si elle contient un chemin, nous savons que l'application est basée sur un document. Cependant, cela ne fonctionne pas si le document n'est pas enregistré. C'est aussi assez maladroit. Plutôt ennuyeux, l'attribut AXDocument peut apparaître dans une application non-document, donc sa présence ou son absence ne peut pas être utilisée pour fournir l'information que je cherche.

J'ai essayé d'examiner les autres propriétés et attributs exposés par AppleScript à la fois d'un processus d'application et d'une seule fenêtre. Aucun de ces éléments ne semble indiquer avec certitude si l'application est basée sur un document ou non.

J'ai également essayé de parcourir quelques fichiers Info.plist, mais je ne vois rien de fiable. Est-ce que je ne regarde pas assez dur? Ou y a-t-il un bon moyen de le faire en Objective C ou AppleScript?

Répondre

2

Une application basée sur un document construite conformément au guide Document-Based Application Architecture doit remplir plusieurs conditions. Je ne sais pas si/comment il est possible d'accéder à différentes applications sous Mac OS, mais avec la réflexion (en Objective-C) vous pouvez tester la présence d'une sous-classe NSDocument. Une autre idée serait de regarder simplement les entrées de menu ... y a-t-il des entrées de menu Fichier -> Nouveau, Fichier -> Ouvrir?

+0

Merci pour la réponse. Désolé, j'ai été si tard dans l'évaluation de votre réponse - je pensais que je serais averti par courriel lorsque les réponses ont été postées, mais cela ne s'est pas produit. Je pense que la vérification des entrées de menu est la meilleure idée jusqu'à présent. Merci pour votre réponse. –

1

Vous pouvez rechercher la clé CFBundleDocumentTypes dans Info.plist d'un ensemble d'applications. Ceci est généralement présent pour les applications basées sur des documents, de sorte que le type de document peut être associé à la fois à l'extension et à la classe qui la charge.

+0

Malheureusement, certaines des applications que je classe comme non-document sont des applications de document dans la définition de pommes. Par exemple, je classe iCal comme étant non-document - vous ne pouvez pas avoir de documents iCal. Mais Apple le voit comme étant capable d'ouvrir des fichiers .ics. Donc je ne peux pas utiliser cette technique, mais merci pour la suggestion. –

+0

Dans ce cas, l'entrée NSDocumentClass pour l'extension est probablement vide - elle est dans l'affaire iCals. –

1

Une autre idée serait de chercher un AXImage représentant l'icône du proxy dans la barre de titre; les documents sans titre pourraient simplement être appariés en vérifiant le titre de la fenêtre pour "sans titre" ou son équivalent localisé.

(Certaines applications font inclure une icône proxy, même pour les documents sans titre, mais beaucoup ne le font pas.)

+0

Ah. Idée très intéressante. Merci. –

Questions connexes