alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

What this is

This file is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Other links

The source code

/*
 *                 Sun Public License Notice
 * 
 * The contents of this file are subject to the Sun Public License
 * Version 1.0 (the "License"). You may not use this file except in
 * compliance with the License. A copy of the License is available at
 * http://www.sun.com/
 * 
 * The Original Code is NetBeans. The Initial Developer of the Original
 * Code is Sun Microsystems, Inc. Portions Copyright 1997-2003 Sun
 * Microsystems, Inc. All Rights Reserved.
 */

package org.openide.nodes;

import java.util.*;

import org.openide.util.Mutex;

/** Class that serves as interface to various parts of OpenAPIs that need 
 * not be present.
 *
 * @author  Jaroslav Tulach
 */
abstract class TMUtil extends Object {
    /** variable that will contain the argument to a call and then a result.
     */
    private static final ThreadLocal TALK = new ThreadLocal ();
    
    /** maps names of algorithms (that use the ARGUMENT and the RESULT)
     * and runnables that has to be executed to compute the algorithm
     * (String, Runnable) or (String, Exception)
     */
    private static Hashtable algorithms = new Hashtable (10);
    
    
    /** Dynamically loads a class.
     * @param className name of the class
     * @return the class
     */
    private static Class loadClass (String className) throws Exception {
        ClassLoader loader = (ClassLoader)org.openide.util.Lookup.getDefault().lookup (ClassLoader.class);
        if (loader == null) {
            loader = NodeOperation.class.getClassLoader();
        }
        return Class.forName(className, true, loader);
    }

    /** Creates InstanceCookie, if available.
     * @param bean the object to create cookie for
     * @return Node.Cookie or null
     */
    static Node.Cookie createInstanceCookie (Object bean) {
        try {
            TALK.set (bean);
            return exec ("Bean") ? (Node.Cookie)TALK.get () : null; // NOI18N
        } finally {
            TALK.set(null);
        }
    }
    
    /** Checks whether an object is instance of DialogDescriptor and if 
     * so it used top manager to create its instance.
     * @param maybeDialogDescriptor an object
     * @return a dialog or null
     */
    static java.awt.Dialog createDialog (Object maybeDialogDescriptor) {
        try {
            TALK.set (maybeDialogDescriptor);
            return exec ("Dial") ? (java.awt.Dialog)TALK.get () : null; // NOI18N
        } 
        finally {
            TALK.set(null);
        }                
    }
    
    /** Attaches a customizer to given node.
     * @param node the bean node 
     * @param cust customizer to attach
     */
    static void attachCustomizer (Node node, java.beans.Customizer cust) {
        try {
            TALK.set (new Object[] { node, cust });
            exec ("Cust"); // NOI18N
        } 
        finally {
            TALK.set(null);
        }                
    }
    
    /** Finds main window.
     * @return main window or null
     */
    static java.awt.Frame mainWindow () {
        try {
            if (exec ("Win")) { // NOI18N
                return (java.awt.Frame)TALK.get ();
            } else {
                // default owner for JDialog
                if (owner == null) {
                    owner = (java.awt.Frame)new javax.swing.JDialog ().getOwner ();
                }
                return owner;
            }
        } 
        finally {
            TALK.set(null);
        }
    }
    private static java.awt.Frame owner;
    
    /** Finds usable list cell renderer.
     */
    static javax.swing.ListCellRenderer findListCellRenderer () {
        try {
            if (exec ("Rend")) { // NOI18N
                return (javax.swing.ListCellRenderer)TALK.get ();
            } else {
                return new javax.swing.DefaultListCellRenderer ();
            }
        } 
        finally {
            TALK.set(null);
        }                    
    }
    
    /** Invoke an indexed customizer. */
    static void showIndexedCustomizer(Index idx) {
        try {
            TALK.set(idx);
            if (! exec("IndexC")) { // NOI18N
                // Fallback to simple method.
                final IndexedCustomizer ic = new IndexedCustomizer();
                ic.setObject(idx);
                ic.setImmediateReorder(false);
                Mutex.EVENT.readAccess(new Mutex.Action() {
                    public Object run() {
                        ic.show();
                        return null;
                    }
                });
            }
        } 
        finally {
            TALK.set(null);
        }        
            
    }

