31 import java.util.HashMap;
32 import java.util.HashSet;
33 import java.io.*;
34
35
36 /**
37 * A FocusTraversalPolicy which provides support for legacy applications which
38 * handle focus traversal via JComponent.setNextFocusableComponent or by
39 * installing a custom DefaultFocusManager. If a specific traversal has not
40 * been hard coded, then that traversal is provided either by the custom
41 * DefaultFocusManager, or by a wrapped FocusTraversalPolicy instance.
42 *
43 * @author David Mendenhall
44 */
45 final class LegacyGlueFocusTraversalPolicy extends FocusTraversalPolicy
46 implements Serializable
47 {
48 private transient FocusTraversalPolicy delegatePolicy;
49 private transient DefaultFocusManager delegateManager;
50
51 private HashMap forwardMap = new HashMap(),
52 backwardMap = new HashMap();
53
54 LegacyGlueFocusTraversalPolicy(FocusTraversalPolicy delegatePolicy) {
55 this.delegatePolicy = delegatePolicy;
56 }
57 LegacyGlueFocusTraversalPolicy(DefaultFocusManager delegateManager) {
58 this.delegateManager = delegateManager;
59 }
60
61 void setNextFocusableComponent(Component left, Component right) {
62 forwardMap.put(left, right);
63 backwardMap.put(right, left);
64 }
65 void unsetNextFocusableComponent(Component left, Component right) {
66 forwardMap.remove(left);
67 backwardMap.remove(right);
68 }
69
70 public Component getComponentAfter(Container focusCycleRoot,
71 Component aComponent) {
72 Component hardCoded = aComponent, prevHardCoded;
73 HashSet sanity = new HashSet();
74
75 do {
76 prevHardCoded = hardCoded;
77 hardCoded = (Component)forwardMap.get(hardCoded);
78 if (hardCoded == null) {
79 if (delegatePolicy != null &&
80 prevHardCoded.isFocusCycleRoot(focusCycleRoot)) {
81 return delegatePolicy.getComponentAfter(focusCycleRoot,
82 prevHardCoded);
83 } else if (delegateManager != null) {
84 return delegateManager.
85 getComponentAfter(focusCycleRoot, aComponent);
86 } else {
87 return null;
88 }
89 }
90 if (sanity.contains(hardCoded)) {
91 // cycle detected; bail
92 return null;
93 }
94 sanity.add(hardCoded);
95 } while (!accept(hardCoded));
96
97 return hardCoded;
98 }
99 public Component getComponentBefore(Container focusCycleRoot,
100 Component aComponent) {
101 Component hardCoded = aComponent, prevHardCoded;
102 HashSet sanity = new HashSet();
103
104 do {
105 prevHardCoded = hardCoded;
106 hardCoded = (Component)backwardMap.get(hardCoded);
107 if (hardCoded == null) {
108 if (delegatePolicy != null &&
109 prevHardCoded.isFocusCycleRoot(focusCycleRoot)) {
110 return delegatePolicy.getComponentBefore(focusCycleRoot,
111 prevHardCoded);
112 } else if (delegateManager != null) {
113 return delegateManager.
114 getComponentBefore(focusCycleRoot, aComponent);
115 } else {
116 return null;
117 }
118 }
119 if (sanity.contains(hardCoded)) {
120 // cycle detected; bail
121 return null;
122 }
123 sanity.add(hardCoded);
124 } while (!accept(hardCoded));
125
126 return hardCoded;
|
31 import java.util.HashMap;
32 import java.util.HashSet;
33 import java.io.*;
34
35
36 /**
37 * A FocusTraversalPolicy which provides support for legacy applications which
38 * handle focus traversal via JComponent.setNextFocusableComponent or by
39 * installing a custom DefaultFocusManager. If a specific traversal has not
40 * been hard coded, then that traversal is provided either by the custom
41 * DefaultFocusManager, or by a wrapped FocusTraversalPolicy instance.
42 *
43 * @author David Mendenhall
44 */
45 final class LegacyGlueFocusTraversalPolicy extends FocusTraversalPolicy
46 implements Serializable
47 {
48 private transient FocusTraversalPolicy delegatePolicy;
49 private transient DefaultFocusManager delegateManager;
50
51 private HashMap<Component, Component> forwardMap = new HashMap<Component, Component>(),
52 backwardMap = new HashMap<Component, Component>();
53
54 LegacyGlueFocusTraversalPolicy(FocusTraversalPolicy delegatePolicy) {
55 this.delegatePolicy = delegatePolicy;
56 }
57 LegacyGlueFocusTraversalPolicy(DefaultFocusManager delegateManager) {
58 this.delegateManager = delegateManager;
59 }
60
61 void setNextFocusableComponent(Component left, Component right) {
62 forwardMap.put(left, right);
63 backwardMap.put(right, left);
64 }
65 void unsetNextFocusableComponent(Component left, Component right) {
66 forwardMap.remove(left);
67 backwardMap.remove(right);
68 }
69
70 public Component getComponentAfter(Container focusCycleRoot,
71 Component aComponent) {
72 Component hardCoded = aComponent, prevHardCoded;
73 HashSet<Component> sanity = new HashSet<Component>();
74
75 do {
76 prevHardCoded = hardCoded;
77 hardCoded = forwardMap.get(hardCoded);
78 if (hardCoded == null) {
79 if (delegatePolicy != null &&
80 prevHardCoded.isFocusCycleRoot(focusCycleRoot)) {
81 return delegatePolicy.getComponentAfter(focusCycleRoot,
82 prevHardCoded);
83 } else if (delegateManager != null) {
84 return delegateManager.
85 getComponentAfter(focusCycleRoot, aComponent);
86 } else {
87 return null;
88 }
89 }
90 if (sanity.contains(hardCoded)) {
91 // cycle detected; bail
92 return null;
93 }
94 sanity.add(hardCoded);
95 } while (!accept(hardCoded));
96
97 return hardCoded;
98 }
99 public Component getComponentBefore(Container focusCycleRoot,
100 Component aComponent) {
101 Component hardCoded = aComponent, prevHardCoded;
102 HashSet<Component> sanity = new HashSet<Component>();
103
104 do {
105 prevHardCoded = hardCoded;
106 hardCoded = backwardMap.get(hardCoded);
107 if (hardCoded == null) {
108 if (delegatePolicy != null &&
109 prevHardCoded.isFocusCycleRoot(focusCycleRoot)) {
110 return delegatePolicy.getComponentBefore(focusCycleRoot,
111 prevHardCoded);
112 } else if (delegateManager != null) {
113 return delegateManager.
114 getComponentBefore(focusCycleRoot, aComponent);
115 } else {
116 return null;
117 }
118 }
119 if (sanity.contains(hardCoded)) {
120 // cycle detected; bail
121 return null;
122 }
123 sanity.add(hardCoded);
124 } while (!accept(hardCoded));
125
126 return hardCoded;
|