# Le Système de greffons de JabRef

Depuis la version 2.4b1, JabRef peut être étendu en utilisant un système de greffons construit en utilisant le "Java Plugin Framework" (JPF).

Pour utiliser des greffons, mettez simplement le fichier jar du greffon dans le répertoire nommé `plugins` dans le répertoire où se trouve JabRef.jar. Au démarrage, JabRef affichera la liste de tous les greffons chargés.

## Comment écrire un greffon

JabRef offre aux développeurs les points d'extension suivants :

- `ImportFormat` - Ajoute à JabRef des importateurs accessibles depuis 'Importer dans ...'.
- `EntryFetcher` - Ajoute l'accès à des bases de données comme Citeseer ou Medline au menu Recherche internet.
- `ExportFormatTemplate` - Ajoute un modèle d'exportation comme ceux accessible par Gérer les exportations personnalisées.
- `ExportFormat` - Ajoute à la fenêtre d'exportation de JabRef un filtre d'exportation (qui est plus sophistiqué que le simple modèle d'exportation).
- `ExportFormatProvider` - Une façon plus puissante d'ajouter des formats d'exportation à JabRef.
- `LayoutFormatter` - Ajoute des formateurs qui pourront être utilisés dans la mise en page des exportations.
- `SidePanePlugin` - Ajoute un composant "panneau latéral" qui peut effectuer tout type d'opérations. Le panneau est accessible à partir du menu Greffons dans la fenêtre principale de JabRef.

Ces points d'extension sont définis dans `plugin.xml` du JabRef-core-plugin, qui peut être trouvé dans `JabRef/src/plugins/net.sf.jabref.core/`.

Pour commencer un développement, suivez ces principales étapes :

1. Extrayer le tronc de JabRef en utilisant SubVersion (`https://jabref.svn.sourceforge.net/svnroot/jabref/trunk`). Il contient JabRef lui-même ainsi que les greffons ajoutés jusqu'à présent à JabRef (vous n'avez pas besoin du répertoire htdocs) et qui peuvent vous servir de point de départ pour vos propres greffons.
2. Compiler JabRef en utilisant `ant jars`.
3. Créer votre propre projet et définissez votre entension dans votre propre plugin.xml qui doit satisfaire les points d'extension du "core" plugin.xml. En particulier, assurez-vous que :
   - ...votre plugin.xml a une section `requires` qui importe le "core plugin" (`net.sf.jabref.core`).
   - ...votre plugin.xml a la section `runtime`, où vous dites à JPF où vous avez stocké vos fichiers de classe et ressources dans votre projet.
4. Créer un jar de votre projet et mettez-le dans le répertoire `plugins` de JabRef.
5. Votre greffon devrait être chargé quand vous démarrez JabRef à partir du jar.

Ne vous génez pas pour nous poser des questions liées au système de greffons sur la liste de diffusion !

## Comment ajouter un point d'extension à JabRef

Ce document est destiné aux développeurs de JabRef qui veulent ajouter des points d'extension supplémentaires.

Pour ajouter un nouveau point d'extension, vous devez déclarer ce point d'extension dans le plugin.xml du "core plugin" de façon similaire à ceci :

    <extension-point id="PushToApplication">
    	<parameter-def type="string" id="pushToApp"
    		custom-data="<classname of the interface that plugin providers need to implement>" />
    	<!-- optionally other parameters (we currently do not use any of these for anything)
    		<parameter-def type="string" id="name" />
    		<parameter-def type="string" id="description"
    			multiplicity="none-or-one" />
    			-->
    </extension-point>

Ensuite, vous devez relancer le générateur de code de greffon "`ant generate`", qui recréera la classe "helper" dans "`net.sf.jabref.plugin.core.generated`" afin qu'il inclut une méthode `getPushToApplicationExtensions()` qui renvoie une liste de toutes les extensions PushToTalk référencées dans votre système.

Cette liste peut ensuite être utilisée comme ceci (un exemple de ce que nous faisons avec les extensiosn "entry fetcher") :

    /*
     * Load fetchers that are plug-in extensions
     */
    JabRefPlugin jabrefPlugin = JabRefPlugin.getInstance(PluginCore.getManager());
    if (jabrefPlugin != null){
    	for (EntryFetcherExtension ext : jabrefPlugin.getEntryFetcherExtensions()){
    		EntryFetcher fetcher = ext.getEntryFetcher();
    		if (fetcher != null){
    			fetchers.add(fetcher);
    		}
    	}
    }

    // and later...

    for (EntryFetcher fetcher : fetchers){
      GeneralFetcher generalFetcher = new GeneralFetcher(sidePaneManager, this, fetcher);
      web.add(generalFetcher.getAction());
      fetcherActions.add(generalFetcher.getAction());
    }