Gonzague

Tak suka wanita gemuk ! le blog de Gonzague.

Archive pour février 2011

J’avais promis la suite de lendemain, j’ai pris un peu de retard !

Intégrer une application Java à Mac OS X

2) Post-développement

2.1) Créer l’icône

Heureusement, Mac OS fournit quand même des outils plutôt pratique pour faire les choses assez rapidement et simplement. Pour créer une icône il y  a un logiciel qui se nomme “Icon Composer”. Les fichiers icône (.icns) sous OS X sont en fait plusieurs images de différentes tailles pour toutes les représentations possibles telles que dans le finder, dans le dock etc. Les icônes ont une taille maximum de 512*512 et on peut choisir des images différentes pour chaque palier de zoom : 256*256, 128*128, 32*32, 16*16. Un simple glisser déposer suffit.

tehhis integration java os x dossier blog wefrag

2.2) Créer l’application

Sous OS X les application sont sous un format de fichier .app qui est en fait un simple dossier contenant tout ce dont l’application à besoin pour fonctionner. Pour les applications java il y a une fois de plus un utilitaire fourni par Apple sous le nom de “Jar Bundler”. C’est également relativement simple.

tehhis integration java os x dossier blog wefrag

Ici on choisi l’icône ainsi que la Main Class qui, il suffit de choisir le .jar de notre application. notez également la possibilité d’utiliser la barre de menu Mac OS au cas où votre application ait un menu type “Fichier Edition … …”

tehhis integration java os x dossier blog wefrag

Ici on ajoute toutes les ressources supplémentaires nécessaires pour l’application, les librairies par exemple.

tehhis integration java os x dossier blog wefrag

Ici sont les informations diverses de l’application, quelques options de la VM Java.

On a plus qu’à cliquer sur “Create Application” et sauvegarder là où on veut et nous avons notre application .app fonctionnelle.

2.3) Créer un nouveau type de fichier (bundle)

Mon application pour fonctionner à besoin de plusieurs fichiers pour une sauvegarde. Donc je vais avoir besoin de créer ce qu’on appelle un bundle. Tout comme les fichiers .app des applications il s’agit simplement d’un dossier contenant x documents mais qui apparaîtra en tant qu’un seul et unique fichier au yeux de l’utilisateur.

Pour cela, il faut faire un clic droit sur l’application fraîchement créée et “Show Package Contents” et ouvrir le fichier info.plist

tehhis integration java os x dossier blog wefrag

Il suffit d’ajouter les lignes nécessaires pour obtenir quelque chose comme ceci.

tehhis integration java os x dossier blog wefrag

On peut également spécifier une icône particulière pour notre nouveau type de bundle. (tehhisFile ici) et le placer dans le dossier ressources qui se trouve dans notre application.

Et voilà on est bon, tous les dossiers qui auront un nom finissant par .tehhis (dans mon cas) apparaîtrons comme un seul et unique fichier.

tehhis integration java os x dossier blog wefrag

Et donc lorsque l’on lancera ce type de fichier, cela ouvrira notre application et lancera l’evenement handleOpenFile de notre Mac Handler (voir partie 1 du dossier) une fois celui-ci initialisé.

Nous avons donc une application qui apparaît et se comporte comme une application native, juste les fouineurs pourront s’en rendre compte en fouillant dans le bundle .app de notre application.

Intégrer une application Java à Mac OS X

Vendredi 18 février 2011

Ces jours-ci je bosse sur une application qui qui doit être développée rapidement (donc pas le temps d’apprendre cocoa/obj-c) et qui ne sera utilisée que sur Mac OS  pour la boite que je suis en train de monter d’ailleurs, je reparlerais de la boite plus tard, je pense que ça intéressera certains d’entre vous.

Histoire de me faire un peu plaisir pour satisfaire mon amour dévoué à Mac OS X je me suis dis que j’allais essayer de bien intégrer l’application à Mac OS. Le problème c’est qu’il faut chercher un peu partout sur le net et c’est pas tout le temps super clair. Donc je vais regrouper tout ça ici ou au moins ce que j’ai utilisé. Car mine de rien, il y a tout un tas de petites choses qui font qu’on aime une application Mac OS.

Je vais divisé cet article en deux parties, ce qu’on peut faire pendant le développement et ensuite ce qu’on peut faire une fois le développement fini.

1) Développement

Ok, alors les habitués de Mac OS auront sûrement remarqué que par exemple les raccourcis de base sont en général tous les même quelque soit les applications tel que cmd + , pour les préférences ou le fameux cmd + q.

Également le fait de pouvoir dropper un fichier sur l’icône du Dock ou encore les notifications Growl. Tout ça c’est possible avec Java !

1.1) Le MacHandler

Bon, j’appelle ça le MacHandler, c’est pas le nom officiel. Il s’agit  d’une classe avec laquelle on va utiliser tous les événements spécifiques à Mac OS , ce qui se passe lorsqu’un fichier est lâché sur le Dock (j’y reviendrais dans la seconde partie  du dossier car il y a d’autres petits trucs à faire), lorsque les préférences sont ouvertes, lorsqu’on clique sur l’icône du dock alors que l’application est déjà lancée etc…

Je me permets un vieux copié collé de ce que j’ai déjà fait car le nom des méthodes est relativement explicite:

