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