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; |
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 } |