jdk/src/java.desktop/share/classes/javax/swing/plaf/nimbus/NimbusStyle.java
author darcy
Fri, 03 Apr 2015 10:41:34 -0700
changeset 29894 3e16b51732f5
parent 25859 3317bb8137f4
child 37569 bf2bc4d9491d
permissions -rw-r--r--
8076520: Fix missing doclint warnings in javax.swing.{table, tree, undo, plaf.{metal, nimbus, synth}} Reviewed-by: alexsch
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
     1
/*
29894
3e16b51732f5 8076520: Fix missing doclint warnings in javax.swing.{table, tree, undo, plaf.{metal, nimbus, synth}}
darcy
parents: 25859
diff changeset
     2
 * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
     4
 *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 5453
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 5453
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    10
 *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    15
 * accompanied this code).
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    16
 *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    20
 *
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 5453
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 5453
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 5453
diff changeset
    23
 * questions.
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    24
 */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    25
package javax.swing.plaf.nimbus;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    26
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    27
import javax.swing.Painter;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    28
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    29
import javax.swing.JComponent;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    30
import javax.swing.UIDefaults;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    31
import javax.swing.UIManager;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    32
import javax.swing.plaf.ColorUIResource;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    33
import javax.swing.plaf.synth.ColorType;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    34
import static javax.swing.plaf.synth.SynthConstants.*;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    35
import javax.swing.plaf.synth.SynthContext;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    36
import javax.swing.plaf.synth.SynthPainter;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    37
import javax.swing.plaf.synth.SynthStyle;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    38
import java.awt.Color;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    39
import java.awt.Font;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    40
import java.awt.Insets;
5453
3d39f942ca6e 6919629: Nimbus L&F Nimbus.Overrides option leaks significant amounts of memory
peterz
parents: 3741
diff changeset
    41
import java.lang.ref.WeakReference;
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    42
import java.util.ArrayList;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    43
import java.util.Collections;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    44
import java.util.Comparator;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    45
import java.util.HashMap;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    46
import java.util.List;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    47
import java.util.Map;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    48
import java.util.TreeMap;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    49
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    50
/**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    51
 * <p>A SynthStyle implementation used by Nimbus. Each Region that has been
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    52
 * registered with the NimbusLookAndFeel will have an associated NimbusStyle.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    53
 * Third party components that are registered with the NimbusLookAndFeel will
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    54
 * therefore be handed a NimbusStyle from the look and feel from the
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    55
 * #getStyle(JComponent, Region) method.</p>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    56
 *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    57
 * <p>This class properly reads and retrieves values placed in the UIDefaults
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    58
 * according to the standard Nimbus naming conventions. It will create and
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    59
 * retrieve painters, fonts, colors, and other data stored there.</p>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    60
 *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    61
 * <p>NimbusStyle also supports the ability to override settings on a per
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    62
 * component basis. NimbusStyle checks the component's client property map for
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    63
 * "Nimbus.Overrides". If the value associated with this key is an instance of
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    64
 * UIDefaults, then the values in that defaults table will override the standard
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    65
 * Nimbus defaults in UIManager, but for that component instance only.</p>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    66
 *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    67
 * <p>Optionally, you may specify the client property
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    68
 * "Nimbus.Overrides.InheritDefaults". If true, this client property indicates
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    69
 * that the defaults located in UIManager should first be read, and then
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    70
 * replaced with defaults located in the component client properties. If false,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    71
 * then only the defaults located in the component client property map will
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    72
 * be used. If not specified, it is assumed to be true.</p>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    73
 *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    74
 * <p>You must specify "Nimbus.Overrides" for "Nimbus.Overrides.InheritDefaults"
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    75
 * to have any effect. "Nimbus.Overrides" indicates whether there are any
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    76
 * overrides, while "Nimbus.Overrides.InheritDefaults" indicates whether those
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    77
 * overrides should first be initialized with the defaults from UIManager.</p>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    78
 *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    79
 * <p>The NimbusStyle is reloaded whenever a property change event is fired
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    80
 * for a component for "Nimbus.Overrides" or "Nimbus.Overrides.InheritDefaults".
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    81
 * So for example, setting a new UIDefaults on a component would cause the
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    82
 * style to be reloaded.</p>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    83
 *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    84
 * <p>The values are only read out of UIManager once, and then cached. If
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    85
 * you need to read the values again (for example, if the UI is being reloaded),
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    86
 * then discard this NimbusStyle and read a new one from NimbusLookAndFeel
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    87
 * using NimbusLookAndFeel.getStyle.</p>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    88
 *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    89
 * <p>The primary API of interest in this class for 3rd party component authors
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    90
 * are the three methods which retrieve painters: #getBackgroundPainter,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    91
 * #getForegroundPainter, and #getBorderPainter.</p>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    92
 *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    93
 * <p>NimbusStyle allows you to specify custom states, or modify the order of
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    94
 * states. Synth (and thus Nimbus) has the concept of a "state". For example,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    95
 * a JButton might be in the "MOUSE_OVER" state, or the "ENABLED" state, or the
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    96
 * "DISABLED" state. These are all "standard" states which are defined in synth,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    97
 * and which apply to all synth Regions.</p>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    98
 *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    99
 * <p>Sometimes, however, you need to have a custom state. For example, you
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   100
 * want JButton to render differently if it's parent is a JToolbar. In Nimbus,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   101
 * you specify these custom states by including a special key in UIDefaults.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   102
 * The following UIDefaults entries define three states for this button:</p>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   103
 *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   104
 * <pre><code>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   105
 *     JButton.States = Enabled, Disabled, Toolbar
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   106
 *     JButton[Enabled].backgroundPainter = somePainter
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   107
 *     JButton[Disabled].background = BLUE
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   108
 *     JButton[Toolbar].backgroundPainter = someOtherPaint
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   109
 * </code></pre>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   110
 *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   111
 * <p>As you can see, the <code>JButton.States</code> entry lists the states
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   112
 * that the JButton style will support. You then specify the settings for
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   113
 * each state. If you do not specify the <code>JButton.States</code> entry,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   114
 * then the standard Synth states will be assumed. If you specify the entry
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   115
 * but the list of states is empty or null, then the standard synth states
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   116
 * will be assumed.</p>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   117
 *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   118
 * @author Richard Bair
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   119
 * @author Jasper Potts
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   120
 */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   121
