/* * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * * * * * * * * * * * * * * * * * * * * */ package javax.swing.plaf.nimbus; import java.util.HashMap; import java.util.Map; import javax.swing.JComponent; import javax.swing.plaf.synth.SynthConstants; /** *
Represents a built in, or custom, state in Nimbus.
* *Synth provides several built in states, which are: *
However, there are many more states that could be described in a LookAndFeel, and it * would be nice to style components differently based on these different states. * For example, a progress bar could be "indeterminate". It would be very convenient * to allow this to be defined as a "state".
* *This class, State, is intended to be used for such situations. * Simply implement the abstract #isInState method. It returns true if the given * JComponent is "in this state", false otherwise. This method will be called * many times in performance sensitive loops. It must execute * very quickly.
* *For example, the following might be an implementation of a custom * "Indeterminate" state for JProgressBars:
* *
* public final class IndeterminateState extends State<JProgressBar> {
* public IndeterminateState() {
* super("Indeterminate");
* }
*
* @Override
* protected boolean isInState(JProgressBar c) {
* return c.isIndeterminate();
* }
* }
*
*/
public abstract class StateCreate a new custom State. Specify the name for the state. The name should * be unique within the states set for any one particular component. * The name of the state should coincide with the name used in UIDefaults.
* *For example, the following would be correct:
*
* defaults.put("Button.States", "Enabled, Foo, Disabled");
* defaults.put("Button.Foo", new FooState("Foo"));
*
*
* @param name a simple user friendly name for the state, such as "Indeterminate"
* or "EmbeddedPanel" or "Blurred". It is customary to use camel case,
* with the first letter capitalized.
*/
protected State(String name) {
this.name = name;
}
@Override public String toString() { return name; }
/**
* This is the main entry point, called by NimbusStyle.
* *There are both custom states and standard states. Standard states * correlate to the states defined in SynthConstants. When a UI delegate * constructs a SynthContext, it specifies the state that the component is * in according to the states defined in SynthConstants. Our NimbusStyle * will then take this state, and query each State instance in the style * asking whether isInState(c, s).
* *Now, only the standard states care about the "s" param. So we have * this odd arrangement:
*Gets whether the specified JComponent is in the custom state represented * by this class. This is an extremely performance sensitive loop. * Please take proper precautions to ensure that it executes quickly.
* *Nimbus uses this method to help determine what state a JComponent is
* in. For example, a custom State could exist for JProgressBar such that
* it would return true
when the progress bar is indeterminate.
* Such an implementation of this method would simply be:
return c.isIndeterminate();
*
* @param c the JComponent to test. This will never be null.
* @return true if c
is in the custom state represented by
* this State
instance
*/
protected abstract boolean isInState(T c);
String getName() { return name; }
static boolean isStandardStateName(String name) {
return standardStates.containsKey(name);
}
static StandardState getStandardState(String name) {
return standardStates.get(name);
}
static final class StandardState extends State