JAL-1807
[jalview.git] / site / j2s / swingjs / plaf / LazyActionMap.java
diff --git a/site/j2s/swingjs/plaf/LazyActionMap.java b/site/j2s/swingjs/plaf/LazyActionMap.java
new file mode 100644 (file)
index 0000000..3051d1e
--- /dev/null
@@ -0,0 +1,175 @@
+/*
+ * 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;
+//            }
+        }
+    }
+}