The NetBeans look and feel customization library

This library installs custom values into UIDefaults, such as colors, borders and UI class names, which various components in NetBeans use to provide a customized or native appearance.

NetBeans provides a number of custom components, such as the tabbed containers in its main window; other components may look for custom colors - for example, the property sheet will look for a custom color in UIDefaults to use for its margin and the background color of property set entries, in order that it may be customized to match the UI specification for different platforms/look and feels.

This library centralizes the installation and setup of such custom values. It also:

- Handles the setup of custom font sizes for look and feels (other than GTK, which gets its font sizes from the operating system theme), by replacing the font entries in UIDefaults with those of the requested font size
- Allows UIDefaults values to be guaranteed to be present for look and feels (GTK) which do not provide them, to enable older code that depends on such values being there (as they were for all look and feels until JDK 1.4) to work without modification
- Handles loading of a theme file for those look and feels (Metal) that support MetalTheme
- Installs per-look-and-feel customizations needed to ensure a harmonious, native appearance on a given look and feel
- Contains custom implementations of things like ToolbarUI for some platforms on which NetBeans does not use the standard JDK implementation (GTK and Aqua).

#### Usage

An application using NetBeans tab control, window system, property sheet or some other component of NetBeans, which wants to guarantee that the same colors and styles are used in their application as in NetBeans, needs simply to call `org.netbeans.swing.plaf.Startup.run()` early in its startup sequence, as `org.netbeans.core.Main` does.

A look and feel or application author who wishes to provide custom values for some thing can provide an implementation of `org.netbeans.swing.plaf.LFCustoms`, and place it in UIManager under a key which contains the unique ID of the look and feel. See the documentation for LFCustoms for further details of how to do this.

Another option is simply to provide values for the (quite self-explanatory) keys defined as static fields of the LFCustoms class. The advantage to providing an implementation of LFCustoms is simply that those values would not be loaded unless requested; either approach is equivalent.

Also, if a look and feel is designed to be an improvement on an existing platform-specific look and feel (such as JGoodies for Windows or QuaQua for Apple), it may simply provide the appropriate existing LFCustoms subclass name in UIDefaults, in accordance with the following:

Look and feel | UIManager key | Class name
--- | --- | ---
Metal look and feel | Nb.MetalLFCustoms | org.netbeans.swing.plaf.metal.MetalLFCustoms
Windows classic look and feel | Nb.WindowsLFCustoms | org.netbeans.swing.plaf.winclassic.WindowsLFCustoms
Windows XP look and feel | Nb.WindowsXPLFCustoms | org.netbeans.swing.plaf.winxp.XPLFCustoms
Aqua look and feel (Mac) | Nb.AquaLFCustoms | org.netbeans.swing.plaf.aqua.AquaLFCustoms
GTK Look and Feel (Linux & Solaris) - JDK 1.5 and up | Nb.GTKLFCustoms | org.netbeans.swing.plaf.gtk.GtkLFCustoms

For details on the specific requirements and design of this library, see its arch questions and answers.