package javacodebook.gui.focustraversal;

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

/**
 * @author Benjamin Rusch
 * 
 * In diesem Frame befinden sich drei Textfelder und ein Button. Die Reihenfolge 
 * in der sie den Focus bekommen, wird in einer extra Klasse gehalten. Drückt man 
 * den Button ändert sich die Reihenfolge.
 */

public class FocusTraversalFrame  extends Frame {
	
	private TextField field1 = new TextField(15);
	private TextField field2 = new TextField(15);
	private TextField field3 = new TextField(15);
	private Button changeOrder = new Button("Richtung ändern");
	
	// Wird in unserem Beispiel benötigt, um die Focusreihenfolge zu definieren
	private Component[] order = new Component[4];
	// Da der Button die Focusreihenfolge immer umkehrt, muss der Status gespeichert
	// werden
	private boolean reverse = false;
	
	// kapselt Information über die Reihenfolge
	private FocusTraversalDefinition ftd = null;
	
	/**
 	* Konstruktor von FocusTraversalFrame.  
 	*/	
	public FocusTraversalFrame(String title) {
		super(title);
		this.setLayout(new FlowLayout());
		
		// Beim Klicken des Schließen-Buttons vom HauptFenster
		// wird das Programm beendet.
		this.addWindowListener(new WindowAdapter() {
		    public void windowClosing(WindowEvent we) {
				System.exit(0);
		    }
		});
		
		// Platzieren der Komponenten
		this.add(field1);
		this.add(field2);
		this.add(field3);
		this.add(changeOrder);
		
		// Listener wird am Button angemeldet. Jedesmal wenn geklickt wird, wird
		// der Komponenten-Array in entgegengesetzter Reihenfolge bestückt, und der
		// FocusTraversalPolicy übergeben.
		changeOrder.addActionListener(new ActionListener(){
					public void actionPerformed(ActionEvent ae){
						if(!reverse) {
							order[0] = changeOrder;
							order[1] = field3;
							order[2] = field2;
							order[3] = field1;
							ftd.setOrder(order);
							reverse=true;
						}
						else {
							ftd.setOrder(getInitialOrder());
							reverse=false;
						}
						
					}
				});
		
		
		// Hier wird die FocusTraversalPolicy mit vorgegebener Reihenfolge erstellt,
		// und ans Frame angemeldet.
		ftd = new FocusTraversalDefinition(getInitialOrder());
		this.setFocusTraversalPolicy(ftd);				
	}
	
	/**
	 * liefert einen Komponenten-Array, in dem die Komponenten sich in der anfänglichen
	 * Focus-Reihenfolge befinden.
	 */
	private Component[] getInitialOrder() {
		order[0] = field1;
		order[1] = field2;
		order[2] = field3;
		order[3] = changeOrder;
		return order; 
	}

}