/**
 * 
 */
package view.tool.inputField;

import java.awt.Color;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JTextField;

import tool.regEx.DataNormalizer;


/**
 * @author Alexis Caron
 *
 */
public class JValidTextField extends JTextField implements KeyListener {
	/**
	 * 
	 */
	private static final long serialVersionUID = 9077271670084319146L;
	private boolean allowCertainCaracter;
	private String caractersRegex;
	
	/**
	 * Constructeur avec text en parametre
	 * @param text String
	 */
	protected JValidTextField(String text, boolean _allowCertainCaracter, String regex, int characterLength) {
		this.setText(text);
		this.setColumns(characterLength);
		allowCertainCaracter = _allowCertainCaracter;
		caractersRegex = regex;
		this.addKeyListener(this);
		this.setDisabledTextColor(Color.BLACK);
	}
	
	/**
	 * @return default JValidTextField
	 */
	public static JValidTextField JValidTextFieldWithoutText(int characterLength){
		return new JValidTextField("",false,"",characterLength);
	}
	
	/**
	 * @param _text
	 * @return JValidTextField with text
	 */
	public static JValidTextField JValidTextFieldWithText(String _text, int characterLength){
		return new JValidTextField(_text,false,"",characterLength);
	}
	
	/**
	 * @param _allowedCaracters
	 * @return JValidTextField which allows certain character
	 */
	public static JValidTextField JValidTextFieldAllowCertainCharacter(String regex, int characterLength){
		return new JValidTextField("",true,regex,characterLength);
	}
	
	/**
	 * @param _allowedCaracters
	 * @return JValidTextField which disallow certain character
	 */
	public static JValidTextField JValidTextFieldDisallowCertainCharacter(String regex, int characterLength){
		return new JValidTextField("",false,regex,characterLength);
	}
	
	/**
	 * @param _allowedCaracters
	 * @param _text
	 * @return JValidTextField which allow certain character and has text
	 */
	public static JValidTextField JValidTextFieldWithTextAllowCertainCharacter(String regex, String _text, int characterLength){
		return new JValidTextField(_text,true,regex,characterLength);
	}
	
	/**
	 * @param _allowedCaracters
	 * @param _text
	 * @return JValidTextField which disallow certain character and has text
	 */
	public static JValidTextField JValidTextFieldWithTextDisallowCertainCharacter(String regex, String _text, int characterLength){
		return new JValidTextField(_text,false,regex,characterLength);
	}
	
	@Override
	public void setEnabled(boolean enabled){
		super.setEnabled(enabled);
		this.setOpaque(enabled);
	}
	
	@Override
	public void keyPressed(KeyEvent arg0) {}

	@Override
	public void keyReleased(KeyEvent arg0) {}

	@Override
	public void keyTyped(KeyEvent e) {
		String pressed = Character.toString(e.getKeyChar()).toUpperCase();
		
		//si le nombre de caractere est deja au maximum
		if(this.getText().length() == this.getColumns())
			e.consume();
		
		//if caracter is not allowed by normalizer
		if(DataNormalizer.normalize(pressed).equals(""))
			e.consume();
		
		if(pressed.matches(caractersRegex))
		{
			//disallow mode
			if(!allowCertainCaracter)
			{
				e.consume();
			}
			e.setKeyChar(Character.toUpperCase(e.getKeyChar()));
			return;
		}
		
		//allowMode
		if(allowCertainCaracter)
		{
			e.consume();
		}
		e.setKeyChar(Character.toUpperCase(e.getKeyChar()));
	}
}