/* * Copyright (c) 2005, 2006, 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. */ 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