public final class NimbusStyle extends SynthStyle {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   122
    /* Keys and scales for large/small/mini components, based on Apples sizes */
29894
3e16b51732f5 8076520: Fix missing doclint warnings in javax.swing.{table, tree, undo, plaf.{metal, nimbus, synth}}
darcy
parents: 25859
diff changeset
   123
    /** Large key */
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   124
    public static final String LARGE_KEY = "large";
29894
3e16b51732f5 8076520: Fix missing doclint warnings in javax.swing.{table, tree, undo, plaf.{metal, nimbus, synth}}
darcy
parents: 25859
diff changeset
   125
    /** Small key */
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   126
    public static final String SMALL_KEY = "small";
29894
3e16b51732f5 8076520: Fix missing doclint warnings in javax.swing.{table, tree, undo, plaf.{metal, nimbus, synth}}
darcy
parents: 25859
diff changeset
   127
    /** Mini key */
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   128
    public static final String MINI_KEY = "mini";
29894
3e16b51732f5 8076520: Fix missing doclint warnings in javax.swing.{table, tree, undo, plaf.{metal, nimbus, synth}}
darcy
parents: 25859
diff changeset
   129
    /** Large scale */
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   130
    public static final double LARGE_SCALE = 1.15;
29894
3e16b51732f5 8076520: Fix missing doclint warnings in javax.swing.{table, tree, undo, plaf.{metal, nimbus, synth}}
darcy
parents: 25859
diff changeset
   131
    /** Small scale */
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   132
    public static final double SMALL_SCALE = 0.857;
29894
3e16b51732f5 8076520: Fix missing doclint warnings in javax.swing.{table, tree, undo, plaf.{metal, nimbus, synth}}
darcy
parents: 25859
diff changeset
   133
    /** Mini scale */
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   134
    public static final double MINI_SCALE = 0.714;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   135
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   136
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   137
     * Special constant used for performance reasons during the get() method.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   138
     * If get() runs through all of the search locations and determines that
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   139
     * there is no value, then NULL will be placed into the values map. This way
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   140
     * on subsequent lookups it will simply extract NULL, see it, and return
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   141
     * null rather than continuing the lookup procedure.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   142
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   143
    private static final Object NULL = '\0';
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   144
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   145
     * <p>The Color to return from getColorForState if it would otherwise have
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   146
     * returned null.</p>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   147
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   148
     * <p>Returning null from getColorForState is a very bad thing, as it causes
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   149
     * the AWT peer for the component to install a SystemColor, which is not a
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   150
     * UIResource. As a result, if <code>null</code> is returned from
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   151
     * getColorForState, then thereafter the color is not updated for other
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   152
     * states or on LAF changes or updates. This DEFAULT_COLOR is used to
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   153
     * ensure that a ColorUIResource is always returned from
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   154
     * getColorForState.</p>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   155
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   156
    private static final Color DEFAULT_COLOR = new ColorUIResource(Color.BLACK);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   157
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   158
     * Simple Comparator for ordering the RuntimeStates according to their
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   159
     * rank.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   160
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   161
    private static final Comparator<RuntimeState> STATE_COMPARATOR =
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   162
        new Comparator<RuntimeState>() {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   163
            @Override
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   164
            public int compare(RuntimeState a, RuntimeState b) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   165
                return a.state - b.state;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   166
            }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   167
        };
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   168
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   169
     * The prefix for the component or region that this NimbusStyle
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   170
     * represents. This prefix is used to lookup state in the UIManager.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   171
     * It should be something like Button or Slider.Thumb or "MyButton" or
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   172
     * ComboBox."ComboBox.arrowButton" or "MyComboBox"."ComboBox.arrowButton"
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   173
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   174
    private String prefix;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   175
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   176
     * The SynthPainter that will be returned from this NimbusStyle. The
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   177
     * SynthPainter returned will be a SynthPainterImpl, which will in turn
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   178
     * delegate back to this NimbusStyle for the proper Painter (not
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   179
     * SynthPainter) to use for painting the foreground, background, or border.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   180
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   181
    private SynthPainter painter;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   182
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   183
     * Data structure containing all of the defaults, insets, states, and other
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   184
     * values associated with this style. This instance refers to default
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   185
     * values, and are used when no overrides are discovered in the client
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   186
     * properties of a component. These values are lazily created on first
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   187
     * access.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   188
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   189
    private Values values;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   190
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   191
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   192
     * A temporary CacheKey used to perform lookups. This pattern avoids
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   193
     * creating useless garbage keys, or concatenating strings, etc.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   194
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   195
    private CacheKey tmpKey = new CacheKey("", 0);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   196
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   197
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   198
     * Some NimbusStyles are created for a specific component only. In Nimbus,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   199
     * this happens whenever the component has as a client property a
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   200
     * UIDefaults which overrides (or supplements) those defaults found in
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   201
     * UIManager.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   202
     */
