2011-03-31 2 views
1

J'ai un ensemble d'applications OSX pour une application Java qui n'utilise pas le Java-Stub, mais un Shellscript (enregistré via Info.plist). J'ai aussi enregistré mon extension de fichier dans le Info.plist:Association de fichiers sous OSX pour Java Application sans JavaStub

… 
<key>CFBundleDocumentTypes</key> 
<array> 
    <dict> 
     <key>CFBundleTypeName</key> 
     <string>My File Type Name</string> 
     <key>LSHandlerRank</key> 
     <string>Owner</string> 
     <key>CFBundleTypeExtensions</key> 
     <array> 
      <string>ext1</string> 
      <string>ext2</string> 
     </array> 
     <key>CFBundleTypeRole</key> 
     <string>Editor</string> 
     <key>CFBundleTypeMIMETypes</key> 
     <array> 
      <string>application/ext1</string> 
      <string>application/ext2</string> 
     </array> 
    </dict> 
</array> 
… 

C'est ce qui était nécessaire pour que le LaunchService reconnaisse mes fichiers et l'association à mon programme.

Pour autant que je comprends la documentation d'Apple Devel j'ai besoin maintenant d'enregistrer le fichier ouvert Handler en Java pour avoir les fichiers ouverts en les faisant glisser sur l'App-icône comme si (comme de Java 6 update 3):

 Application.getApplication().setOpenFileHandler(new OpenFilesHandler() { 

      @Override 
      public void openFiles(OpenFilesEvent arg0) { 
       Debug.debug("Opening a bunch of files on osx."); 
       for(File file : arg0.getFiles()) { 
        Debug.debug("Opening: " + file.getAbsolutePath()); 
        // Custom open action 
        FileActions.openFile(file); 
       } 
      } 
     }); 

Mon premier problème est: Ce gestionnaire n'est jamais touché - il n'y a pas de message de débogage et les fichiers ne s'ouvrent pas.

Le deuxième problème peut être lié: je peux double-cliquer sur le fichier associé et l'application s'ouvrira si elle n'est pas en cours d'exécution. Depuis que j'utilise un script shell personnalisé pour démarrer l'application, j'ai pensé que je devrais ajouter une sorte de paramètre ou plus. Tout d'abord voici mon script de démarrage:

#!/bin/bash 
BASEDIR=$(dirname "$0") 
cd "$BASEDIR/../Resources/Java/" 
java -Xdock:icon="../ico.icns" -Xmx256m -jar "core/myjar.jar" 

Pour des fins d'essai I ajouté « $ 1 » à ma liste d'arguments - $ 1 est le PSN du système ... Comment puis-je connecter l'événement d'ouverture de fichier sur le PSN - ou est-il une autre façon de le faire (en utilisant le script shell personnalisé).

Répondre

0

Vous ne pouvez pas utiliser un script shell pour ceci, AFAIK. Les fichiers ouverts sont envoyés en utilisant AppleEvents, et bash n'a aucun moyen de les recevoir.

+0

Cela ne résout cependant pas/explique le problème de glisser un fichier sur l'icône du fichier. – gamma

+0

Lorsque le Finder veut dire à une application d'ouvrir certains fichiers, que ce soit en faisant glisser, en double-cliquant, peu importe, il envoie à l'application un AppleEvent (une forme d'IPC). L'application dans votre cas est le script shell, mais il ne sait pas comment recevoir AppleEvents, donc ils restent assis là sans être manipulés. Vous avez besoin d'un exécutable qui sait comment les recevoir et les transmettre à votre programme Java pour le traitement, peut-être une sorte de "Java stub". – LaC

+0

Ok, j'ai réussi à implémenter le JavaApplicationStub à la place du script shell - je vais devoir faire d'autres changements jusqu'à ce que ça marche, mais la direction générale semble être bonne. – gamma

Questions connexes