/*
 * Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

/**
 * Provides user interface objects built according to the cross-platform Nimbus
 * look and feel.
 * <p>
 * Nimbus uses instances of the {@link javax.swing.Painter} interface to paint
 * components. With each Swing component it associates a foreground and a
 * background {@code Painter}, and there may be several painters for different
 * component states.
 * <p>
 * Nimbus allows customizing many of its properties, including painters, by
 * altering the {@link javax.swing.UIDefaults} table. Here's an example:
 * <pre>
 * UIManager.put("ProgressBar.tileWidth", myTileWidth);
 * UIManager.put("ProgressBar[Enabled].backgroundPainter", myBgPainter);
 * UIManager.put("ProgressBar[Enabled].foregroundPainter", myFgPainter);
 * </pre>
 * <p>
 * Per-component customization is also possible. When rendering a component,
 * Nimbus checks its client property named "Nimbus.Overrides". The value of this
 * property should be an instance of {@code UIDefaults}. Settings from that
 * table override the UIManager settings, but for that particular component
 * instance only. An optional client property,
 * "Nimbus.Overrides.InheritDefaults" of type Boolean, specifies whether the
 * overriding settings should be merged with default ones ({@code true}), or
 * replace them ({@code false}). By default they are merged:
 * <pre>
 * JProgressBar bar = new JProgressBar();
 * UIDefaults overrides = new UIDefaults();
 * overrides.put("ProgressBar.cycleTime", 330);
 * ...
 * bar.putClientProperty("Nimbus.Overrides", overrides);
 * bar.putClientProperty("Nimbus.Overrides.InheritDefaults", false);
 * </pre>
 * <p>
 * Colors in Nimbus are derived from a core set of
 * <a href="doc-files/properties.html#primaryColors">primary colors</a>. There
 * are also
 * <a href="doc-files/properties.html#secondaryColors">secondary colors</a>,
 * which are derived from primary ones, but serve themselves as base colors for
 * other derived colors. The derivation mechanism allows for runtime
 * customization, i.e. if a primary or secondary color is changed, all colors
 * that are derived from it are automatically updated. The method
 * {@link javax.swing.plaf.nimbus.NimbusLookAndFeel#getDerivedColor(java.lang.String, float, float, float, int, boolean)}
 * may be used to create a derived color.
 * <p>
 * These classes are designed to be used while the corresponding
 * {@code LookAndFeel} class has been installed
 * (<code>UIManager.setLookAndFeel(new <i>XXX</i>LookAndFeel())</code>).
 * Using them while a different {@code LookAndFeel} is installed may produce
 * unexpected results, including exceptions. Additionally, changing the
 * {@code LookAndFeel} maintained by the {@code UIManager} without updating the
 * corresponding {@code ComponentUI} of any {@code JComponent}s may also produce
 * unexpected results, such as the wrong colors showing up, and is generally not
 * encouraged.
 * <p>
 * <strong>Note:</strong>
 * Most of the Swing API is <em>not</em> thread safe. For details, see
 * <a
 * href="http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html"
 * target="_top">Concurrency in Swing</a>,
 * a section in
 * <em><a href="http://docs.oracle.com/javase/tutorial/"
 * target="_top">The Java Tutorial</a></em>.
 *
 * @since 1.7
 * @serial exclude
 */
package javax.swing.plaf.nimbus;
