1 /*
   2  * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 package sun.swing;
  26 
  27 import java.awt.Color;
  28 import java.awt.Insets;
  29 import javax.swing.*;
  30 import javax.swing.border.Border;
  31 import javax.swing.plaf.ComponentUI;
  32 import sun.awt.AppContext;
  33 
  34 /**
  35  * DefaultLookup provides a way to customize the lookup done by the
  36  * UIManager. The default implementation of DefaultLookup forwards
  37  * the call to the UIManager.
  38  * <p>
  39  * <b>WARNING:</b> While this class is public, it should not be treated as
  40  * public API and its API may change in incompatable ways between dot dot
  41  * releases and even patch releases. You should not rely on this class even
  42  * existing.
  43  *
  44  * @author Scott Violet
  45  */
  46 public class DefaultLookup {
  47     /**
  48      * Key used to store DefaultLookup for AppContext.
  49      */
  50     private static final Object DEFAULT_LOOKUP_KEY = new
  51                                         StringBuffer("DefaultLookup");
  52     /**
  53      * Thread that last asked for a default.
  54      */
  55     private static Thread currentDefaultThread;
  56     /**
  57      * DefaultLookup for last thread.
  58      */
  59     private static DefaultLookup currentDefaultLookup;
  60 
  61     /**
  62      * If true, a custom DefaultLookup has been set.
  63      */
  64     private static boolean isLookupSet;
  65 
  66 
  67     /**
  68      * Sets the DefaultLookup instance to use for the current
  69      * {@code AppContext}. Null implies the UIManager should be
  70      * used.
  71      */
  72     public static void setDefaultLookup(DefaultLookup lookup) {
  73         synchronized(DefaultLookup.class) {
  74             if (!isLookupSet && lookup == null) {
  75                 // Null was passed in, and no one has invoked setDefaultLookup
  76                 // with a non-null value, we don't need to do anything.
  77                 return;
  78             }
  79             else if (lookup == null) {
  80                 // null was passed in, but someone has invoked setDefaultLookup
  81                 // with a non-null value, use an instance of DefautLookup
  82                 // which will fallback to UIManager.
  83                 lookup = new DefaultLookup();
  84             }
  85             isLookupSet = true;
  86             AppContext.getAppContext().put(DEFAULT_LOOKUP_KEY, lookup);
  87             currentDefaultThread = Thread.currentThread();
  88             currentDefaultLookup = lookup;
  89         }
  90     }
  91 
  92     public static Object get(JComponent c, ComponentUI ui, String key) {
  93         boolean lookupSet;
  94         synchronized(DefaultLookup.class) {
  95             lookupSet = isLookupSet;
  96         }
  97         if (!lookupSet) {
  98             // No one has set a valid DefaultLookup, use UIManager.
  99             return UIManager.get(key, c.getLocale());
 100         }
 101         Thread thisThread = Thread.currentThread();
 102         DefaultLookup lookup;
 103         synchronized(DefaultLookup.class) {
 104             // See if we've already cached the DefaultLookup for this thread,
 105             // and use it if we have.
 106             if (thisThread == currentDefaultThread) {
 107                 // It is cached, use it.
 108                 lookup = currentDefaultLookup;
 109             }
 110             else {
 111                 // Not cached, get the DefaultLookup to use from the AppContext
 112                 lookup = (DefaultLookup)AppContext.getAppContext().get(
 113                                                    DEFAULT_LOOKUP_KEY);
 114                 if (lookup == null) {
 115                     // Fallback to DefaultLookup, which will redirect to the
 116                     // UIManager.
 117                     lookup = new DefaultLookup();
 118                     AppContext.getAppContext().put(DEFAULT_LOOKUP_KEY, lookup);
 119                 }
 120                 // Cache the values to make the next lookup easier.
 121                 currentDefaultThread = thisThread;
 122                 currentDefaultLookup = lookup;
 123             }
 124         }
 125         return lookup.getDefault(c, ui, key);
 126     }
 127 
 128     //
 129     // The following are convenience method that all use getDefault.
 130     //
 131     public static int getInt(JComponent c, ComponentUI ui, String key,
 132                              int defaultValue) {
 133         Object iValue = get(c, ui, key);
 134 
 135         if (iValue == null || !(iValue instanceof Number)) {
 136             return defaultValue;
 137         }
 138         return ((Number)iValue).intValue();
 139     }
 140 
 141     public static int getInt(JComponent c, ComponentUI ui, String key) {
 142         return getInt(c, ui, key, -1);
 143     }
 144 
 145     public static Insets getInsets(JComponent c, ComponentUI ui, String key,
 146                                    Insets defaultValue) {
 147         Object iValue = get(c, ui, key);
 148 
 149         if (iValue == null || !(iValue instanceof Insets)) {
 150             return defaultValue;
 151         }
 152         return (Insets)iValue;
 153     }
 154 
 155     public static Insets getInsets(JComponent c, ComponentUI ui, String key) {
 156         return getInsets(c, ui, key, null);
 157     }
 158 
 159     public static boolean getBoolean(JComponent c, ComponentUI ui, String key,
 160                                      boolean defaultValue) {
 161         Object iValue = get(c, ui, key);
 162 
 163         if (iValue == null || !(iValue instanceof Boolean)) {
 164             return defaultValue;
 165         }
 166         return ((Boolean)iValue).booleanValue();
 167     }
 168 
 169     public static boolean getBoolean(JComponent c, ComponentUI ui, String key) {
 170         return getBoolean(c, ui, key, false);
 171     }
 172 
 173     public static Color getColor(JComponent c, ComponentUI ui, String key,
 174                                  Color defaultValue) {
 175         Object iValue = get(c, ui, key);
 176 
 177         if (iValue == null || !(iValue instanceof Color)) {
 178             return defaultValue;
 179         }
 180         return (Color)iValue;
 181     }
 182 
 183     public static Color getColor(JComponent c, ComponentUI ui, String key) {
 184         return getColor(c, ui, key, null);
 185     }
 186 
 187     public static Icon getIcon(JComponent c, ComponentUI ui, String key,
 188             Icon defaultValue) {
 189         Object iValue = get(c, ui, key);
 190         if (iValue == null || !(iValue instanceof Icon)) {
 191             return defaultValue;
 192         }
 193         return (Icon)iValue;
 194     }
 195 
 196     public static Icon getIcon(JComponent c, ComponentUI ui, String key) {
 197         return getIcon(c, ui, key, null);
 198     }
 199 
 200     public static Border getBorder(JComponent c, ComponentUI ui, String key,
 201             Border defaultValue) {
 202         Object iValue = get(c, ui, key);
 203         if (iValue == null || !(iValue instanceof Border)) {
 204             return defaultValue;
 205         }
 206         return (Border)iValue;
 207     }
 208 
 209     public static Border getBorder(JComponent c, ComponentUI ui, String key) {
 210         return getBorder(c, ui, key, null);
 211     }
 212 
 213     public Object getDefault(JComponent c, ComponentUI ui, String key) {
 214         // basic
 215         return UIManager.get(key, c.getLocale());
 216     }
 217 }
--- EOF ---