jdk/src/share/classes/javax/swing/plaf/nimbus/NimbusLookAndFeel.java
changeset 3741 4021567cd4ca
parent 3107 51a846c2c16f
child 4394 92a8ec883f5d
equal deleted inserted replaced
3740:efb34ff1cef4 3741:4021567cd4ca
    38 import java.awt.Color;
    38 import java.awt.Color;
    39 import java.awt.Container;
    39 import java.awt.Container;
    40 import java.awt.Graphics2D;
    40 import java.awt.Graphics2D;
    41 import java.awt.LayoutManager;
    41 import java.awt.LayoutManager;
    42 import java.awt.image.BufferedImage;
    42 import java.awt.image.BufferedImage;
       
    43 import java.beans.PropertyChangeEvent;
       
    44 import java.beans.PropertyChangeListener;
       
    45 import java.util.*;
    43 import javax.swing.GrayFilter;
    46 import javax.swing.GrayFilter;
    44 import javax.swing.Icon;
    47 import javax.swing.Icon;
    45 import javax.swing.JToolBar;
    48 import javax.swing.JToolBar;
    46 import javax.swing.border.TitledBorder;
    49 import javax.swing.border.TitledBorder;
    47 import javax.swing.plaf.BorderUIResource;
    50 import javax.swing.plaf.BorderUIResource;
    85     /**
    88     /**
    86      * Reference to populated LAD uidefaults
    89      * Reference to populated LAD uidefaults
    87      */
    90      */
    88     private UIDefaults uiDefaults;
    91     private UIDefaults uiDefaults;
    89 
    92 
       
    93     private DefaultsListener defaultsListener = new DefaultsListener();
       
    94 
    90     /**
    95     /**
    91      * Create a new NimbusLookAndFeel.
    96      * Create a new NimbusLookAndFeel.
    92      */
    97      */
    93     public NimbusLookAndFeel() {
    98     public NimbusLookAndFeel() {
    94         super();
    99         super();
   113     @Override public void uninitialize() {
   118     @Override public void uninitialize() {
   114         super.uninitialize();
   119         super.uninitialize();
   115         defaults.uninitialize();
   120         defaults.uninitialize();
   116         // clear all cached images to free memory
   121         // clear all cached images to free memory
   117         ImageCache.getInstance().flush();
   122         ImageCache.getInstance().flush();
   118         // remove the listeners and things installed by NimbusStyle
   123         UIManager.getDefaults().removePropertyChangeListener(defaultsListener);
   119         NimbusStyle.uninitialize();
       
   120     }
   124     }
   121 
   125 
   122     /**
   126     /**
   123      * @inheritDoc
   127      * @inheritDoc
   124      */
   128      */
   513                 }
   517                 }
   514             }
   518             }
   515             return obj;
   519             return obj;
   516         }
   520         }
   517     }
   521     }
       
   522 
       
   523     private Map<String, Map<String, Object>> compiledDefaults = null;
       
   524     private boolean defaultListenerAdded = false;
       
   525 
       
   526     static String parsePrefix(String key) {
       
   527         if (key == null) {
       
   528             return null;
       
   529         }
       
   530         boolean inquotes = false;
       
   531         for (int i = 0; i < key.length(); i++) {
       
   532             char c = key.charAt(i);
       
   533             if (c == '"') {
       
   534                 inquotes = !inquotes;
       
   535             } else if ((c == '[' || c == '.') && !inquotes) {
       
   536                 return key.substring(0, i);
       
   537             }
       
   538         }
       
   539         return null;
       
   540     }
       
   541 
       
   542     Map<String, Object> getDefaultsForPrefix(String prefix) {
       
   543         if (compiledDefaults == null) {
       
   544             compiledDefaults = new HashMap<String, Map<String, Object>>();
       
   545             for (Map.Entry<Object, Object> entry: UIManager.getDefaults().entrySet()) {
       
   546                 if (entry.getKey() instanceof String) {
       
   547                     addDefault((String) entry.getKey(), entry.getValue());
       
   548                 }
       
   549             }
       
   550             if (! defaultListenerAdded) {
       
   551                 UIManager.getDefaults().addPropertyChangeListener(defaultsListener);
       
   552                 defaultListenerAdded = true;
       
   553             }
       
   554         }
       
   555         return compiledDefaults.get(prefix);
       
   556     }
       
   557 
       
   558     private void addDefault(String key, Object value) {
       
   559         String prefix = parsePrefix(key);
       
   560         if (prefix != null) {
       
   561             Map<String, Object> keys = compiledDefaults.get(prefix);
       
   562             if (keys == null) {
       
   563                 keys = new HashMap<String, Object>();
       
   564                 compiledDefaults.put(prefix, keys);
       
   565             }
       
   566             keys.put(key, value);
       
   567         }
       
   568     }
       
   569 
       
   570     private class DefaultsListener implements PropertyChangeListener {
       
   571         @Override public void propertyChange(PropertyChangeEvent ev) {
       
   572             String key = ev.getPropertyName();
       
   573             if ("UIDefaults".equals(key)) {
       
   574                 compiledDefaults = null;
       
   575             } else {
       
   576                 addDefault(key, ev.getNewValue());
       
   577             }
       
   578         }
       
   579     }
   518 }
   580 }