# Substance look and feel - plugins

Starting from version 2.1, Substance provides support for third-party components (for example NetBeans tabs) using plugin architecture.

### Creating a plugin

Substance plugin is a jar file that contains at least the following two files:

- META-INF/substance-plugin.xml
- Class that implements org.jvnet.substance.plugin.SubstancePlugin interface

The structure of META-INF/substance-plugin.xml descriptor is:

      <substance-plugin>
        <plugin-class>Class name</plugin-class>
      </substance-plugin>

The class name is a fully qualified name of a non-abstract class with a default zero-argument constructor that implements the org.jvnet.lafplugin.LafPlugin interface.
The LafPlugin interface specifies the following four functions which must be implemented by the plugin:

- public Map getUiDelegates(); - returns a map of all custom UI delegates. The key is UI class ID (as searched by the component itself), the value is the fully qualified name of the UI delegate.
- public Map getFonts(); - returns a map of all custom font settings. The key is symbolic reference (as searched in the UI delegate), the value is the Font object.
- public Object[] getDefaults(Object themeObject); - returns an array of UI default settings that match the specified information on the current theme. The entries in the array should be pairwise, the symbolic key (String) and the value (object as searched in the UI delegate).
- public void initialize(); - initializes the plugin.
- public void reset(); - should reset all theme-dependant caches in the UI delegates.

Note that the plugin jar doesn't have to contain the UI delegates that are specified in its getUiDelegates function, as long as they are somewhere in the classpath.

### Built-in plugin

Substance comes bundled with a built-in plugin for a color chooser (from Quaqua look and feel). The corresponding files are:

- META-INF/substance-plugin.xml.
- org.jvnet.substance.plugin.BasePlugin that is pointed to from the plugin descriptor file.

See the implementation of the BasePlugin class for the reference.

### Using third-party plugins

In order to use a third-party plugin, just put it in the classpath (along with the substance.jar) and it will be picked up automatically.