001: /*
002: *
003: * Copyright 1990-2006 Sun Microsystems, Inc. All Rights Reserved.
004: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
005: *
006: * This program is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU General Public License version
008: * 2 only, as published by the Free Software Foundation.
009: *
010: * This program is distributed in the hope that it will be useful, but
011: * WITHOUT ANY WARRANTY; without even the implied warranty of
012: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
013: * General Public License version 2 for more details (a copy is
014: * included at /legal/license.txt).
015: *
016: * You should have received a copy of the GNU General Public License
017: * version 2 along with this work; if not, write to the Free Software
018: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
019: * 02110-1301 USA
020: *
021: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
022: * Clara, CA 95054 or visit www.sun.com if you need additional
023: * information or have any questions.
024: */
025: package java.awt;
026:
027: /**
028: * A FocusTraversalPolicy that determines traversal order based on the order
029: * of child Components in a Container. From a particular focus cycle root, the
030: * policy makes a pre-order traversal of the Component hierarchy, and traverses
031: * a Container's children according to the ordering of the array returned by
032: * <code>Container.getComponents()</code>. Portions of the hierarchy that are
033: * not visible and displayable will not be searched.
034: * <p>
035: * If client code has explicitly set the focusability of a Component by either
036: * overriding <code>Component.isFocusTraversable()</code> or
037: * <code>Component.isFocusable()</code>, or by calling
038: * <code>Component.setFocusable()</code>, then a DefaultFocusTraversalPolicy
039: * behaves exactly like a ContainerOrderFocusTraversalPolicy. If, however, the
040: * Component is relying on default focusability, then a
041: * DefaultFocusTraversalPolicy will reject all Components with non-focusable
042: * peers. This is the default FocusTraversalPolicy for all AWT Containers.
043: * <p>
044: * The focusability of a peer is implementation-dependent. Sun recommends that
045: * all implementations for a particular native platform construct peers with
046: * the same focusability. The recommendations for Windows and Unix are that
047: * Canvases, Labels, Panels, Scrollbars, ScrollPanes, Windows, and lightweight
048: * Components have non-focusable peers, and all other Components have focusable
049: * peers. These recommendations are used in the Sun AWT implementations. Note
050: * that the focusability of a Component's peer is different from, and does not
051: * impact, the focusability of the Component itself.
052: *
053: * @author David Mendenhall
054: * @version 1.3, 01/23/03
055: *
056: * @see Container#getComponents
057: * @see Component#isFocusable
058: * @see Component#setFocusable
059: * @since 1.4
060: */
061: public class DefaultFocusTraversalPolicy extends
062: ContainerOrderFocusTraversalPolicy {
063: /**
064: * Determines whether a Component is an acceptable choice as the new
065: * focus owner. The Component must be visible, displayable, and enabled
066: * to be accepted. If client code has explicitly set the focusability
067: * of the Component by either overriding
068: * <code>Component.isFocusTraversable()</code> or
069: * <code>Component.isFocusable()</code>, or by calling
070: * <code>Component.setFocusable()</code>, then the Component will be
071: * accepted if and only if it is focusable. If, however, the Component is
072: * relying on default focusability, then all Canvases, Labels, Panels,
073: * Scrollbars, ScrollPanes, Windows, and lightweight Components will be
074: * rejected.
075: *
076: * @param aComponent the Component whose fitness as a focus owner is to
077: * be tested
078: * @return <code>true</code> if aComponent meets the above requirements;
079: * <code>false</code> otherwise
080: */
081: protected boolean accept(Component aComponent) {
082: if (!(aComponent.isVisible() && aComponent.isDisplayable() && aComponent
083: .isEnabled())) {
084: return false;
085: }
086: // Verify that the Component is recursively enabled. Disabling a
087: // heavyweight Container disables its children, whereas disabling
088: // a lightweight Container does not.
089: if (!(aComponent instanceof Window)) {
090: for (Container enableTest = aComponent.getParent(); enableTest != null; enableTest = enableTest
091: .getParent()) {
092: if (!(enableTest.isEnabled() || enableTest
093: .isLightweight())) {
094: return false;
095: }
096: if (enableTest instanceof Window) {
097: break;
098: }
099: }
100: }
101: boolean focusable = aComponent.isFocusable();
102: if (aComponent.isFocusTraversableOverridden()) {
103: return focusable;
104: }
105: sun.awt.peer.ComponentPeer peer = aComponent.peer;
106: return (peer != null && peer.isFocusTraversable());
107: }
108: }
|