39 class LazyActionMap extends ActionMapUIResource {
40 /**
41 * Object to invoke <code>loadActionMap</code> on. This may be
42 * a Class object.
43 */
44 private transient Object _loader;
45
46 /**
47 * Installs an ActionMap that will be populated by invoking the
48 * <code>loadActionMap</code> method on the specified Class
49 * when necessary.
50 * <p>
51 * This should be used if the ActionMap can be shared.
52 *
53 * @param c JComponent to install the ActionMap on.
54 * @param loaderClass Class object that gets loadActionMap invoked
55 * on.
56 * @param defaultsKey Key to use to defaults table to check for
57 * existing map and what resulting Map will be registered on.
58 */
59 static void installLazyActionMap(JComponent c, Class loaderClass,
60 String defaultsKey) {
61 ActionMap map = (ActionMap)UIManager.get(defaultsKey);
62 if (map == null) {
63 map = new LazyActionMap(loaderClass);
64 UIManager.getLookAndFeelDefaults().put(defaultsKey, map);
65 }
66 SwingUtilities.replaceUIActionMap(c, map);
67 }
68
69 /**
70 * Returns an ActionMap that will be populated by invoking the
71 * <code>loadActionMap</code> method on the specified Class
72 * when necessary.
73 * <p>
74 * This should be used if the ActionMap can be shared.
75 *
76 * @param c JComponent to install the ActionMap on.
77 * @param loaderClass Class object that gets loadActionMap invoked
78 * on.
79 * @param defaultsKey Key to use to defaults table to check for
80 * existing map and what resulting Map will be registered on.
81 */
82 static ActionMap getActionMap(Class loaderClass,
83 String defaultsKey) {
84 ActionMap map = (ActionMap)UIManager.get(defaultsKey);
85 if (map == null) {
86 map = new LazyActionMap(loaderClass);
87 UIManager.getLookAndFeelDefaults().put(defaultsKey, map);
88 }
89 return map;
90 }
91
92
93 private LazyActionMap(Class loader) {
94 _loader = loader;
95 }
96
97 public void put(Action action) {
98 put(action.getValue(Action.NAME), action);
99 }
100
101 public void put(Object key, Action action) {
102 loadIfNecessary();
103 super.put(key, action);
104 }
105
106 public Action get(Object key) {
107 loadIfNecessary();
108 return super.get(key);
109 }
110
111 public void remove(Object key) {
112 loadIfNecessary();
113 super.remove(key);
129 }
130
131 public Object[] allKeys() {
132 loadIfNecessary();
133 return super.allKeys();
134 }
135
136 public void setParent(ActionMap map) {
137 loadIfNecessary();
138 super.setParent(map);
139 }
140
141 private void loadIfNecessary() {
142 if (_loader != null) {
143 Object loader = _loader;
144
145 _loader = null;
146 Class<?> klass = (Class<?>)loader;
147 try {
148 Method method = klass.getDeclaredMethod("loadActionMap",
149 new Class[] { LazyActionMap.class });
150 method.invoke(klass, new Object[] { this });
151 } catch (NoSuchMethodException nsme) {
152 assert false : "LazyActionMap unable to load actions " +
153 klass;
154 } catch (IllegalAccessException iae) {
155 assert false : "LazyActionMap unable to load actions " +
156 iae;
157 } catch (InvocationTargetException ite) {
158 assert false : "LazyActionMap unable to load actions " +
159 ite;
160 } catch (IllegalArgumentException iae) {
161 assert false : "LazyActionMap unable to load actions " +
162 iae;
163 }
164 }
165 }
166 }
|
39 class LazyActionMap extends ActionMapUIResource {
40 /**
41 * Object to invoke <code>loadActionMap</code> on. This may be
42 * a Class object.
43 */
44 private transient Object _loader;
45
46 /**
47 * Installs an ActionMap that will be populated by invoking the
48 * <code>loadActionMap</code> method on the specified Class
49 * when necessary.
50 * <p>
51 * This should be used if the ActionMap can be shared.
52 *
53 * @param c JComponent to install the ActionMap on.
54 * @param loaderClass Class object that gets loadActionMap invoked
55 * on.
56 * @param defaultsKey Key to use to defaults table to check for
57 * existing map and what resulting Map will be registered on.
58 */
59 static void installLazyActionMap(JComponent c, Class<?> loaderClass,
60 String defaultsKey) {
61 ActionMap map = (ActionMap)UIManager.get(defaultsKey);
62 if (map == null) {
63 map = new LazyActionMap(loaderClass);
64 UIManager.getLookAndFeelDefaults().put(defaultsKey, map);
65 }
66 SwingUtilities.replaceUIActionMap(c, map);
67 }
68
69 /**
70 * Returns an ActionMap that will be populated by invoking the
71 * <code>loadActionMap</code> method on the specified Class
72 * when necessary.
73 * <p>
74 * This should be used if the ActionMap can be shared.
75 *
76 * @param c JComponent to install the ActionMap on.
77 * @param loaderClass Class object that gets loadActionMap invoked
78 * on.
79 * @param defaultsKey Key to use to defaults table to check for
80 * existing map and what resulting Map will be registered on.
81 */
82 static ActionMap getActionMap(Class<?> loaderClass,
83 String defaultsKey) {
84 ActionMap map = (ActionMap)UIManager.get(defaultsKey);
85 if (map == null) {
86 map = new LazyActionMap(loaderClass);
87 UIManager.getLookAndFeelDefaults().put(defaultsKey, map);
88 }
89 return map;
90 }
91
92
93 private LazyActionMap(Class<?> loader) {
94 _loader = loader;
95 }
96
97 public void put(Action action) {
98 put(action.getValue(Action.NAME), action);
99 }
100
101 public void put(Object key, Action action) {
102 loadIfNecessary();
103 super.put(key, action);
104 }
105
106 public Action get(Object key) {
107 loadIfNecessary();
108 return super.get(key);
109 }
110
111 public void remove(Object key) {
112 loadIfNecessary();
113 super.remove(key);
129 }
130
131 public Object[] allKeys() {
132 loadIfNecessary();
133 return super.allKeys();
134 }
135
136 public void setParent(ActionMap map) {
137 loadIfNecessary();
138 super.setParent(map);
139 }
140
141 private void loadIfNecessary() {
142 if (_loader != null) {
143 Object loader = _loader;
144
145 _loader = null;
146 Class<?> klass = (Class<?>)loader;
147 try {
148 Method method = klass.getDeclaredMethod("loadActionMap",
149 new Class<?>[] { LazyActionMap.class });
150 method.invoke(klass, new Object[] { this });
151 } catch (NoSuchMethodException nsme) {
152 assert false : "LazyActionMap unable to load actions " +
153 klass;
154 } catch (IllegalAccessException iae) {
155 assert false : "LazyActionMap unable to load actions " +
156 iae;
157 } catch (InvocationTargetException ite) {
158 assert false : "LazyActionMap unable to load actions " +
159 ite;
160 } catch (IllegalArgumentException iae) {
161 assert false : "LazyActionMap unable to load actions " +
162 iae;
163 }
164 }
165 }
166 }
|