1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- /*******************************************************************************
- * Copyright (c) 2011 Google, Inc.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Google, Inc. - initial API and implementation
- *******************************************************************************/
- package org.eclipse.wb.swing;
- import java.awt.Component;
- import java.awt.Container;
- import java.awt.FocusTraversalPolicy;
- /**
- * Cyclic focus traversal policy based on array of components.
- * <p>
- * This class may be freely distributed as part of any application or plugin.
- *
- * @author scheglov_ke
- */
- public class FocusTraversalOnArray extends FocusTraversalPolicy {
- private final Component m_Components[];
- ////////////////////////////////////////////////////////////////////////////
- //
- // Constructor
- //
- ////////////////////////////////////////////////////////////////////////////
- public FocusTraversalOnArray(Component components[]) {
- m_Components = components;
- }
- ////////////////////////////////////////////////////////////////////////////
- //
- // Utilities
- //
- ////////////////////////////////////////////////////////////////////////////
- private int indexCycle(int index, int delta) {
- int size = m_Components.length;
- int next = (index + delta + size) % size;
- return next;
- }
- private Component cycle(Component currentComponent, int delta) {
- int index = -1;
- loop : for (int i = 0; i < m_Components.length; i++) {
- Component component = m_Components[i];
- for (Component c = currentComponent; c != null; c = c.getParent()) {
- if (component == c) {
- index = i;
- break loop;
- }
- }
- }
- // try to find enabled component in "delta" direction
- int initialIndex = index;
- while (true) {
- int newIndex = indexCycle(index, delta);
- if (newIndex == initialIndex) {
- break;
- }
- index = newIndex;
- //
- Component component = m_Components[newIndex];
- if (component.isEnabled() && component.isVisible() && component.isFocusable()) {
- return component;
- }
- }
- // not found
- return currentComponent;
- }
- ////////////////////////////////////////////////////////////////////////////
- //
- // FocusTraversalPolicy
- //
- ////////////////////////////////////////////////////////////////////////////
- public Component getComponentAfter(Container container, Component component) {
- return cycle(component, 1);
- }
- public Component getComponentBefore(Container container, Component component) {
- return cycle(component, -1);
- }
- public Component getFirstComponent(Container container) {
- return m_Components[0];
- }
- public Component getLastComponent(Container container) {
- return m_Components[m_Components.length - 1];
- }
- public Component getDefaultComponent(Container container) {
- return getFirstComponent(container);
- }
- }
|