Home » openjdk-7 » sun » swing » [javadoc | source]

    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</code>. 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   }

Home » openjdk-7 » sun » swing » [javadoc | source]