--- /dev/null
+/*
+ * Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package swingjs.plaf;
+
+import jsjavax.swing.Action;
+import jsjavax.swing.ActionMap;
+import jsjavax.swing.JComponent;
+import jsjavax.swing.SwingUtilities;
+import jsjavax.swing.UIManager;
+import jsjavax.swing.plaf.ActionMapUIResource;
+
+/**
+ * An ActionMap that populates its contents as necessary. The
+ * contents are populated by invoking the <code>loadActionMap</code>
+ * method on the passed in Object.
+ *
+ * @author Scott Violet
+ */
+class LazyActionMap extends ActionMapUIResource {
+ /**
+ * Object to invoke <code>loadActionMap</code> on. This may be
+ * a Class object.
+ */
+ private transient Object _loader;
+
+ /**
+ * Installs an ActionMap that will be populated by invoking the
+ * <code>loadActionMap</code> method on the specified Class
+ * when necessary.
+ * <p>
+ * This should be used if the ActionMap can be shared.
+ *
+ * @param c JComponent to install the ActionMap on.
+ * @param loaderClass Class object that gets loadActionMap invoked
+ * on.
+ * @param defaultsKey Key to use to defaults table to check for
+ * existing map and what resulting Map will be registered on.
+ */
+ static void installLazyActionMap(JComponent c, Class loaderClass,
+ String defaultsKey) {
+ ActionMap map = (ActionMap)UIManager.get(defaultsKey);
+ if (map == null) {
+ map = new LazyActionMap(loaderClass);
+// UIManager.getLookAndFeelDefaults().put(defaultsKey, map);
+ }
+ SwingUtilities.replaceUIActionMap(c, map);
+ }
+
+ /**
+ * Returns an ActionMap that will be populated by invoking the
+ * <code>loadActionMap</code> method on the specified Class
+ * when necessary.
+ * <p>
+ * This should be used if the ActionMap can be shared.
+ *
+ * @param c JComponent to install the ActionMap on.
+ * @param loaderClass Class object that gets loadActionMap invoked
+ * on.
+ * @param defaultsKey Key to use to defaults table to check for
+ * existing map and what resulting Map will be registered on.
+ */
+ static ActionMap getActionMap(Class loaderClass,
+ String defaultsKey) {
+ ActionMap map = (ActionMap)UIManager.get(defaultsKey);
+ if (map == null) {
+ map = new LazyActionMap(loaderClass);
+//SwingJS temp UIManager.getLookAndFeelDefaults().put(defaultsKey, map);
+ }
+ return map;
+ }
+
+
+ private LazyActionMap(Class loader) {
+ _loader = loader;
+ }
+
+ public void put(Action action) {
+ put(action.getValue(Action.NAME), action);
+ }
+
+ public void put(Object key, Action action) {
+ loadIfNecessary();
+ super.put(key, action);
+ }
+
+ public Action get(Object key) {
+ loadIfNecessary();
+ return super.get(key);
+ }
+
+ public void remove(Object key) {
+ loadIfNecessary();
+ super.remove(key);
+ }
+
+ public void clear() {
+ loadIfNecessary();
+ super.clear();
+ }
+
+ public Object[] keys() {
+ loadIfNecessary();
+ return super.keys();
+ }
+
+ public int size() {
+ loadIfNecessary();
+ return super.size();
+ }
+
+ public Object[] allKeys() {
+ loadIfNecessary();
+ return super.allKeys();
+ }
+
+ public void setParent(ActionMap map) {
+ loadIfNecessary();
+ super.setParent(map);
+ }
+
+ private void loadIfNecessary() {
+ if (_loader != null) {
+ /**
+ * @j2sNative
+ *
+ * this._loader.loadActionMap(this);
+ * this._loader = null;
+ */
+ {}
+// Object loader = _loader;
+//
+// _loader = null;
+// Class klass = (Class)loader;
+// try {
+// Method method = klass.getDeclaredMethod("loadActionMap",
+// new Class[] { LazyActionMap.class });
+// method.invoke(klass, new Object[] { this });
+// } catch (NoSuchMethodException nsme) {
+// assert false : "LazyActionMap unable to load actions " +
+// klass;
+// } catch (IllegalAccessException iae) {
+// assert false : "LazyActionMap unable to load actions " +
+// iae;
+// } catch (InvocationTargetException ite) {
+// assert false : "LazyActionMap unable to load actions " +
+// ite;
+// } catch (IllegalArgumentException iae) {
+// assert false : "LazyActionMap unable to load actions " +
+// iae;
+// }
+ }
+ }
+}