5453
3d39f942ca6e 6919629: Nimbus L&F Nimbus.Overrides option leaks significant amounts of memory
peterz
parents: 3741
diff changeset
   203
    private WeakReference<JComponent> component;
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   204
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   205
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   206
     * Create a new NimbusStyle. Only the prefix must be supplied. At the
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   207
     * appropriate time, installDefaults will be called. At that point, all of
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   208
     * the state information will be pulled from UIManager and stored locally
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   209
     * within this style.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   210
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   211
     * @param prefix Something like Button or Slider.Thumb or
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   212
     *        org.jdesktop.swingx.JXStatusBar or ComboBox."ComboBox.arrowButton"
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   213
     * @param c an optional reference to a component that this NimbusStyle
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   214
     *        should be associated with. This is only used when the component
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   215
     *        has Nimbus overrides registered in its client properties and
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   216
     *        should be null otherwise.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   217
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   218
    NimbusStyle(String prefix, JComponent c) {
5453
3d39f942ca6e 6919629: Nimbus L&F Nimbus.Overrides option leaks significant amounts of memory
peterz
parents: 3741
diff changeset
   219
        if (c != null) {
3d39f942ca6e 6919629: Nimbus L&F Nimbus.Overrides option leaks significant amounts of memory
peterz
parents: 3741
diff changeset
   220
            this.component = new WeakReference<JComponent>(c);
3d39f942ca6e 6919629: Nimbus L&F Nimbus.Overrides option leaks significant amounts of memory
peterz
parents: 3741
diff changeset
   221
        }
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   222
        this.prefix = prefix;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   223
        this.painter = new SynthPainterImpl(this);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   224
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   225
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   226
    /**
20169
d7fa6d7586c9 8025085: [javadoc] some errors in javax/swing
yan
parents: 7668
diff changeset
   227
     * {@inheritDoc}
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   228
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   229
     * Overridden to cause this style to populate itself with data from
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   230
     * UIDefaults, if necessary.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   231
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   232
    @Override public void installDefaults(SynthContext ctx) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   233
        validate();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   234
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   235
        //delegate to the superclass to install defaults such as background,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   236
        //foreground, font, and opaque onto the swing component.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   237
        super.installDefaults(ctx);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   238
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   239
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   240
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   241
     * Pulls data out of UIDefaults, if it has not done so already, and sets
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   242
     * up the internal state.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   243
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   244
    private void validate() {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   245
        // a non-null values object is the flag we use to determine whether
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   246
        // to reparse from UIManager.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   247
        if (values != null) return;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   248
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   249
        // reconstruct this NimbusStyle based on the entries in the UIManager
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   250
        // and possibly based on any overrides within the component's
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   251
        // client properties (assuming such a component exists and contains
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   252
        // any Nimbus.Overrides)
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   253
        values = new Values();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   254
3741
4021567cd4ca 6802944: Nimbus initialization is too slow
peterz
parents: 2658
diff changeset
   255
        Map<String, Object> defaults =
4021567cd4ca 6802944: Nimbus initialization is too slow
peterz
parents: 2658
diff changeset
   256
                ((NimbusLookAndFeel) UIManager.getLookAndFeel()).
4021567cd4ca 6802944: Nimbus initialization is too slow
peterz
parents: 2658
diff changeset
   257
                        getDefaultsForPrefix(prefix);
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   258
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   259
        // inspect the client properties for the key "Nimbus.Overrides". If the
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   260
        // value is an instance of UIDefaults, then these defaults are used
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   261
        // in place of, or in addition to, the defaults in UIManager.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   262
        if (component != null) {
5453
3d39f942ca6e 6919629: Nimbus L&F Nimbus.Overrides option leaks significant amounts of memory
peterz
parents: 3741
diff changeset
   263
            // We know component.get() is non-null here, as if the component
3d39f942ca6e 6919629: Nimbus L&F Nimbus.Overrides option leaks significant amounts of memory
peterz
parents: 3741
diff changeset
   264
            // were GC'ed, we wouldn't be processing its style.
3d39f942ca6e 6919629: Nimbus L&F Nimbus.Overrides option leaks significant amounts of memory
peterz
parents: 3741
diff changeset
   265
            Object o = component.get().getClientProperty("Nimbus.Overrides");
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   266
            if (o instanceof UIDefaults) {
5453
3d39f942ca6e 6919629: Nimbus L&F Nimbus.Overrides option leaks significant amounts of memory
peterz
parents: 3741
diff changeset
   267
                Object i = component.get().getClientProperty(
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   268
                        "Nimbus.Overrides.InheritDefaults");
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   269
                boolean inherit = i instanceof Boolean ? (Boolean)i : true;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   270
                UIDefaults d = (UIDefaults)o;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   271
                TreeMap<String, Object> map = new TreeMap<String, Object>();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   272
                for (Object obj : d.keySet()) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   273
                    if (obj instanceof String) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   274
                        String key = (String)obj;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   275
                        if (key.startsWith(prefix)) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   276
                            map.put(key, d.get(key));
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   277
                        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   278
                    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   279
                }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   280
                if (inherit) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   281
                    defaults.putAll(map);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   282
                } else {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   283
                    defaults = map;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   284
                }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   285
            }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   286
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   287
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   288
        //a list of the different types of states used by this style. This
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   289
        //list may contain only "standard" states (those defined by Synth),
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   290
        //or it may contain custom states, or it may contain only "standard"
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   291
        //states but list them in a non-standard order.
25565
ce603b34c98d 8043548: Fix raw and unchecked lint warnings in javax.swing.plaf.*
darcy
parents: 25122
diff changeset
   292
        List<State<?>> states = new ArrayList<>();
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   293
        //a map of state name to code
25565
ce603b34c98d 8043548: Fix raw and unchecked lint warnings in javax.swing.plaf.*
darcy
parents: 25122
diff changeset
   294
        Map<String,Integer> stateCodes = new HashMap<>();
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   295
        //This is a list of runtime "state" context objects. These contain
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   296
        //the values associated with each state.
25565
ce603b34c98d 8043548: Fix raw and unchecked lint warnings in javax.swing.plaf.*
darcy
parents: 25122
diff changeset
   297
        List<RuntimeState> runtimeStates = new ArrayList<>();
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   298
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   299
        //determine whether there are any custom states, or custom state
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   300
        //order. If so, then read all those custom states and define the
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   301
        //"values" stateTypes to be a non-null array.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   302
        //Otherwise, let the "values" stateTypes be null to indicate that
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   303
        //there are no custom states or custom state ordering
3741
4021567cd4ca 6802944: Nimbus initialization is too slow
peterz
parents: 2658
diff changeset
   304
        String statesString = (String)defaults.get(prefix + ".States");
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   305
        if (statesString != null) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   306
            String s[] = statesString.split(",");
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   307
            for (int i=0; i<s.length; i++) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   308
                s[i] = s[i].trim();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   309
                if (!State.isStandardStateName(s[i])) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   310
                    //this is a non-standard state name, so look for the
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   311
                    //custom state associated with it
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   312
                    String stateName = prefix + "." + s[i];
25565
ce603b34c98d 8043548: Fix raw and unchecked lint warnings in javax.swing.plaf.*
darcy
parents: 25122
diff changeset
   313
                    State<?> customState = (State)defaults.get(stateName);
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   314
                    if (customState != null) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   315
                        states.add(customState);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   316
                    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   317
                } else {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   318
                    states.add(State.getStandardState(s[i]));
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   319
                }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   320
            }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   321
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   322
            //if there were any states defined, then set the stateTypes array
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   323
            //to be non-null. Otherwise, leave it null (meaning, use the
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   324
            //standard synth states).
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   325
            if (states.size() > 0) {
25565
ce603b34c98d 8043548: Fix raw and unchecked lint warnings in javax.swing.plaf.*
darcy
parents: 25122
diff changeset
   326
                values.stateTypes = states.toArray(new State<?>[states.size()]);
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   327
            }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   328
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   329
            //assign codes for each of the state types
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   330
            int code = 1;
25565
ce603b34c98d 8043548: Fix raw and unchecked lint warnings in javax.swing.plaf.*
darcy
parents: 25122
diff changeset
   331
            for (State<?> state : states) {
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   332
                stateCodes.put(state.getName(), code);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   333
                code <<= 1;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   334
            }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   335
        } else {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   336
            //since there were no custom states defined, setup the list of
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   337
            //standard synth states. Note that the "v.stateTypes" is not
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   338
            //being set here, indicating that at runtime the state selection
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   339
            //routines should use standard synth states instead of custom
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   340
            //states. I do need to popuplate this temp list now though, so that
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   341
            //the remainder of this method will function as expected.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   342
            states.add(State.Enabled);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   343
            states.add(State.MouseOver);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   344
            states.add(State.Pressed);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   345
            states.add(State.Disabled);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   346
            states.add(State.Focused);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   347
            states.add(State.Selected);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   348
            states.add(State.Default);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   349
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   350
            //assign codes for the states
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   351
            stateCodes.put("Enabled", ENABLED);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   352
            stateCodes.put("MouseOver", MOUSE_OVER);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   353
            stateCodes.put("Pressed", PRESSED);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   354
            stateCodes.put("Disabled", DISABLED);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   355
            stateCodes.put("Focused", FOCUSED);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   356
            stateCodes.put("Selected", SELECTED);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   357
            stateCodes.put("Default", DEFAULT);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   358
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   359
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   360
        //Now iterate over all the keys in the defaults table
3741
4021567cd4ca 6802944: Nimbus initialization is too slow
peterz
parents: 2658
diff changeset
   361
        for (String key : defaults.keySet()) {
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   362
            //The key is something like JButton.Enabled.backgroundPainter,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   363
            //or JButton.States, or JButton.background.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   364
            //Remove the "JButton." portion of the key
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   365
            String temp = key.substring(prefix.length());
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   366
            //if there is a " or : then we skip it because it is a subregion
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   367
            //of some kind
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   368
            if (temp.indexOf('"') != -1 || temp.indexOf(':') != -1) continue;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   369
            //remove the separator
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   370
            temp = temp.substring(1);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   371
            //At this point, temp may be any of the following:
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   372
            //background
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   373
            //[Enabled].background
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   374
            //[Enabled+MouseOver].background
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   375
            //property.foo
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   376
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   377
            //parse out the states and the property
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   378
            String stateString = null;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   379
            String property = null;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   380
            int bracketIndex = temp.indexOf(']');
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   381
            if (bracketIndex < 0) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   382
                //there is not a state string, so property = temp
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   383
                property = temp;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   384
            } else {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   385
                stateString = temp.substring(0, bracketIndex);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   386
                property = temp.substring(bracketIndex + 2);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   387
            }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   388
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   389
            //now that I have the state (if any) and the property, get the
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   390
            //value for this property and install it where it belongs
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   391
            if (stateString == null) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   392
                //there was no state, just a property. Check for the custom
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   393
                //"contentMargins" property (which is handled specially by
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   394
                //Synth/Nimbus). Also check for the property being "States",
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   395
                //in which case it is not a real property and should be ignored.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   396
                //otherwise, assume it is a property and install it on the
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   397
                //values object
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   398
                if ("contentMargins".equals(property)) {
3741
4021567cd4ca 6802944: Nimbus initialization is too slow
peterz
parents: 2658
diff changeset
   399
                    values.contentMargins = (Insets)defaults.get(key);
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   400
                } else if ("States".equals(property)) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   401
                    //ignore
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   402
                } else {
3741
4021567cd4ca 6802944: Nimbus initialization is too slow
peterz
parents: 2658
diff changeset
   403
                    values.defaults.put(property, defaults.get(key));
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   404
                }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   405
            } else {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   406
                //it is possible that the developer has a malformed UIDefaults
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   407
                //entry, such that something was specified in the place of
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   408
                //the State portion of the key but it wasn't a state. In this
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   409
                //case, skip will be set to true
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   410
                boolean skip = false;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   411
                //this variable keeps track of the int value associated with
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   412
                //the state. See SynthState for details.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   413
                int componentState = 0;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   414
                //Multiple states may be specified in the string, such as
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   415
                //Enabled+MouseOver
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   416
                String[] stateParts = stateString.split("\\+");
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   417
                //For each state, we need to find the State object associated
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   418
                //with it, or skip it if it cannot be found.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   419
                for (String s : stateParts) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   420
                    if (stateCodes.containsKey(s)) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   421
                        componentState |= stateCodes.get(s);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   422
                    } else {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   423
                        //Was not a state. Maybe it was a subregion or something
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   424
                        //skip it.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   425
                        skip = true;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   426
                        break;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   427
                    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   428
                }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   429
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   430
                if (skip) continue;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   431
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   432
                //find the RuntimeState for this State
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   433
                RuntimeState rs = null;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   434
                for (RuntimeState s : runtimeStates) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   435
                    if (s.state == componentState) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   436
                        rs = s;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   437
                        break;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   438
                    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   439
                }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   440
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   441
                //couldn't find the runtime state, so create a new one
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   442
                if (rs == null) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   443
                    rs = new RuntimeState(componentState, stateString);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   444
                    runtimeStates.add(rs);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   445
                }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   446
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   447
                //check for a couple special properties, such as for the
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   448
                //painters. If these are found, then set the specially on
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   449
                //the runtime state. Else, it is just a normal property,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   450
                //so put it in the UIDefaults associated with that runtime
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   451
                //state
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   452
                if ("backgroundPainter".equals(property)) {
3741
4021567cd4ca 6802944: Nimbus initialization is too slow
peterz
parents: 2658
diff changeset
   453
                    rs.backgroundPainter = getPainter(defaults, key);
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   454
                } else if ("foregroundPainter".equals(property)) {
3741
4021567cd4ca 6802944: Nimbus initialization is too slow
peterz
parents: 2658
diff changeset
   455
                    rs.foregroundPainter = getPainter(defaults, key);
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   456
                } else if ("borderPainter".equals(property)) {
3741
4021567cd4ca 6802944: Nimbus initialization is too slow
peterz
parents: 2658
diff changeset
   457
                    rs.borderPainter = getPainter(defaults, key);
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   458
                } else {
3741
4021567cd4ca 6802944: Nimbus initialization is too slow
peterz
parents: 2658
diff changeset
   459
                    rs.defaults.put(property, defaults.get(key));
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   460
                }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   461
            }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   462
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   463
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   464
        //now that I've collected all the runtime states, I'll sort them based
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   465
        //on their integer "state" (see SynthState for how this works).
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   466
        Collections.sort(runtimeStates, STATE_COMPARATOR);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   467
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   468
        //finally, set the array of runtime states on the values object
3741
4021567cd4ca 6802944: Nimbus initialization is too slow
peterz
parents: 2658
diff changeset
   469
        values.states = runtimeStates.toArray(new RuntimeState[runtimeStates.size()]);
4021567cd4ca 6802944: Nimbus initialization is too slow
peterz
parents: 2658
diff changeset
   470
    }
4021567cd4ca 6802944: Nimbus initialization is too slow
peterz
parents: 2658
diff changeset
   471
25565
ce603b34c98d 8043548: Fix raw and unchecked lint warnings in javax.swing.plaf.*
darcy
parents: 25122
diff changeset
   472
    private Painter<Object> getPainter(Map<String, Object> defaults, String key) {
3741
4021567cd4ca 6802944: Nimbus initialization is too slow
peterz
parents: 2658
diff changeset
   473
        Object p = defaults.get(key);
4021567cd4ca 6802944: Nimbus initialization is too slow
peterz
parents: 2658
diff changeset
   474
        if (p instanceof UIDefaults.LazyValue) {
4021567cd4ca 6802944: Nimbus initialization is too slow
peterz
parents: 2658
diff changeset
   475
            p = ((UIDefaults.LazyValue)p).createValue(UIManager.getDefaults());
4021567cd4ca 6802944: Nimbus initialization is too slow
peterz
parents: 2658
diff changeset
   476
        }
25565
ce603b34c98d 8043548: Fix raw and unchecked lint warnings in javax.swing.plaf.*
darcy
parents: 25122
diff changeset
   477
        @SuppressWarnings("unchecked")
ce603b34c98d 8043548: Fix raw and unchecked lint warnings in javax.swing.plaf.*
darcy
parents: 25122
diff changeset
   478
        Painter<Object> tmp = (p instanceof Painter ? (Painter)p : null);
ce603b34c98d 8043548: Fix raw and unchecked lint warnings in javax.swing.plaf.*
darcy
parents: 25122
diff changeset
   479
        return tmp;
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   480
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   481
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   482
    /**
20169
d7fa6d7586c9 8025085: [javadoc] some errors in javax/swing
yan
parents: 7668
diff changeset
   483
     * {@inheritDoc}
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   484
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   485
     * Overridden to cause this style to populate itself with data from
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   486
     * UIDefaults, if necessary.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   487
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   488
    @Override public Insets getInsets(SynthContext ctx, Insets in) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   489
        if (in == null) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   490
            in = new Insets(0, 0, 0, 0);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   491
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   492
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   493
        Values v = getValues(ctx);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   494
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   495
        if (v.contentMargins == null) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   496
            in.bottom = in.top = in.left = in.right = 0;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   497
            return in;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   498
        } else {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   499
            in.bottom = v.contentMargins.bottom;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   500
            in.top = v.contentMargins.top;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   501
            in.left = v.contentMargins.left;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   502
            in.right = v.contentMargins.right;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   503
            // Account for scale
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   504
            // The key "JComponent.sizeVariant" is used to match Apple's LAF
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   505
            String scaleKey = (String)ctx.getComponent().getClientProperty(
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   506
                    "JComponent.sizeVariant");
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   507
            if (scaleKey != null){
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   508
                if (LARGE_KEY.equals(scaleKey)){
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   509
                    in.bottom *= LARGE_SCALE;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   510
                    in.top *= LARGE_SCALE;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   511
                    in.left *= LARGE_SCALE;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   512
                    in.right *= LARGE_SCALE;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   513
                } else if (SMALL_KEY.equals(scaleKey)){
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   514
                    in.bottom *= SMALL_SCALE;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   515
                    in.top *= SMALL_SCALE;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   516
                    in.left *= SMALL_SCALE;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   517
                    in.right *= SMALL_SCALE;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   518
                } else if (MINI_KEY.equals(scaleKey)){
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   519
                    in.bottom *= MINI_SCALE;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   520
                    in.top *= MINI_SCALE;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   521
                    in.left *= MINI_SCALE;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   522
                    in.right *= MINI_SCALE;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   523
                }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   524
            }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   525
            return in;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   526
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   527
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   528
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   529
    /**
20169
d7fa6d7586c9 8025085: [javadoc] some errors in javax/swing
yan
parents: 7668
diff changeset
   530
     * {@inheritDoc}
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   531
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   532
     * <p>Overridden to cause this style to populate itself with data from
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   533
     * UIDefaults, if necessary.</p>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   534
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   535
     * <p>In addition, NimbusStyle handles ColorTypes slightly differently from
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   536
     * Synth.</p>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   537
     * <ul>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   538
     *  <li>ColorType.BACKGROUND will equate to the color stored in UIDefaults
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   539
     *      named "background".</li>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   540
     *  <li>ColorType.TEXT_BACKGROUND will equate to the color stored in
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   541
     *      UIDefaults named "textBackground".</li>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   542
     *  <li>ColorType.FOREGROUND will equate to the color stored in UIDefaults
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   543
     *      named "textForeground".</li>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   544
     *  <li>ColorType.TEXT_FOREGROUND will equate to the color stored in
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   545
     *      UIDefaults named "textForeground".</li>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   546
     * </ul>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   547
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   548
    @Override protected Color getColorForState(SynthContext ctx, ColorType type) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   549
        String key = null;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   550
        if (type == ColorType.BACKGROUND) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   551
            key = "background";
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   552
        } else if (type == ColorType.FOREGROUND) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   553
            //map FOREGROUND as TEXT_FOREGROUND
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   554
            key = "textForeground";
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   555
        } else if (type == ColorType.TEXT_BACKGROUND) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   556
            key = "textBackground";
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   557
        } else if (type == ColorType.TEXT_FOREGROUND) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   558
            key = "textForeground";
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   559
        } else if (type == ColorType.FOCUS) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   560
            key = "focus";
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   561
        } else if (type != null) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   562
            key = type.toString();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   563
        } else {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   564
            return DEFAULT_COLOR;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   565
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   566
        Color c = (Color) get(ctx, key);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   567
        //if all else fails, return a default color (which is a ColorUIResource)
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   568
        if (c == null) c = DEFAULT_COLOR;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   569
        return c;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   570
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   571
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   572
    /**
20169
d7fa6d7586c9 8025085: [javadoc] some errors in javax/swing
yan
parents: 7668
diff changeset
   573
     * {@inheritDoc}
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   574
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   575
     * Overridden to cause this style to populate itself with data from
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   576
     * UIDefaults, if necessary. If a value named "font" is not found in
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   577
     * UIDefaults, then the "defaultFont" font in UIDefaults will be returned
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   578
     * instead.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   579
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   580
    @Override protected Font getFontForState(SynthContext ctx) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   581
        Font f = (Font)get(ctx, "font");
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   582
        if (f == null) f = UIManager.getFont("defaultFont");
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   583
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   584
        // Account for scale
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   585
        // The key "JComponent.sizeVariant" is used to match Apple's LAF
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   586
        String scaleKey = (String)ctx.getComponent().getClientProperty(
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   587
                "JComponent.sizeVariant");
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   588
        if (scaleKey != null){
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   589
            if (LARGE_KEY.equals(scaleKey)){
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   590
                f = f.deriveFont(Math.round(f.getSize2D()*LARGE_SCALE));
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   591
            } else if (SMALL_KEY.equals(scaleKey)){
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   592
                f = f.deriveFont(Math.round(f.getSize2D()*SMALL_SCALE));
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   593
            } else if (MINI_KEY.equals(scaleKey)){
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   594
                f = f.deriveFont(Math.round(f.getSize2D()*MINI_SCALE));
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   595
            }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   596
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   597
        return f;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   598
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   599
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   600
    /**
20169
d7fa6d7586c9 8025085: [javadoc] some errors in javax/swing
yan
parents: 7668
diff changeset
   601
     * {@inheritDoc}
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   602
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   603
     * Returns the SynthPainter for this style, which ends up delegating to
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   604
     * the Painters installed in this style.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   605
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   606
    @Override public SynthPainter getPainter(SynthContext ctx) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   607
        return painter;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   608
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   609
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   610
    /**
20169
d7fa6d7586c9 8025085: [javadoc] some errors in javax/swing
yan
parents: 7668
diff changeset
   611
     * {@inheritDoc}
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   612
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   613
     * Overridden to cause this style to populate itself with data from
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   614
     * UIDefaults, if necessary. If opacity is not specified in UI defaults,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   615
     * then it defaults to being non-opaque.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   616
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   617
    @Override public boolean isOpaque(SynthContext ctx) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   618
        // Force Table CellRenderers to be opaque
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   619
        if ("Table.cellRenderer".equals(ctx.getComponent().getName())) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   620
            return true;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   621
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   622
        Boolean opaque = (Boolean)get(ctx, "opaque");
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   623
        return opaque == null ? false : opaque;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   624
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   625
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   626
    /**
20169
d7fa6d7586c9 8025085: [javadoc] some errors in javax/swing
yan
parents: 7668
diff changeset
   627
     * {@inheritDoc}
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   628
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   629
     * <p>Overridden to cause this style to populate itself with data from
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   630
     * UIDefaults, if necessary.</p>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   631
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   632
     * <p>Properties in UIDefaults may be specified in a chained manner. For
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   633
     * example:
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   634
     * <pre>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   635
     * background
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   636
     * Button.opacity
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   637
     * Button.Enabled.foreground
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   638
     * Button.Enabled+Selected.background
20169
d7fa6d7586c9 8025085: [javadoc] some errors in javax/swing
yan
parents: 7668
diff changeset
   639
     * </pre>
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   640
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   641
     * <p>In this example, suppose you were in the Enabled+Selected state and
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   642
     * searched for "foreground". In this case, we first check for
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   643
     * Button.Enabled+Selected.foreground, but no such color exists. We then
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   644
     * fall back to the next valid state, in this case,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   645
     * Button.Enabled.foreground, and have a match. So we return it.</p>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   646
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   647
     * <p>Again, if we were in the state Enabled and looked for "background", we
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   648
     * wouldn't find it in Button.Enabled, or in Button, but would at the top
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   649
     * level in UIManager. So we return that value.</p>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   650
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   651
     * <p>One special note: the "key" passed to this method could be of the form
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   652
     * "background" or "Button.background" where "Button" equals the prefix
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   653
     * passed to the NimbusStyle constructor. In either case, it looks for
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   654
     * "background".</p>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   655
     *
22260
c9185e010e03 8031082: Fix non-missing doclint problems in client libraries
darcy
parents: 21278
diff changeset
   656
     * @param ctx SynthContext identifying requester
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   657
     * @param key must not be null
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   658
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   659
    @Override public Object get(SynthContext ctx, Object key) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   660
        Values v = getValues(ctx);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   661
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   662
        // strip off the prefix, if there is one.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   663
        String fullKey = key.toString();
25122
1ecc464c69d2 8044460: Cleanup new Boolean and single character strings
rriggs
parents: 22260
diff changeset
   664
        String partialKey = fullKey.substring(fullKey.indexOf('.') + 1);
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   665
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   666
        Object obj = null;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   667
        int xstate = getExtendedState(ctx, v);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   668
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   669
        // check the cache
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   670
        tmpKey.init(partialKey, xstate);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   671
        obj = v.cache.get(tmpKey);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   672
        boolean wasInCache = obj != null;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   673
        if (!wasInCache){
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   674
            // Search exact matching states and then lesser matching states
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   675
            RuntimeState s = null;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   676
            int[] lastIndex = new int[] {-1};
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   677
            while (obj == null &&
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   678
                    (s = getNextState(v.states, lastIndex, xstate)) != null) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   679
                obj = s.defaults.get(partialKey);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   680
            }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   681
            // Search Region Defaults
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   682
            if (obj == null && v.defaults != null) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   683
                obj = v.defaults.get(partialKey);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   684
            }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   685
            // return found object
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   686
            // Search UIManager Defaults
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   687
            if (obj == null) obj = UIManager.get(fullKey);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   688
            // Search Synth Defaults for InputMaps
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   689
            if (obj == null && partialKey.equals("focusInputMap")) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   690
                obj = super.get(ctx, fullKey);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   691
            }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   692
            // if all we got was a null, store this fact for later use
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   693
            v.cache.put(new CacheKey(partialKey, xstate),
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   694
                    obj == null ? NULL : obj);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   695
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   696
        // return found object
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   697
        return obj == NULL ? null : obj;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   698
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   699
25565
ce603b34c98d 8043548: Fix raw and unchecked lint warnings in javax.swing.plaf.*
darcy
parents: 25122
diff changeset
   700
    @SuppressWarnings("unchecked")
ce603b34c98d 8043548: Fix raw and unchecked lint warnings in javax.swing.plaf.*
darcy
parents: 25122
diff changeset
   701
    private static Painter<Object> paintFilter(@SuppressWarnings("rawtypes") Painter painter) {
ce603b34c98d 8043548: Fix raw and unchecked lint warnings in javax.swing.plaf.*
darcy
parents: 25122
diff changeset
   702
        return (Painter<Object>) painter;
ce603b34c98d 8043548: Fix raw and unchecked lint warnings in javax.swing.plaf.*
darcy
parents: 25122
diff changeset
   703
    }
ce603b34c98d 8043548: Fix raw and unchecked lint warnings in javax.swing.plaf.*
darcy
parents: 25122
diff changeset
   704
ce603b34c98d 8043548: Fix raw and unchecked lint warnings in javax.swing.plaf.*
darcy
parents: 25122
diff changeset
   705
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   706
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   707
     * Gets the appropriate background Painter, if there is one, for the state
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   708
     * specified in the given SynthContext. This method does appropriate
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   709
     * fallback searching, as described in #get.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   710
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   711
     * @param ctx The SynthContext. Must not be null.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   712
     * @return The background painter associated for the given state, or null if
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   713
     * none could be found.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   714
     */
25565
ce603b34c98d 8043548: Fix raw and unchecked lint warnings in javax.swing.plaf.*
darcy
parents: 25122
diff changeset
   715
    public Painter<Object> getBackgroundPainter(SynthContext ctx) {
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   716
        Values v = getValues(ctx);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   717
        int xstate = getExtendedState(ctx, v);
25565
ce603b34c98d 8043548: Fix raw and unchecked lint warnings in javax.swing.plaf.*
darcy
parents: 25122
diff changeset
   718
        Painter<Object> p = null;
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   719
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   720
        // check the cache
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   721
        tmpKey.init("backgroundPainter$$instance", xstate);
25565
ce603b34c98d 8043548: Fix raw and unchecked lint warnings in javax.swing.plaf.*
darcy
parents: 25122
diff changeset
   722
        p = paintFilter((Painter)v.cache.get(tmpKey));
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   723
        if (p != null) return p;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   724
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   725
        // not in cache, so lookup and store in cache
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   726
        RuntimeState s = null;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   727
        int[] lastIndex = new int[] {-1};
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   728
        while ((s = getNextState(v.states, lastIndex, xstate)) != null) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   729
            if (s.backgroundPainter != null) {
25565
ce603b34c98d 8043548: Fix raw and unchecked lint warnings in javax.swing.plaf.*
darcy
parents: 25122
diff changeset
   730
                p = paintFilter(s.backgroundPainter);
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   731
                break;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   732
            }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   733
        }
25565
ce603b34c98d 8043548: Fix raw and unchecked lint warnings in javax.swing.plaf.*
darcy
parents: 25122
diff changeset
   734
        if (p == null) p = paintFilter((Painter)get(ctx, "backgroundPainter"));
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   735
        if (p != null) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   736
            v.cache.put(new CacheKey("backgroundPainter$$instance", xstate), p);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   737
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   738
        return p;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   739
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   740
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   741
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   742
     * Gets the appropriate foreground Painter, if there is one, for the state
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   743
     * specified in the given SynthContext. This method does appropriate
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   744
     * fallback searching, as described in #get.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   745
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   746
     * @param ctx The SynthContext. Must not be null.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   747
     * @return The foreground painter associated for the given state, or null if
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   748
     * none could be found.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   749
     */
25565
ce603b34c98d 8043548: Fix raw and unchecked lint warnings in javax.swing.plaf.*
darcy
parents: 25122
diff changeset
   750
    public Painter<Object> getForegroundPainter(SynthContext ctx) {
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   751
        Values v = getValues(ctx);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   752
        int xstate = getExtendedState(ctx, v);
25565
ce603b34c98d 8043548: Fix raw and unchecked lint warnings in javax.swing.plaf.*
darcy
parents: 25122
diff changeset
   753
        Painter<Object> p = null;
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   754
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   755
        // check the cache
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   756
        tmpKey.init("foregroundPainter$$instance", xstate);
25565
ce603b34c98d 8043548: Fix raw and unchecked lint warnings in javax.swing.plaf.*
darcy
parents: 25122
diff changeset
   757
        p = paintFilter((Painter)v.cache.get(tmpKey));
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   758
        if (p != null) return p;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   759
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   760
        // not in cache, so lookup and store in cache
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   761
        RuntimeState s = null;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   762
        int[] lastIndex = new int[] {-1};
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   763
        while ((s = getNextState(v.states, lastIndex, xstate)) != null) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   764
            if (s.foregroundPainter != null) {
25565
ce603b34c98d 8043548: Fix raw and unchecked lint warnings in javax.swing.plaf.*
darcy
parents: 25122
diff changeset
   765
                p = paintFilter(s.foregroundPainter);
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   766
                break;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   767
            }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   768
        }
25565
ce603b34c98d 8043548: Fix raw and unchecked lint warnings in javax.swing.plaf.*
darcy
parents: 25122
diff changeset
   769
        if (p == null) p = paintFilter((Painter)get(ctx, "foregroundPainter"));
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   770
        if (p != null) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   771
            v.cache.put(new CacheKey("foregroundPainter$$instance", xstate), p);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   772
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   773
        return p;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   774
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   775
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   776
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   777
     * Gets the appropriate border Painter, if there is one, for the state
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   778
     * specified in the given SynthContext. This method does appropriate
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   779
     * fallback searching, as described in #get.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   780
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   781
     * @param ctx The SynthContext. Must not be null.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   782
     * @return The border painter associated for the given state, or null if
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   783
     * none could be found.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   784
     */
25565
ce603b34c98d 8043548: Fix raw and unchecked lint warnings in javax.swing.plaf.*
darcy
parents: 25122
diff changeset
   785
    public Painter<Object> getBorderPainter(SynthContext ctx) {
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   786
        Values v = getValues(ctx);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   787
        int xstate = getExtendedState(ctx, v);
25565
ce603b34c98d 8043548: Fix raw and unchecked lint warnings in javax.swing.plaf.*
darcy
parents: 25122
diff changeset
   788
        Painter<Object> p = null;
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   789
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   790
        // check the cache
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   791
        tmpKey.init("borderPainter$$instance", xstate);
25565
ce603b34c98d 8043548: Fix raw and unchecked lint warnings in javax.swing.plaf.*
darcy
parents: 25122
diff changeset
   792
        p = paintFilter((Painter)v.cache.get(tmpKey));
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   793
        if (p != null) return p;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   794
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   795
        // not in cache, so lookup and store in cache
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   796
        RuntimeState s = null;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   797
        int[] lastIndex = new int[] {-1};
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   798
        while ((s = getNextState(v.states, lastIndex, xstate)) != null) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   799
            if (s.borderPainter != null) {
25565
ce603b34c98d 8043548: Fix raw and unchecked lint warnings in javax.swing.plaf.*
darcy
parents: 25122
diff changeset
   800
                p = paintFilter(s.borderPainter);
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   801
                break;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   802
            }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   803
        }
25565
ce603b34c98d 8043548: Fix raw and unchecked lint warnings in javax.swing.plaf.*
darcy
parents: 25122
diff changeset
   804
        if (p == null) p = paintFilter((Painter)get(ctx, "borderPainter"));
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   805
        if (p != null) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   806
            v.cache.put(new CacheKey("borderPainter$$instance", xstate), p);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   807
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   808
        return p;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   809
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   810
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   811
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   812
     * Utility method which returns the proper Values based on the given
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   813
     * SynthContext. Ensures that parsing of the values has occurred, or
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   814
     * reoccurs as necessary.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   815
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   816
     * @param ctx The SynthContext
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   817
     * @return a non-null values reference
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   818
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   819
    private Values getValues(SynthContext ctx) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   820
        validate();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   821
        return values;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   822
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   823
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   824
    /**
21278
ef8a3a2a72f2 8022746: List of spelling errors in API doc
malenkov
parents: 20169
diff changeset
   825
     * Simple utility method that searches the given array of Strings for the
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   826
     * given string. This method is only called from getExtendedState if
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   827
     * the developer has specified a specific state for the component to be
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   828
     * in (ie, has "wedged" the component in that state) by specifying
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   829
     * they client property "Nimbus.State".
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   830
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   831
     * @param names a non-null array of strings
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   832
     * @param name the name to look for in the array
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   833
     * @return true or false based on whether the given name is in the array
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   834
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   835
    private boolean contains(String[] names, String name) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   836
        assert name != null;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   837
        for (int i=0; i<names.length; i++) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   838
            if (name.equals(names[i])) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   839
                return true;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   840
            }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   841
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   842
        return false;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   843
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   844
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   845
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   846
     * <p>Gets the extended state for a given synth context. Nimbus supports the
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   847
     * ability to define custom states. The algorithm used for choosing what
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   848
     * style information to use for a given state requires a single integer
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   849
     * bit string where each bit in the integer represents a different state
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   850
     * that the component is in. This method uses the componentState as
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   851
     * reported in the SynthContext, in addition to custom states, to determine
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   852
     * what this extended state is.</p>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   853
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   854
     * <p>In addition, this method checks the component in the given context
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   855
     * for a client property called "Nimbus.State". If one exists, then it will
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   856
     * decompose the String associated with that property to determine what
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   857
     * state to return. In this way, the developer can force a component to be
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   858
     * in a specific state, regardless of what the "real" state of the component
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   859
     * is.</p>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   860
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   861
     * <p>The string associated with "Nimbus.State" would be of the form:
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   862
     * <pre>Enabled+CustomState+MouseOver</pre></p>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   863
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   864
     * @param ctx
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   865
     * @param v
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   866
     * @return
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   867
     */
25565
ce603b34c98d 8043548: Fix raw and unchecked lint warnings in javax.swing.plaf.*
darcy
parents: 25122
diff changeset
   868
    @SuppressWarnings({"unchecked", "rawtypes"})
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   869
    private int getExtendedState(SynthContext ctx, Values v) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   870
        JComponent c = ctx.getComponent();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   871
        int xstate = 0;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   872
        int mask = 1;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   873
        //check for the Nimbus.State client property
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   874
        //Performance NOTE: getClientProperty ends up inside a synchronized
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   875
        //block, so there is some potential for performance issues here, however
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   876
        //I'm not certain that there is one on a modern VM.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   877
        Object property = c.getClientProperty("Nimbus.State");
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   878
        if (property != null) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   879
            String stateNames = property.toString();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   880
            String[] states = stateNames.split("\\+");
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   881
            if (v.stateTypes == null){
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   882
                // standard states only
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   883
                for (String stateStr : states) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   884
                    State.StandardState s = State.getStandardState(stateStr);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   885
                    if (s != null) xstate |= s.getState();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   886
                }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   887
            } else {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   888
                // custom states
25565
ce603b34c98d 8043548: Fix raw and unchecked lint warnings in javax.swing.plaf.*
darcy
parents: 25122
diff changeset
   889
                for (State<?> s : v.stateTypes) {
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   890
                    if (contains(states, s.getName())) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   891
                        xstate |= mask;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   892
                    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   893
                    mask <<= 1;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   894
                }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   895
            }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   896
        } else {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   897
            //if there are no custom states defined, then simply return the
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   898
            //state that Synth reported
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   899
            if (v.stateTypes == null) return ctx.getComponentState();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   900
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   901
            //there are custom states on this values, so I'll have to iterate
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   902
            //over them all and return a custom extended state
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   903
            int state = ctx.getComponentState();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   904
            for (State s : v.stateTypes) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   905
                if (s.isInState(c, state)) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   906
                    xstate |= mask;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   907
                }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   908
                mask <<= 1;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   909
            }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   910
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   911
        return xstate;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   912
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   913
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   914
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   915
     * <p>Gets the RuntimeState that most closely matches the state in the given
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   916
     * context, but is less specific than the given "lastState". Essentially,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   917
     * this allows you to search for the next best state.</p>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   918
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   919
     * <p>For example, if you had the following three states:
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   920
     * <pre>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   921
     * Enabled
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   922
     * Enabled+Pressed
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   923
     * Disabled
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   924
     * </pre>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   925
     * And you wanted to find the state that best represented
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   926
     * ENABLED+PRESSED+FOCUSED and <code>lastState</code> was null (or an
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   927
     * empty array, or an array with a single int with index == -1), then
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   928
     * Enabled+Pressed would be returned. If you then call this method again but
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   929
     * pass the index of Enabled+Pressed as the "lastState", then
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   930
     * Enabled would be returned. If you call this method a third time and pass
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   931
     * the index of Enabled in as the <code>lastState</code>, then null would be
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   932
     * returned.</p>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   933
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   934
     * <p>The actual code path for determining the proper state is the same as
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   935
     * in Synth.</p>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   936
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   937
     * @param ctx
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   938
     * @param lastState a 1 element array, allowing me to do pass-by-reference.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   939
     * @return
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   940
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   941
    private RuntimeState getNextState(RuntimeState[] states,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   942
                                      int[] lastState,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   943
                                      int xstate) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   944
        // Use the StateInfo with the most bits that matches that of state.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   945
        // If there are none, then fallback to
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   946
        // the StateInfo with a state of 0, indicating it'll match anything.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   947
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   948
        // Consider if we have 3 StateInfos a, b and c with states:
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   949
        // SELECTED, SELECTED | ENABLED, 0
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   950
        //
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   951
        // Input                          Return Value
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   952
        // -----                          ------------
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   953
        // SELECTED                       a
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   954
        // SELECTED | ENABLED             b
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   955
        // MOUSE_OVER                     c
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   956
        // SELECTED | ENABLED | FOCUSED   b
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   957
        // ENABLED                        c
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   958
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   959
        if (states != null && states.length > 0) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   960
            int bestCount = 0;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   961
            int bestIndex = -1;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   962
            int wildIndex = -1;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   963
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   964
            //if xstate is 0, then search for the runtime state with component
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   965
            //state of 0. That is, find the exact match and return it.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   966
            if (xstate == 0) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   967
                for (int counter = states.length - 1; counter >= 0; counter--) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   968
                    if (states[counter].state == 0) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   969
                        lastState[0] = counter;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   970
                        return states[counter];
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   971
                    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   972
                }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   973
                //an exact match couldn't be found, so there was no match.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   974
                lastState[0] = -1;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   975
                return null;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   976
            }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   977
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   978
            //xstate is some value != 0
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   979
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   980
            //determine from which index to start looking. If lastState[0] is -1
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   981
            //then we know to start from the end of the state array. Otherwise,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   982
            //we start at the lastIndex - 1.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   983
            int lastStateIndex = lastState == null || lastState[0] == -1 ?
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   984
                states.length : lastState[0];
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   985
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   986
            for (int counter = lastStateIndex - 1; counter >= 0; counter--) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   987
                int oState = states[counter].state;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   988
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   989
                if (oState == 0) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   990
                    if (wildIndex == -1) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   991
                        wildIndex = counter;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   992
                    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   993
                } else if ((xstate & oState) == oState) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   994
                    // This is key, we need to make sure all bits of the
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   995
                    // StateInfo match, otherwise a StateInfo with
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   996
                    // SELECTED | ENABLED would match ENABLED, which we
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   997
                    // don't want.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   998
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   999
                    // This comes from BigInteger.bitCnt
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1000
                    int bitCount = oState;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1001
                    bitCount -= (0xaaaaaaaa & bitCount) >>> 1;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1002
                    bitCount = (bitCount & 0x33333333) + ((bitCount >>> 2) &
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1003
                            0x33333333);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1004
                    bitCount = bitCount + (bitCount >>> 4) & 0x0f0f0f0f;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1005
                    bitCount += bitCount >>> 8;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1006
                    bitCount += bitCount >>> 16;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1007
                    bitCount = bitCount & 0xff;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1008
                    if (bitCount > bestCount) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1009
                        bestIndex = counter;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1010
                        bestCount = bitCount;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1011
                    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1012
                }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1013
            }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1014
            if (bestIndex != -1) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1015
                lastState[0] = bestIndex;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1016
                return states[bestIndex];
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1017
            }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1018
            if (wildIndex != -1) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1019
                lastState[0] = wildIndex;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1020
                return states[wildIndex];
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1021
            }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1022
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1023
        lastState[0] = -1;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1024
        return null;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1025
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1026
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1027
    /**
21278
ef8a3a2a72f2 8022746: List of spelling errors in API doc
malenkov
parents: 20169
diff changeset
  1028
     * Contains values such as the UIDefaults and painters associated with
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1029
     * a state. Whereas <code>State</code> represents a distinct state that a
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1030
     * component can be in (such as Enabled), this class represents the colors,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1031
     * fonts, painters, etc associated with some state for this
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1032
     * style.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1033
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1034
    private final class RuntimeState implements Cloneable {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1035
        int state;
25565
ce603b34c98d 8043548: Fix raw and unchecked lint warnings in javax.swing.plaf.*
darcy
parents: 25122
diff changeset
  1036
        Painter<Object> backgroundPainter;
ce603b34c98d 8043548: Fix raw and unchecked lint warnings in javax.swing.plaf.*
darcy
parents: 25122
diff changeset
  1037
        Painter<Object> foregroundPainter;
ce603b34c98d 8043548: Fix raw and unchecked lint warnings in javax.swing.plaf.*
darcy
parents: 25122
diff changeset
  1038
        Painter<Object> borderPainter;
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1039
        String stateName;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1040
        UIDefaults defaults = new UIDefaults(10, .7f);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1041
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1042
        private RuntimeState(int state, String stateName) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1043
            this.state = state;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1044
            this.stateName = stateName;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1045
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1046
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1047
        @Override
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1048
        public String toString() {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1049
            return stateName;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1050
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1051
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1052
        @Override
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1053
        public RuntimeState clone() {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1054
            RuntimeState clone = new RuntimeState(state, stateName);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1055
            clone.backgroundPainter = backgroundPainter;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1056
            clone.foregroundPainter = foregroundPainter;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1057
            clone.borderPainter = borderPainter;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1058
            clone.defaults.putAll(defaults);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1059
            return clone;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1060
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1061
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1062
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1063
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1064
     * Essentially a struct of data for a style. A default instance of this
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1065
     * class is used by NimbusStyle. Additional instances exist for each
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1066
     * component that has overrides.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1067
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1068
    private static final class Values {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1069
        /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1070
         * The list of State types. A State represents a type of state, such
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1071
         * as Enabled, Default, WindowFocused, etc. These can be custom states.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1072
         */