public class MacHandler {

public MacHandler() {
// create an instance of the mac osx Application class
Application theApplication = new Application();

// create an instance of our DockBarAdapter class (see source code below)
DockBarAdapter dockBarAdapter = new DockBarAdapter(this);
theApplication.setEnabledPreferencesMenu(true);

// add our adapter as a listener on the application object
theApplication.addApplicationListener(dockBarAdapter);

}

// our "callback" method. this method is called by the DockBarAdapter
// when a "handleOpenFile" event is received.
public void handleOpenFileEvent(ApplicationEvent e) {

}

public void handleQuit(ApplicationEvent e) {
System.exit(0);
}

public void handleReOpenApplication(ApplicationEvent e) {

}

public void handlePreferences(ApplicationEvent e){

}
}

/**
* Extend the Mac OS X ApplicationAdapter class, and just implement the
* handleOpenFile() method so we can handle drag and drop events.
*/
class DockBarAdapter extends ApplicationAdapter {

private MacHandler handler;
// the main class passes a reference to itself to us when we are constructed

public DockBarAdapter(MacHandler handler) {
this.handler = handler;
}

// this is the method that is called when a drag and drop event is received
// by the Application, and passed to us. In turn, we call back to the main
// class to let it know this event was received so it can deal with the
// event.
@Override
public void handleOpenFile(ApplicationEvent e) {
handler.handleOpenFileEvent(e);
}

@Override
public void handleQuit(ApplicationEvent e) {
handler.handleQuit(e);
}

@Override
public void handleReOpenApplication(ApplicationEvent e) {
handler.handleReOpenApplication(e);
}

@Override
public void handlePreferences(ApplicationEvent e) {

handler.handlePreferences(e);
}
}

1.2) Growl

Tout utilisateur de Mac trouvera les notifications fort pratique et en général est content lorsqu’une application les utilise. Ici c’est du 100% fait maison avec une méthode un peu bourrine… Mais qui marche.

Le fonctionnement est relativement simple, on a un fichier AppleScript (.scpt) inclus dans le .jar et une classe qui lors de sa construction extrairera ce script dans un dossier temporaire e l’éxecutera  au besoin

La classe ressemble à ça:

public class GrowlNotification extends Growl {

File file;

public GrowlNotification(){
//lorsque on initialise les notifications, on extrait un fichier applescript du .jar et on l'execute quand on en a besoin.
try {
URL script = getClass().getResource("/applescript/notification.scpt");
script.openStream();

//model.Model.tmpDir est un dossier de fichier temporaires lors de l'execution de mon appli à définir vous même
File f = new File(model.Model.tmpDir+"/notification.scpt");
f.createNewFile();
Tools.copyCompletely(script.openStream(), new FileOutputStream(f)); //ici est une methode pour extraire un fichier du package
file = f;
file.deleteOnExit(); //on supprime le fichier quand on ferme l'appli
} catch (IOException ex) {
Logger.getLogger(GrowlNotification.class.getName()).log(Level.SEVERE, null, ex);
}
}

public void showNotification(String message, String title) {
try {
String[] cmd = new String[4];

cmd[0] = “osascript”;
cmd[1] = file.getPath();
cmd[2] = title;
cmd[3] = message;

Process proc = Runtime.getRuntime().exec(cmd);
} catch (IOException ex) {
Logger.getLogger(GrowlNotification.class.getName()).log(Level.SEVERE, null, ex);
}
}
}

1.3) L’interface

Je trouve que c’est ce qui manque le plus à java sur Mac, c’est très (trop) basique, heureusement qu’il y a un petit génie qui a créé tout ce dont on a besoin ! Ce mec nous a donc pondue une librairie qui regroupe presque tout ce dont on peut avoir besoin !

C’est disponible ici : Mac Widgets for Java et ça permet de faire des choses dans ce genre:

mac widgets blog wefrag mac widgets blog wefrag mac widgets blog wefrag mac widgets blog wefrag mac widgets blog wefrag mac widgets blog wefrag mac widgets blog wefrag mac widgets blog wefrag

Mais ce petit gars ne s’est pas arrêté là sinon ça aurait été trop simple, en fouillant sur son blog super intéressant on tombe sur d’autres trucs pour pousser encore plus l’intégration tels que:

faire des barre de header à la iTunes , faire des listes au look Apple bref que du bon.

D’ailleurs pour la petite histoire ce mec à été engagé par Apple.

En parlant d’Apple ils fournissent quand même un peu d’aide à cette adresse (où il y a un exemple pour les applescripts beaucoup moins bourrin que moi)

1.4) Les system properties

il existe tout un tas de system properties qui permettent de créer des éléments d’interface qui permettent d’éviter quelques sueurs sur des trucs cons. Ca se trouve ici.

En bref, des boutons (plein), des champs de recherches, la décoration des fenêtres, des dropdown etc etc y en a pour tout le monde. C’est très facile à mettre en place et c’est du plus bel effet.

Bon, je comptais pas faire ce dossier en deux parties, mais là il est un peu tard et je me lève tôt demain donc tout ce qui se passe une fois qu’on a fini l’application arrive demain  presque sans fautes !

Intégrer une application Java à Mac OS X (suite)