[svn-upgrade] Integrating new upstream version, jabref (2.5)
[debian/jabref.git] / src / help / Plugin.html
1 <html xmlns="http://www.w3.org/1999/xhtml">\r
2 \r
3 <body text="#275856">\r
4     <basefont size="4" color="#2F4958" face="arial" />\r
5 \r
6     <h1>JabRef Plugin System</h1>\r
7 \r
8     <p>Starting with version 2.4, JabRef can be extended using a plugin system which was \r
9     built using Java Plugin Framework (JPF).</p>\r
10 \r
11     <p>To use a plugin, it needs to be put in one of the directories where JabRef looks for plugins.\r
12     One such directory is the one called <code>plugins</code> below the directory where the JabRef\r
13     jar file is located. Another is the user plugin directory, <code>~/.jabref/plugins</code> under\r
14     Linux or OS X and <code>.jabref/plugins</code> under your user home directory under Windows.</p>\r
15 \r
16     <p>The simplest way of installing plugins is through the <i>Plugin manager</i>, accessed from\r
17     the <i>Plugins</i> menu. The plugin manager lists all plugins installed in your user plugin\r
18     directory, and allows you to both delete installed plugins and install new ones.\r
19     </p>\r
20     \r
21     <h2>How to write a plugin</h2>\r
22     \r
23     <p>JabRef offers the following extension-points for developers:</p>\r
24     <ul>\r
25       <li><code>ImportFormat</code> - Add importers to JabRef accessible from the 'Import into ... database'.</li> \r
26       <li><code>EntryFetcher</code> - Add access to databases like Citeseer or Medline to the <i>Web Search</i> menu.</li>\r
27       <li><code>ExportFormatTemplate</code> - Add a template based export like the ones accessible using the <i>Manage Custom Exports</i>.</li>\r
28       <li><code>ExportFormat</code> - Add an export filter to JabRef's export dialog, that is more complicated than the simple template based one.</li>\r
29       <li><code>ExportFormatProvider</code> - A more powerful way to add export formats to JabRef.</li> \r
30       <li><code>LayoutFormatter</code> - Add formatters that can be used in the layout based exporters.</li>\r
31       <li><code>SidePanePlugin</code> - Add a side pane component that can do any kinds of operations. The panel is\r
32         accessed from a <b>Plugins</b> menu in JabRef's main window.</li>\r
33     </ul>\r
34     \r
35     <p>These extension-points are defined in the <code>plugin.xml</code> of the JabRef-core-plugin,\r
36     which can be found in <code>JabRef/src/plugins/net.sf.jabref.core/</code>.</p>\r
37     \r
38     <p>To start developing follow these rough steps:</p>\r
39     <ol>\r
40       <li>Checkout the JabRef trunk from subversion (<code>https://jabref.svn.sourceforge.net/svnroot/jabref/trunk</code>).\r
41     This contains both JabRef itself and plug-ins contributed so far to JabRef (you don't need the htdocs folder), which make great starting points for your own plugins.</li>\r
42       <li>Compile JabRef using <code>ant jars</code>.</li>\r
43       <li>Create your own project and define your extension in your own plugin.xml that satisfy the extension points of the core plugin.xml. \r
44       In particular make sure that:\r
45       <ul>\r
46         <li>...your plugin.xml has a <code>requires</code>-section that imports the core plugin (<code>net.sf.jabref.core</code>).</li>\r
47         <li>...your plugin.xml has a <code>runtime</code>-section, where you tell JPF, where in your project you have stored your class files and resources.</li>\r
48       </ul>\r
49       </li>\r
50       <li>Create a jar of your project and put it into the <code>plugins</code>-folder of JabRef.</li>\r
51       <li>Your plugin should be loaded when you run JabRef from the jar.</li>\r
52     </ol>\r
53 \r
54         <p>Feel free to ask us questions related to the plugin system on the mailing-list!</p>     \r
55 \r
56     <h2>How to add an extension point to JabRef</h2>\r
57     \r
58     <p>This documentation is intended for JabRef developers who want to add further extensions points.</p>\r
59     \r
60     <p>To add a new extension-point, you need to declare this extension-point in the plugin.xml of the core plugin similar to this:</p>\r
61     \r
62 <code><pre>    \r
63 &lt;extension-point id=&quot;PushToApplication&quot;&gt;\r
64         &lt;parameter-def type=&quot;string&quot; id=&quot;pushToApp&quot;\r
65                 custom-data=&quot;&lt;classname of the interface that plugin providers need to implement&gt;&quot; /&gt;\r
66         &lt;!-- optionally other parameters (we currently do not use any of these for anything)\r
67                 &lt;parameter-def type=&quot;string&quot; id=&quot;name&quot; /&gt;\r
68                 &lt;parameter-def type=&quot;string&quot; id=&quot;description&quot;\r
69                         multiplicity=&quot;none-or-one&quot; /&gt;\r
70                         --&gt;\r
71 &lt;/extension-point&gt;\r
72 </pre></code>\r
73 \r
74         <p>Then you need to re-run the plugin code generator "<code>ant generate</code>", which will re-create the helper class in \r
75         "<code>net.sf.jabref.plugin.core.generated</code>" so that it includes a method <code>getPushToApplicationExtensions()</code> which \r
76         returns a list of all PushToTalk extensions registered with the system.</p>\r
77  \r
78     <p>This list then can be used like this (here an example what we do with the entry fetcher extensions):</p>\r
79 \r
80 <code><pre> \r
81 /*\r
82  * Load fetchers that are plug-in extensions\r
83  */\r
84 JabRefPlugin jabrefPlugin = JabRefPlugin.getInstance(PluginCore.getManager());\r
85 if (jabrefPlugin != null){\r
86         for (EntryFetcherExtension ext : jabrefPlugin.getEntryFetcherExtensions()){\r
87                 EntryFetcher fetcher = ext.getEntryFetcher();\r
88                 if (fetcher != null){\r
89                         fetchers.add(fetcher);\r
90                 }\r
91         }\r
92 }\r
93  \r
94 // and later...\r
95  \r
96 for (EntryFetcher fetcher : fetchers){\r
97   GeneralFetcher generalFetcher = new GeneralFetcher(sidePaneManager, this, fetcher);\r
98   web.add(generalFetcher.getAction());\r
99   fetcherActions.add(generalFetcher.getAction());\r
100 }\r
101 </pre></code>\r
102 \r
103 </body>\r
104 </html>\r