View Javadoc
1   package com.swtdesigner;
2   
3   import java.awt.Component;
4   import java.awt.Container;
5   import java.awt.FocusTraversalPolicy;
6   
7   /**
8    * Cyclic focus traversal policy based on array of components.
9    * 
10   * This class may be freely distributed as part of any application or plugin.
11   * <p>
12   * 
13   * @author scheglov_ke
14   */
15  public class FocusTraversalOnArray extends FocusTraversalPolicy {
16      private final Component m_Components[];
17  
18      ////////////////////////////////////////////////////////////////////////////
19      //
20      // Constructor
21      //
22      ////////////////////////////////////////////////////////////////////////////
23      public FocusTraversalOnArray(Component components[]) {
24          m_Components = components;
25      }
26  
27      ////////////////////////////////////////////////////////////////////////////
28      //
29      // Utilities
30      //
31      ////////////////////////////////////////////////////////////////////////////
32      private int indexCycle(int index, int delta) {
33          int size = m_Components.length;
34          int next = (index + delta + size) % size;
35          return next;
36      }
37  
38      private Component cycle(Component currentComponent, int delta) {
39          int index = -1;
40          loop: for (int i = 0; i < m_Components.length; i++) {
41              Component component = m_Components[i];
42              for (Component c = currentComponent; c != null; c = c.getParent()) {
43                  if (component == c) {
44                      index = i;
45                      break loop;
46                  }
47              }
48          }
49          // try to find enabled component in "delta" direction
50          int initialIndex = index;
51          while (true) {
52              int newIndex = indexCycle(index, delta);
53              if (newIndex == initialIndex) {
54                  break;
55              }
56              index = newIndex;
57              //
58              Component component = m_Components[newIndex];
59              if (component.isEnabled()) {
60                  return component;
61              }
62          }
63          // not found
64          return currentComponent;
65      }
66  
67      ////////////////////////////////////////////////////////////////////////////
68      //
69      // FocusTraversalPolicy
70      //
71      ////////////////////////////////////////////////////////////////////////////
72      public Component getComponentAfter(Container container, Component component) {
73          return cycle(component, 1);
74      }
75  
76      public Component getComponentBefore(Container container, Component component) {
77          return cycle(component, -1);
78      }
79  
80      public Component firstComponent(Container container) {
81          return m_Components[0];
82      }
83  
84      public Component getLastComponent(Container container) {
85          return m_Components[m_Components.length - 1];
86      }
87  
88      public Component getDefaultComponent(Container container) {
89          return firstComponent(container);
90      }
91  
92      @Override
93      public Component getFirstComponent(Container aContainer) {
94          return firstComponent(aContainer);
95      }
96  }