1. /*
  2. * @(#)DefaultFocusManager.java 1.27 03/01/23
  3. *
  4. * Copyright 2003 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. Please see the
  17. * Focus Specification for more information.
  18. *
  19. * @see <a href="../../java/awt/doc-files/FocusSpec.html">Focus Specification</a>
  20. *
  21. * @version 1.27, 01/23/03
  22. * @author Arnaud Weber
  23. * @author David Mendenhall
  24. */
  25. public class DefaultFocusManager extends FocusManager {
  26. final FocusTraversalPolicy gluePolicy =
  27. new LegacyGlueFocusTraversalPolicy(this);
  28. private final FocusTraversalPolicy layoutPolicy =
  29. new LegacyLayoutFocusTraversalPolicy(this);
  30. private final LayoutComparator comparator =
  31. new LayoutComparator();
  32. public DefaultFocusManager() {
  33. setDefaultFocusTraversalPolicy(gluePolicy);
  34. }
  35. public Component getComponentAfter(Container aContainer,
  36. Component aComponent)
  37. {
  38. Container root = (aContainer.isFocusCycleRoot())
  39. ? aContainer
  40. : aContainer.getFocusCycleRootAncestor();
  41. // Support for mixed 1.4/pre-1.4 focus APIs. If a particular root's
  42. // traversal policy is non-legacy, then honor it.
  43. if (root != null) {
  44. FocusTraversalPolicy policy = root.getFocusTraversalPolicy();
  45. if (policy != gluePolicy) {
  46. return policy.getComponentAfter(root, aComponent);
  47. }
  48. comparator.setComponentOrientation(root.getComponentOrientation());
  49. return layoutPolicy.getComponentAfter(root, aComponent);
  50. }
  51. return null;
  52. }
  53. public Component getComponentBefore(Container aContainer,
  54. Component aComponent)
  55. {
  56. Container root = (aContainer.isFocusCycleRoot())
  57. ? aContainer
  58. : aContainer.getFocusCycleRootAncestor();
  59. // Support for mixed 1.4/pre-1.4 focus APIs. If a particular root's
  60. // traversal policy is non-legacy, then honor it.
  61. if (root != null) {
  62. FocusTraversalPolicy policy = root.getFocusTraversalPolicy();
  63. if (policy != gluePolicy) {
  64. return policy.getComponentBefore(root, aComponent);
  65. }
  66. comparator.setComponentOrientation(root.getComponentOrientation());
  67. return layoutPolicy.getComponentBefore(root, aComponent);
  68. }
  69. return null;
  70. }
  71. public Component getFirstComponent(Container aContainer) {
  72. Container root = (aContainer.isFocusCycleRoot())
  73. ? aContainer
  74. : aContainer.getFocusCycleRootAncestor();
  75. // Support for mixed 1.4/pre-1.4 focus APIs. If a particular root's
  76. // traversal policy is non-legacy, then honor it.
  77. if (root != null) {
  78. FocusTraversalPolicy policy = root.getFocusTraversalPolicy();
  79. if (policy != gluePolicy) {
  80. return policy.getFirstComponent(root);
  81. }
  82. comparator.setComponentOrientation(root.getComponentOrientation());
  83. return layoutPolicy.getFirstComponent(root);
  84. }
  85. return null;
  86. }
  87. public Component getLastComponent(Container aContainer) {
  88. Container root = (aContainer.isFocusCycleRoot())
  89. ? aContainer
  90. : aContainer.getFocusCycleRootAncestor();
  91. // Support for mixed 1.4/pre-1.4 focus APIs. If a particular root's
  92. // traversal policy is non-legacy, then honor it.
  93. if (root != null) {
  94. FocusTraversalPolicy policy = root.getFocusTraversalPolicy();
  95. if (policy != gluePolicy) {
  96. return policy.getLastComponent(root);
  97. }
  98. comparator.setComponentOrientation(root.getComponentOrientation());
  99. return layoutPolicy.getLastComponent(root);
  100. }
  101. return null;
  102. }
  103. public boolean compareTabOrder(Component a, Component b) {
  104. return (comparator.compare(a, b) < 0);
  105. }
  106. }
  107. final class LegacyLayoutFocusTraversalPolicy
  108. extends LayoutFocusTraversalPolicy
  109. {
  110. LegacyLayoutFocusTraversalPolicy(DefaultFocusManager defaultFocusManager) {
  111. super(new CompareTabOrderComparator(defaultFocusManager));
  112. }
  113. }
  114. final class CompareTabOrderComparator implements Comparator {
  115. private final DefaultFocusManager defaultFocusManager;
  116. CompareTabOrderComparator(DefaultFocusManager defaultFocusManager) {
  117. this.defaultFocusManager = defaultFocusManager;
  118. }
  119. public int compare(Object o1, Object o2) {
  120. if (o1 == o2) {
  121. return 0;
  122. }
  123. return (defaultFocusManager.compareTabOrder((Component)o1,
  124. (Component)o2)) ? -1 : 1;
  125. }
  126. }