Plugin development

From Freeplane - free mind mapping and knowledge management software
Revision as of 03:54, 24 November 2010 by Irajawapys (talk | contribs)

Create a new Plugin

A simple tool helps to get started with the development of plugins. It's an Ant Task named 'create-plugin' that is available from the <tt>freeplane_framework/ant</tt> directory.

Interactive

The task reads all required parameters from the command line by default. The following transcript shows input and output of a create-plugin invocation (Windows/Cygwin): <pre> /devel/freeplane-bazaar-repo/1_0_x/freeplane_framework/ant $ ant create-plugin Buildfile: build.xml

create-plugin: [create-plugin] => Please enter required plugin name: helloworld [create-plugin] => Optional: Does this plugin contribute to the GUI? (yes, no) yes [create-plugin] New plugin created in C:\devel\freeplane-bazaar-repo\1_0_x\freeplane_plugin_helloworld [create-plugin] What next? [create-plugin] * import plugin into Eclipse via Import... -> Existing Projects into Workspace [create-plugin] * add required external jars to C:\devel\freeplane-bazaar-repo\1_0_x\freeplane_plugin_helloworld\lib [create-plugin] * add required external jars and required Freeplane projects to classpath [create-plugin] * search for "TODO" in the project and fill the gaps [create-plugin] * add the following element to freeplane_framework/ant/build.xml: [create-plugin] <antcall target="makePlugin" inheritall="false"> [create-plugin] <param name="anttarget" value="dist"/> [create-plugin] <param name="targetdir" value="plugins"/> [create-plugin] <param name="plugindir" value="freeplane_plugin_helloworld"/> [create-plugin] <param name="pluginname" value="org.freeplane.plugin.helloworld"/> [create-plugin] </antcall> </pre>

Follow the suggestions in the printed message.


Non-interactive

If you want to do it non-interactively instead you have to create your own (temporary) Ant task in <tt>freeplane_framework/ant/build.xml</tt> like this: <pre>

 <target name="create-plugin-batch">
   <create-plugin baseDir="." pluginname="helloworld" hasAction="true" />
 </target>

</pre>


Tasks in Plugin development

Add options to the OptionPanel

The core plugins register their options via the configuration file <tt>freeplane/resources/xml/preferences.xml</tt>. Plugins can do it quite similar by defining their own <tt>preferences.xml</tt> (by convention in <tt>freeplane_plugin_<plugin>/org/freeplane/plugin/<plugin>/preferences.xml</tt>); here from the script plugin: <pre> <?xml version="1.0" encoding="UTF-8"?> <preferences_structure>

  <tabbed_pane>
     <tab name="plugins">
        <separator name="scripting">
           <boolean name="execute_scripts_without_asking" />
           <boolean name="execute_scripts_without_file_restriction" />
           <boolean name="execute_scripts_without_network_restriction" />
           <boolean name="execute_scripts_without_exec_restriction" />
           <boolean name="signed_script_are_trusted" />
           <string name="script_user_key_name_for_signing" />
           <string name="script_directories" />
        </separator>
     </tab>
  </tabbed_pane>

</preferences_structure> </pre>

The option names have to be added to <tt>Resource_en.properties</tt> (excerpt): <pre> OptionPanel.execute_scripts_without_asking = Scripts should be carried out without confirmation? OptionPanel.execute_scripts_without_asking.tooltip = <html>Freeplane scripts are principally able... OptionPanel.execute_scripts_without_exec_restriction = Permit to Execute other Applications (NOT recommended) </pre>

For an example of how options can be registered at the option panel see <tt>org.freeplane.plugin.script.ScriptingRegistration</tt>: <groovy> private void addPropertiesToOptionPanel() {

   final URL preferences = this.getClass().getResource("preferences.xml");
   if (preferences == null)
       throw new RuntimeException("cannot open preferences");
   modeController.getOptionPanelBuilder().load(preferences);

} </groovy>

The options can be queried like this: <groovy> String executeWithoutAsking = ResourceController.getResourceController()

   .getProperty("execute_scripts_without_asking");

</groovy>