1. /*
  2. * @(#)DefaultFocusManager.java 1.29 03/12/19
  3. *
  4. * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
  5. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
  6. */
  7. package javax.swing;
  8. import java.awt.Component;
  9. import java.awt.Container;
  10. import java.awt.FocusTraversalPolicy;
  11. import java.util.Comparator;
  12. /**
  13. * This class has been obsoleted by the 1.4 focus APIs. While client code may
  14. * still use this class, developers are strongly encouraged to use
  15. * <code>java.awt.KeyboardFocusManager</code> and
  16. * <code>java.awt.DefaultKeyboardFocusManager</code> instead.
  17. * <p>
  18. * Please see
  19. * <a href="http://java.sun.com/docs/books/tutorial/uiswing/misc/focus.html">
  20. * How to Use the Focus Subsystem</a>,
  21. * a section in <em>The Java Tutorial</em>, and the
  22. * <a href="../../java/awt/doc-files/FocusSpec.html">Focus Specification</a>
  23. * for more information.
  24. *
  25. * @version 1.29, 12/19/03
  26. * @author Arnaud Weber
  27. * @author David Mendenhall
  28. */
  29. public class DefaultFocusManager extends FocusManager {
  30. final FocusTraversalPolicy gluePolicy =
  31. new LegacyGlueFocusTraversalPolicy(this);
  32. private final FocusTraversalPolicy layoutPolicy =
  33. new LegacyLayoutFocusTraversalPolicy(this);
  34. private final LayoutComparator comparator =
  35. new LayoutComparator();
  36. public DefaultFocusManager() {
  37. setDefaultFocusTraversalPolicy(gluePolicy);
  38. }
  39. public Component getComponentAfter(Container aContainer,
  40. Component aComponent)
  41. {
  42. Container root = (aContainer.isFocusCycleRoot())
  43. ? aContainer
  44. : aContainer.getFocusCycleRootAncestor();
  45. // Support for mixed 1.4/pre-1.4 focus APIs. If a particular root's
  46. // traversal policy is non-legacy, then honor it.
  47. if (root != null) {
  48. FocusTraversalPolicy policy = root.getFocusTraversalPolicy();
  49. if (policy != gluePolicy) {
  50. return policy.getComponentAfter(root, aComponent);
  51. }
  52. comparator.setComponentOrientation(root.getComponentOrientation());
  53. return layoutPolicy.getComponentAfter(root, aComponent);
  54. }
  55. return null;
  56. }
  57. public Component getComponentBefore(Container aContainer,
  58. Component aComponent)
  59. {
  60. Container root = (aContainer.isFocusCycleRoot())
  61. ? aContainer
  62. : aContainer.getFocusCycleRootAncestor();
  63. // Support for mixed 1.4/pre-1.4 focus APIs. If a particular root's
  64. // traversal policy is non-legacy, then honor it.
  65. if (root != null) {
  66. FocusTraversalPolicy policy = root.getFocusTraversalPolicy();
  67. if (policy != gluePolicy) {
  68. return policy.getComponentBefore(root, aComponent);
  69. }
  70. comparator.setComponentOrientation(root.getComponentOrientation());
  71. return layoutPolicy.getComponentBefore(root, aComponent);
  72. }
  73. return null;
  74. }
  75. public Component getFirstComponent(Container aContainer) {
  76. Container root = (aContainer.isFocusCycleRoot())
  77. ? aContainer
  78. : aContainer.getFocusCycleRootAncestor();
  79. // Support for mixed 1.4/pre-1.4 focus APIs. If a particular root's
  80. // traversal policy is non-legacy, then honor it.
  81. if (root != null) {
  82. FocusTraversalPolicy policy = root.getFocusTraversalPolicy();
  83. if (policy != gluePolicy) {
  84. return policy.getFirstComponent(root);
  85. }
  86. comparator.setComponentOrientation(root.getComponentOrientation());
  87. return layoutPolicy.getFirstComponent(root);
  88. }
  89. return null;
  90. }
  91. public Component getLastComponent(Container aContainer) {
  92. Container root = (aContainer.isFocusCycleRoot())
  93. ? aContainer
  94. : aContainer.getFocusCycleRootAncestor();
  95. // Support for mixed 1.4/pre-1.4 focus APIs. If a particular root's
  96. // traversal policy is non-legacy, then honor it.
  97. if (root != null) {
  98. FocusTraversalPolicy policy = root.getFocusTraversalPolicy();
  99. if (policy != gluePolicy) {
  100. return policy.getLastComponent(root);
  101. }
  102. comparator.setComponentOrientation(root.getComponentOrientation());
  103. return layoutPolicy.getLastComponent(root);
  104. }
  105. return null;
  106. }
  107. public boolean compareTabOrder(Component a, Component b) {
  108. return (comparator.compare(a, b) < 0);
  109. }
  110. }
  111. final class LegacyLayoutFocusTraversalPolicy
  112. extends LayoutFocusTraversalPolicy
  113. {
  114. LegacyLayoutFocusTraversalPolicy(DefaultFocusManager defaultFocusManager) {
  115. super(new CompareTabOrderComparator(defaultFocusManager));
  116. }
  117. }
  118. final class CompareTabOrderComparator implements Comparator {
  119. private final DefaultFocusManager defaultFocusManager;
  120. CompareTabOrderComparator(DefaultFocusManager defaultFocusManager) {
  121. this.defaultFocusManager = defaultFocusManager;
  122. }
  123. public int compare(Object o1, Object o2) {
  124. if (o1 == o2) {
  125. return 0;
  126. }
  127. return (defaultFocusManager.compareTabOrder((Component)o1,
  128. (Component)o2)) ? -1 : 1;
  129. }
  130. }