/*
 * @(#)FocusManager.java	1.28 04/05/18
 *
 * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
 * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */
package javax.swing;
import java.awt.*;
/**
 * This class has been obsoleted by the 1.4 focus APIs. While client code may
 * still use this class, developers are strongly encouraged to use
 * java.awt.KeyboardFocusManager and
 * java.awt.DefaultKeyboardFocusManager instead.
 * 
 * Please see
 * 
 * How to Use the Focus Subsystem,
 * a section in The Java Tutorial, and the
 * Focus Specification
 * for more information.
 *
 * @see Focus Specification
 *
 * @version 1.28, 05/18/04
 * @author Arnaud Weber
 * @author David Mendenhall
 */
public abstract class FocusManager extends DefaultKeyboardFocusManager {
    /**
     * This field is obsolete, and its use is discouraged since its
     * specification is incompatible with the 1.4 focus APIs.
     * The current FocusManager is no longer a property of the UI.
     * Client code must query for the current FocusManager using
     * KeyboardFocusManager.getCurrentKeyboardFocusManager().
     * See the Focus Specification for more information.
     *
     * @see java.awt.KeyboardFocusManager#getCurrentKeyboardFocusManager
     * @see Focus Specification
     */
    public static final String FOCUS_MANAGER_CLASS_PROPERTY = 
        "FocusManagerClassName";
    private static boolean enabled = true;
    /**
     * Returns the current KeyboardFocusManager instance
     * for the calling thread's context.
     *
     * @return this thread's context's KeyboardFocusManager
     * @see #setCurrentManager
     */
    public static FocusManager getCurrentManager() {
	KeyboardFocusManager manager =
	    KeyboardFocusManager.getCurrentKeyboardFocusManager();
	if (manager instanceof FocusManager) {
	    return (FocusManager)manager;
	} else {
	    return new DelegatingDefaultFocusManager(manager);
	}
    }
    /**
     * Sets the current KeyboardFocusManager instance
     * for the calling thread's context. If null is
     * specified, then the current KeyboardFocusManager
     * is replaced with a new instance of
     * DefaultKeyboardFocusManager.
     * 
     * If a SecurityManager is installed,
     * the calling thread must be granted the AWTPermission
     * "replaceKeyboardFocusManager" in order to replace the
     * the current KeyboardFocusManager.
     * If this permission is not granted,
     * this method will throw a SecurityException,
     * and the current KeyboardFocusManager will be unchanged.
     *
     * @param aFocusManager the new KeyboardFocusManager
     *     for this thread's context
     * @see #getCurrentManager
     * @see java.awt.DefaultKeyboardFocusManager
     * @throws SecurityException if the calling thread does not have permission
     *         to replace the current KeyboardFocusManager
     */
    public static void setCurrentManager(FocusManager aFocusManager)
        throws SecurityException
    {
	// Note: This method is not backward-compatible with 1.3 and earlier
	// releases. It now throws a SecurityException in an applet, whereas
	// in previous releases, it did not. This issue was discussed at
	// length, and ultimately approved by Hans.
        KeyboardFocusManager toSet = 
            (aFocusManager instanceof DelegatingDefaultFocusManager)
                ? ((DelegatingDefaultFocusManager)aFocusManager).getDelegate()
                : aFocusManager;
        KeyboardFocusManager.setCurrentKeyboardFocusManager(toSet);
    }
    /**
     * Changes the current KeyboardFocusManager's default
     * FocusTraversalPolicy to
     * DefaultFocusTraversalPolicy.
     *
     * @see java.awt.DefaultFocusTraversalPolicy
     * @see java.awt.KeyboardFocusManager#setDefaultFocusTraversalPolicy
     * @deprecated as of 1.4, replaced by 
     * KeyboardFocusManager.setDefaultFocusTraversalPolicy(FocusTraversalPolicy)
     */
    @Deprecated
    public static void disableSwingFocusManager() {
	if (enabled) {
	    enabled = false;
	    KeyboardFocusManager.getCurrentKeyboardFocusManager().
		setDefaultFocusTraversalPolicy(
                    new DefaultFocusTraversalPolicy());
	}
    }
    /**
     * Returns whether the application has invoked
     * disableSwingFocusManager().
     *
     * @see #disableSwingFocusManager
     * @deprecated As of 1.4, replaced by
     *   KeyboardFocusManager.getDefaultFocusTraversalPolicy()
     */
    @Deprecated
    public static boolean isFocusManagerEnabled() {
	return enabled;
    }
}