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