package javacodebook.gui.focustraversal;

import java.awt.*;
import java.util.*;

/**
 * @author benjamin_rusch
 *
 * Diese Klasse kapselt die FocusReihenfolge eines beliebigen Containers. Ein Objekt 
 * dieser Klasse muss über setFocusTraversalPolicy() an dem Container angemeldet 
 * werden. Die Reihenfolge wird über einen Array von Komponenten definiert, der im 
 * Konstruktor, oder über setOrder() gesetzt werden kann.
 */
public class FocusTraversalDefinition  extends ContainerOrderFocusTraversalPolicy
{
	/**
	* Array der alle focusierbaren Komponenten in der vorgesehenen
	* Reihenfolge beinhaltet
	*/
	private Component[] componentsInOrder = null;
	
	/**
	* Positionsnummer der focussierten Komponenten
	*/
	private int position = 0;

	/**
	* Konstruktor von FocusTraversalDefinition, Komponenten in der vorgesehenen 
	* Reihenfolge werden übergeben.
	*/
	public FocusTraversalDefinition(Component[] componentsInOrder)
	{
		this.setOrder(componentsInOrder);
	}

	/**
	* Reihenfolge kann neu gesetzt werden.
	*/
	public void setOrder(Component[] componentsInOrder) 
	{
		this.componentsInOrder = componentsInOrder;
	}

	/**
	* Methode aus FocusTraversalPolicy, wird hier überschrieben, sie
	* gibt immer die nächste Komponente in der Focusreihenfolge aus. 
	*/
	public Component getComponentAfter(Container focusCycleRoot,
                               Component aComponent) {
		if ((position+1)==componentsInOrder.length) {
	   		position=0;
	   	}
		else {
			position++;
		}					
		return componentsInOrder[position];
	}

	/**
	* Methode aus FocusTraversalPolicy, wird hier überschrieben, und gibt immer
	* in der Focusreihenfolge, die vorherige Komponente an. 
	*/
	public Component getComponentBefore(Container focusCycleRoot,
                                Component aComponent) {
	   	if (position==0) {
	   		position=(componentsInOrder.length)-1;
	   	}
		else {
			position--;
		}					
		return componentsInOrder[position];
	}
	
	/**
	* Methode aus FocusTraversalPolicy, wird hier überschrieben, und gibt die erste
	* Komponente an, die im Focus steht.  
	*/
	public Component getFirstComponent(Container focusCycleRoot) {
	   	return componentsInOrder[0];
	}
}