    /** Executes algorithm of given name. 
     * @param name the name of algorithm
     * @return true iff successfule
     */
    private static boolean exec (String name) {
        Object  obj = algorithms.get (name);
        
        if (obj == null) {
            try {
                Class c = Class.forName ("org.openide.nodes.TMUtil$" + name); // NOI18N
                obj = c.newInstance ();
            } catch (ClassNotFoundException ex) {
                obj = ex;
                NodeOp.exception (ex);
            } catch (InstantiationException ex) {
                // that is ok, we should not be able to create an
                // instance if some classes are missing
                obj = ex;
            } catch (IllegalAccessException ex) {
                obj = ex;
                NodeOp.exception (ex);
            } catch (NoClassDefFoundError ex) {
                // that is ok, some classes need not be found
                obj = ex;
            }

            algorithms.put (name, obj);
        }

        try {
            if (obj instanceof Runnable) {
                ((Runnable)obj).run ();
                return true;
            } 
        } catch (NoClassDefFoundError ex) {
            // in case of late linking the error can be thrown
            // just when the runnable is executed
            algorithms.put (name, ex);
        }
        return false;
    }
    
    /** Creates instance of InstanceCookie for given object.
     * ARGUMENT contains the bean to create instance for.
     */
    static final class Bean 
    implements Runnable, org.openide.cookies.InstanceCookie {
        private Object bean;
        
        public void run () {
            Bean n = new Bean ();
            n.bean = TALK.get ();
            TALK.set (n);
        }
        
        public String instanceName() {
            return bean.getClass ().getName ();
        }
        
        public Class instanceClass() {
            return bean.getClass ();
        }
        
        public Object instanceCreate() {
            return bean;
        }
    }
    
    /** Creates dialog from DialogDescriptor
     * ARGUMENT contains the descriptor.
     */
    static final class Dial implements Runnable {
        public void run () {
            Object obj = TALK.get ();
            if (obj instanceof org.openide.DialogDescriptor) {
                TALK.set (org.openide.DialogDisplayer.getDefault ().createDialog(
                    (org.openide.DialogDescriptor)obj
                ));
            } else {
                TALK.set (null);
            }
        }
    }
    
    /** Attaches the node to a customizer if it implements NodeCustomizer.
     * ARGUMENT contains array of node and customizer
     */
    static final class Cust implements Runnable {
        private static Class nodeCustomizer;
        private static java.lang.reflect.Method attach;
        public void run () {
            try {
                if (nodeCustomizer == null) {
                    // load method
                    nodeCustomizer = loadClass ("org.openide.explorer.propertysheet.editors.NodeCustomizer"); // NOI18N
                    attach = nodeCustomizer.getMethod ("attach", new Class[] { Node.class }); // NOI18N
                }

                Object[] arr = (Object[])TALK.get ();

                Node n = (Node)arr[0];
                Object cust = arr[1];

                if (nodeCustomizer.isInstance(cust)) {
                    // ((org.openide.explorer.propertysheet.editors.NodeCustomizer)cust).attach (n);
                    attach.invoke(cust, new Object[] { n });
                }
            } catch (Exception ex) {
                throw new IllegalStateException (ex.getMessage());
            }
        }
    }
    
    /** Finds the main window.
     */
    static final class Win implements Runnable {
        private static java.lang.reflect.Method getDefault;
        private static java.lang.reflect.Method getMainWindow;
        public void run () {
            try {
                if (getDefault == null) {
                    // load all methods
                    Class wm = loadClass ("org.openide.windows.WindowManager"); // NOI18N
                    getDefault = wm.getMethod ("getDefault", new Class[0]); // NOI18N
                    getMainWindow = wm.getMethod ("getMainWindow", new Class[0]); // NOI18N
                }
                
                //
                // call: WindowManager.getDefault().getMainWindow ()
                //
                Object[] param = new Object[0];
                TALK.set (
                    getMainWindow.invoke (
                        getDefault.invoke (null, param), param
                    )
                );
            } catch (Exception ex) {
                throw new IllegalStateException (ex.getMessage());
            }
        }
    }
    
    /** Finds renderer.
     */
    static final class Rend implements Runnable {
        private static Class nodeRenderer;
        public void run () {
            try {
                if (nodeRenderer == null) {
                    nodeRenderer = loadClass ("org.openide.explorer.view.NodeRenderer"); // NOI18N
                }
                TALK.set (nodeRenderer.newInstance());
            } catch (Exception ex) {
                throw new IllegalStateException (ex.getMessage ());
            }
        }
    }
    
    static final class IndexC implements Runnable {
        public void run() {
            Index idx = (Index)TALK.get();
            java.awt.Container p = new javax.swing.JPanel();
            IndexedCustomizer ic = new IndexedCustomizer(p, false);
            ic.setObject(idx);
            ic.setImmediateReorder(false);
            org.openide.DialogDescriptor dd = new org.openide.DialogDescriptor(p, Node.getString("LAB_order"));
            dd.setModal(true);
            dd.setOptionType(org.openide.DialogDescriptor.DEFAULT_OPTION);
            Object result = org.openide.DialogDisplayer.getDefault().notify(dd);
            if (result == org.openide.DialogDescriptor.OK_OPTION) {
                ic.doClose();
            }
        }
    }
    
}
... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.