25565
ce603b34c98d 8043548: Fix raw and unchecked lint warnings in javax.swing.plaf.*
darcy
parents: 25122
diff changeset
  1073
        State<?>[] stateTypes = null;
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1074
        /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1075
         * The list of actual runtime state representations. These can represent things such
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1076
         * as Enabled + Focused. Thus, they differ from States in that they contain
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1077
         * several states together, and have associated properties, data, etc.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1078
         */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1079
        RuntimeState[] states = null;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1080
        /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1081
         * The content margins for this region.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1082
         */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1083
        Insets contentMargins;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1084
        /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1085
         * Defaults on the region/component level.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1086
         */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1087
        UIDefaults defaults = new UIDefaults(10, .7f);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1088
        /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1089
         * Simple cache. After a value has been looked up, it is stored
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1090
         * in this cache for later retrieval. The key is a concatenation of
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1091
         * the property being looked up, two dollar signs, and the extended
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1092
         * state. So for example:
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1093
         *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1094
         * foo.bar$$2353
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1095
         */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1096
        Map<CacheKey,Object> cache = new HashMap<CacheKey,Object>();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1097
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1098
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1099
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1100
     * This implementation presupposes that key is never null and that
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1101
     * the two keys being checked for equality are never null
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1102
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1103
    private static final class CacheKey {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1104
        private String key;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1105
        private int xstate;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1106
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1107
        CacheKey(Object key, int xstate) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1108
            init(key, xstate);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1109
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1110
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1111
        void init(Object key, int xstate) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1112
            this.key = key.toString();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1113
            this.xstate = xstate;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1114
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1115
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1116
        @Override
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1117
        public boolean equals(Object obj) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1118
            final CacheKey other = (CacheKey) obj;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1119
            if (obj == null) return false;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1120
            if (this.xstate != other.xstate) return false;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1121
            if (!this.key.equals(other.key)) return false;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1122
            return true;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1123
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1124
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1125
        @Override
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1126
        public int hashCode() {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1127
            int hash = 3;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1128
            hash = 29 * hash + this.key.hashCode();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1129
            hash = 29 * hash + this.xstate;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1130
            return hash;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1131
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1132
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
  1133
}