001 /*
002 * Copyright 1997-2003 Sun Microsystems, Inc. All Rights Reserved.
003 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
004 *
005 * This code is free software; you can redistribute it and/or modify it
006 * under the terms of the GNU General Public License version 2 only, as
007 * published by the Free Software Foundation. Sun designates this
008 * particular file as subject to the "Classpath" exception as provided
009 * by Sun in the LICENSE file that accompanied this code.
010 *
011 * This code is distributed in the hope that it will be useful, but WITHOUT
012 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
013 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
014 * version 2 for more details (a copy is included in the LICENSE file that
015 * accompanied this code).
016 *
017 * You should have received a copy of the GNU General Public License version
018 * 2 along with this work; if not, write to the Free Software Foundation,
019 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
020 *
021 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
022 * CA 95054 USA or visit www.sun.com if you need additional information or
023 * have any questions.
024 */
025 package javax.swing;
026
027 import java.awt.Component;
028 import java.awt.Container;
029 import java.awt.FocusTraversalPolicy;
030 import java.util.Comparator;
031
032 /**
033 * This class has been obsoleted by the 1.4 focus APIs. While client code may
034 * still use this class, developers are strongly encouraged to use
035 * <code>java.awt.KeyboardFocusManager</code> and
036 * <code>java.awt.DefaultKeyboardFocusManager</code> instead.
037 * <p>
038 * Please see
039 * <a href="http://java.sun.com/docs/books/tutorial/uiswing/misc/focus.html">
040 * How to Use the Focus Subsystem</a>,
041 * a section in <em>The Java Tutorial</em>, and the
042 * <a href="../../java/awt/doc-files/FocusSpec.html">Focus Specification</a>
043 * for more information.
044 *
045 * @version 1.36, 05/05/07
046 * @author Arnaud Weber
047 * @author David Mendenhall
048 */
049 public class DefaultFocusManager extends FocusManager {
050
051 final FocusTraversalPolicy gluePolicy = new LegacyGlueFocusTraversalPolicy(
052 this );
053 private final FocusTraversalPolicy layoutPolicy = new LegacyLayoutFocusTraversalPolicy(
054 this );
055 private final LayoutComparator comparator = new LayoutComparator();
056
057 public DefaultFocusManager() {
058 setDefaultFocusTraversalPolicy(gluePolicy);
059 }
060
061 public Component getComponentAfter(Container aContainer,
062 Component aComponent) {
063 Container root = (aContainer.isFocusCycleRoot()) ? aContainer
064 : aContainer.getFocusCycleRootAncestor();
065
066 // Support for mixed 1.4/pre-1.4 focus APIs. If a particular root's
067 // traversal policy is non-legacy, then honor it.
068 if (root != null) {
069 FocusTraversalPolicy policy = root
070 .getFocusTraversalPolicy();
071 if (policy != gluePolicy) {
072 return policy.getComponentAfter(root, aComponent);
073 }
074
075 comparator.setComponentOrientation(root
076 .getComponentOrientation());
077 return layoutPolicy.getComponentAfter(root, aComponent);
078 }
079
080 return null;
081 }
082
083 public Component getComponentBefore(Container aContainer,
084 Component aComponent) {
085 Container root = (aContainer.isFocusCycleRoot()) ? aContainer
086 : aContainer.getFocusCycleRootAncestor();
087
088 // Support for mixed 1.4/pre-1.4 focus APIs. If a particular root's
089 // traversal policy is non-legacy, then honor it.
090 if (root != null) {
091 FocusTraversalPolicy policy = root
092 .getFocusTraversalPolicy();
093 if (policy != gluePolicy) {
094 return policy.getComponentBefore(root, aComponent);
095 }
096
097 comparator.setComponentOrientation(root
098 .getComponentOrientation());
099 return layoutPolicy.getComponentBefore(root, aComponent);
100 }
101
102 return null;
103 }
104
105 public Component getFirstComponent(Container aContainer) {
106 Container root = (aContainer.isFocusCycleRoot()) ? aContainer
107 : aContainer.getFocusCycleRootAncestor();
108
109 // Support for mixed 1.4/pre-1.4 focus APIs. If a particular root's
110 // traversal policy is non-legacy, then honor it.
111 if (root != null) {
112 FocusTraversalPolicy policy = root
113 .getFocusTraversalPolicy();
114 if (policy != gluePolicy) {
115 return policy.getFirstComponent(root);
116 }
117
118 comparator.setComponentOrientation(root
119 .getComponentOrientation());
120 return layoutPolicy.getFirstComponent(root);
121 }
122
123 return null;
124 }
125
126 public Component getLastComponent(Container aContainer) {
127 Container root = (aContainer.isFocusCycleRoot()) ? aContainer
128 : aContainer.getFocusCycleRootAncestor();
129
130 // Support for mixed 1.4/pre-1.4 focus APIs. If a particular root's
131 // traversal policy is non-legacy, then honor it.
132 if (root != null) {
133 FocusTraversalPolicy policy = root
134 .getFocusTraversalPolicy();
135 if (policy != gluePolicy) {
136 return policy.getLastComponent(root);
137 }
138
139 comparator.setComponentOrientation(root
140 .getComponentOrientation());
141 return layoutPolicy.getLastComponent(root);
142 }
143
144 return null;
145 }
146
147 public boolean compareTabOrder(Component a, Component b) {
148 return (comparator.compare(a, b) < 0);
149 }
150 }
151
152 final class LegacyLayoutFocusTraversalPolicy extends
153 LayoutFocusTraversalPolicy {
154 LegacyLayoutFocusTraversalPolicy(
155 DefaultFocusManager defaultFocusManager) {
156 super (new CompareTabOrderComparator(defaultFocusManager));
157 }
158 }
159
160 final class CompareTabOrderComparator implements Comparator {
161 private final DefaultFocusManager defaultFocusManager;
162
163 CompareTabOrderComparator(DefaultFocusManager defaultFocusManager) {
164 this .defaultFocusManager = defaultFocusManager;
165 }
166
167 public int compare(Object o1, Object o2) {
168 if (o1 == o2) {
169 return 0;
170 }
171 return (defaultFocusManager.compareTabOrder((Component) o1,
172 (Component) o2)) ? -1 : 1;
173 }
174 }
|