package javacodebook.gui.keystroke;

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

/**
 * @author Benjamin Rusch
 * 
 * Die einzelnen Buttons können über CTRL + A für "Hinzufügen" und CTRL + D 
 * für "Löschen" aufgerufen werden. Ist einer der Buttons im Focus, 
 * funktioniert das Auslösen auch über ENTER.
 */

public class KeyStrokes  extends Frame {
	
	private Button addButton = new Button("Hinzufügen");
	private Button deleteButton = new Button("Löschen");
	private TextField field = new TextField(15);
	private Panel north = new Panel(); 
	private TextArea editor = new TextArea(9,20);
	
	/**
 	* Konstruktor von KeyStrokes.  
 	*/	
	public KeyStrokes(String title) {
		
		super(title);

		// Focus wird beim Programmstart aufs Textfeld gesetzt, und beim Fenster-
		// Schließen wird Programm beendet
		addWindowListener(new WindowAdapter() {
            public void windowOpened(WindowEvent e) {
                field.requestFocus(); // Focus wird gesetzt
            }
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
		
		// Anmelden eines ActionListeners an den addButton
		addButton.addActionListener(new ActionListener(){
					public void actionPerformed(ActionEvent ae){
						copyText(); 
					}
				});
		
		// Anmelden eines ActionListeners an den deleteButton		
		deleteButton.addActionListener(new ActionListener(){
					public void actionPerformed(ActionEvent ae){
						deleteText();
					}
				});
		
		// Wenn der addButton im Focus ist und ENTER gedrückt wird
		// wird automatisch der Text aus dem TextFeld in die TextArea 
		// kopiert. Zusätzlich müssen hier auch die allgemeinen Operationen, 
		// die ausgeführt werden sollen, egal welche Komponente im Focus ist,
		// implementiert sein. In unserem Fall das Hinzufügen und Löschen
		// über CTRL+A bzw. CTRL+B 
		addButton.addKeyListener(new KeyAdapter(){
					public void keyPressed(KeyEvent e) {
						int code = e.getKeyCode();
						
						if(code==KeyEvent.VK_ENTER) {
							copyText(); 
						}	
						else if ((code==KeyEvent.VK_A)&&(e.getModifiers()==2)) {
							copyText();
						}
						else if ((code==KeyEvent.VK_D)&&(e.getModifiers()==2))	{
							deleteText();
						}
					}
				
				});
				
		// Wenn der deleteButton im Focus ist und ENTER gedrückt wird
		// wird automatisch die TextArea gelöscht. 
		// Zusätzlich müssen hier auch die allgemeinen Operationen, 
		// die ausgeführt werden sollen egal welche Komponente im Focus ist,
		// implementiert sein. In unserem Fall das Hinzufügen und Löschen
		// über CTRL+A bzw. CTRL+B	
		deleteButton.addKeyListener(new KeyAdapter(){
					public void keyPressed(KeyEvent e) {
						int code = e.getKeyCode();
						if( code==KeyEvent.VK_ENTER){
							deleteText(); 
						}
						else if ((code==KeyEvent.VK_A)&& (e.getModifiers()==2))
						{
							copyText();
						}
						else if ((code==KeyEvent.VK_D)&& (e.getModifiers()==2))
						{
							deleteText();
						}
					}
				
				});
		
		// Auch das TextFeld kann im Focus sein. 
		// Die allgemeinen Operationen für Hinzufügen und Löschen über CTRL+A bzw. 
		// CTRL+B müssen also auch hier implementiert sein.				
		field.addKeyListener(new KeyAdapter(){
					public void keyPressed(KeyEvent e) {
						
						int code = e.getKeyCode();
						
						if ((code==KeyEvent.VK_A)&& (e.getModifiers()==2))
						{
							copyText();
						}
						else if ((code==KeyEvent.VK_D)&& (e.getModifiers()==2))
						{
							deleteText();
						}
						
					}
				
				});

				
		// Editor soll nicht focusierbar sein
		editor.setFocusable(false);

		// Platzieren der Komponenten
		north.add(addButton);
		north.add(deleteButton);
		north.add(field);

		add(north, BorderLayout.NORTH);
		add(editor);
	}
	
	/**
	 * Kopiert Text vom Textfeld in die TextArea.
	 */
	private void copyText() {
		editor.append(field.getText());
	}
	
	/**
	 * Löscht die TextArea.
	 */
	private void deleteText() {
		editor.setText("");
	}
}
