/**
 *	Written 2006-10 By Filip Ekberg
 *	School Project on BTH - Software Engineering
 *
 *	Copyright (C)
 *
 *
 *	This class handles the GUI
 */
 
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.table.*;

/**
 *	The GUI Class
 */
class TypeReco extends JFrame implements KeyListener, ActionListener
{
	private FTextField 			m_inputField;
	private JButton 		  	m_button;
	private JLabel	      	   	m_headLbl, m_statusLbl, m_countLbl, m_resultLbl, m_precentageLbl;
	private JTable			  	m_result;
	private JScrollPane 		m_scrollPane;
	private JMenuBar       		m_menuBar;
	private JMenu		 	 	m_menu;
	private DefaultTableModel 	m_tModel = new DefaultTableModel();
	private JMenuItem	  		m_menuFile, m_menuSave, m_menuLoad, m_menuExit;
	private JCheckBox			m_doTest;
	private Container	    	m_container;
	private JSlider				m_precentage;
	
	/**
	 *	Handles Action Events
	 */
	public void actionPerformed(ActionEvent e)
	{
		String command = e.getActionCommand();
		if (command == "Add User")
		{
			// Will ask for a username untill you either enter a username or press Cancel
			Object result;
			Boolean ask = true;
			while(ask)
			{
				result = JOptionPane.showInputDialog(this,
                                     "Enter your Username",
                                     "New User",
                                     0,
                                     null,
                                     null,
                                     null);
				if(result != null && !result.toString().equals(""))
				{
					this.create(result.toString());
					ask = false;
				}
				else
					ask = false;
					
			}
			
		}
		else if(command == "Save")
		{
			Object result;
			Boolean ask = true;
			while(ask)
			{
				result = JOptionPane.showInputDialog(this,
                                     "Enter your Username",
                                     "Save User",
                                     0,
                                     null,
                                     null,
                                     null);
				if(result != null && !result.toString().equals(""))
				{
					FileHandler.Save(result.toString(), m_inputField.toString());
					ask = false;
				}
				else
					ask = false;
					
			}
		}
			
		else if(command == "Load")
		{
			Object result;
			Boolean ask = true;
			while(ask)
			{
				result = JOptionPane.showInputDialog(this,
                                     "Enter your Username",
                                     "Load User",
                                     0,
                                     null,
                                     null,
                                     null);
				if(result != null && !result.toString().equals(""))
				{
					String user = FileHandler.Load(result.toString());
					if (!user.equals("Empty"))
					{
						String username = m_inputField.fromString(user);
							
						m_inputField.setRecognizion(username);
						
						m_inputField.setText("");
									
						m_statusLbl.setText("Username: " + username);
					
	    				JOptionPane.showMessageDialog(this, "The username " + username + " will now be used.");
	    		
						m_inputField.resetTryCounter();
	    			
	   					m_countLbl.setText("Times Written: " + m_inputField.getTryCounter());
					}
					ask = false;
				}
				else
					ask = false;
					
			}
		}
		
		else if(command == "Exit")
		{
			System.exit(1);
		}
	}
	
	/**
	 *	Create a new writing oppertunity	
	 */
	public void create(String username)
	{
		
		username = username.toUpperCase();
			
		m_inputField.setRecognizion(username);
		
		m_inputField.setText("");
					
		m_statusLbl.setText("Username: " + username);
					
	    JOptionPane.showMessageDialog(this, "The username " + username + " will now be used.");
	    		
	    m_inputField.resetTryCounter();
	    			
	    m_countLbl.setText("Times Written: " + m_inputField.getTryCounter());
	    			
	    m_inputField.clearTimes();
	}
	
	/**
	 *	Unused
	 *	Required by Interface Keylistern	
	 */
	public void keyPressed(KeyEvent e)
	{
	}
	
	/**
	 *	Unused
	 *	Required by Interface Keylistern	
	 */
	public void keyReleased(KeyEvent e)
	{
	
	}
	
	/**
	 *	If the FTextField processes the key the key will be catched here and futher processed
	 *	It will either call update in the FTextField class or it will End the current process
	 */
	public void keyTyped(KeyEvent e)
	{
		if (e.getKeyChar() == KeyEvent.VK_ENTER)
		{
			Object[][] result = m_inputField.getResult();
			String[] columnNames = 
			{
				"Character",
				"MS"
			};
			
			if(m_doTest.isSelected())
			{
				m_resultLbl.setForeground(Color.green);
				m_resultLbl.setText("Im Learning!");
				m_inputField.storeTime(result);
			}
			
			else if ( m_inputField.calculateTimeResult(this.m_precentage.getValue()) && m_inputField.getTryCounter() > 0 && !m_doTest.isSelected())
			{
				m_resultLbl.setForeground(Color.green);
				m_resultLbl.setText("You Passed!");
				m_inputField.storeTime(result);
			}
			else if(!m_inputField.calculateTimeResult(this.m_precentage.getValue()) && !m_doTest.isSelected() )
			{
				m_resultLbl.setForeground(Color.red);
				m_resultLbl.setText("INTRUDER ALERT!");
			}
			else
				m_resultLbl.setText("Problem?!");
				
				
			
			m_tModel.setDataVector(result,columnNames);
			
	    	m_countLbl.setText("Times Written: " + m_inputField.getTryCounter());
	    	
	    	m_countLbl.setText("Times Written: " + m_inputField.getTryCounter() + " Total Time: " + (m_inputField.getTotalTime() / 1000) + " seconds");
	    	
			m_inputField.reset();
			
		}
		else
			m_inputField.update();
	}
	
	/**
	 *	Class Constructor	
	 */
	public TypeReco()
	{
		super("TypeReco");
		
		this.setSize(800,600);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		initializeComponent();
	}
	
	/**
	 *	Graphics initialization	
	 */
	public void initializeComponent()
	{
		/* Components */
		
		m_container = this.getContentPane();
		m_container.setLayout(null);
		
		m_menuBar = new JMenuBar();
		
		m_menu = new JMenu("File");
		
		m_menuFile = new JMenuItem("Add User");
		m_menuSave = new JMenuItem("Save");
		m_menuLoad = new JMenuItem("Load");
		m_menuExit = new JMenuItem("Exit");
		m_menuLoad.addActionListener(this);
		m_menuExit.addActionListener(this);
		m_menuFile.addActionListener(this);
		m_menuSave.addActionListener(this);
		
		m_menu.add(m_menuFile);
		m_menu.add(m_menuSave);
		m_menu.add(m_menuLoad);
		m_menu.add(m_menuLoad);
		m_menu.addSeparator();
		m_menu.add(m_menuExit);
		
		m_menuBar.add(m_menu);
		
		m_doTest = new JCheckBox("Teach Me", true);
		m_doTest.setLocation(5,70);
		m_doTest.setSize(100, 30);
		
		m_precentageLbl= new JLabel("Error Difference");
		m_precentageLbl.setLocation(415,50);
		m_precentageLbl.setSize(200, 30);
		
		m_precentage = new JSlider(0, 100, 20);
		m_precentage.setSize(200,30);
		m_precentage.setLocation(410,70);
		m_precentage.setPaintLabels(true);
		m_precentage.setPaintTicks(true);
		m_precentage.setPaintTrack(true);
		m_precentage.setMinorTickSpacing(10);
		
		m_countLbl = new JLabel("");
		m_countLbl.setSize(350, 30);
		m_countLbl.setLocation(205, 0);	
			
		m_resultLbl = new JLabel("");
		m_resultLbl.setSize(350, 30);
		m_resultLbl.setLocation(600, 30);	
		
		m_headLbl = new JLabel("Please Write your Username");
		m_headLbl.setSize(400, 30);
		m_headLbl.setLocation(5, 0);
		
		m_statusLbl = new JLabel("");
		m_statusLbl.setSize(400, 30);
		m_statusLbl.setLocation(10, 50);
		
		m_result = new JTable(m_tModel) ;
		m_result.setPreferredScrollableViewportSize(new Dimension(this.getWidth()-20, 445));
		
    	m_scrollPane = new JScrollPane(m_result);
		m_scrollPane.setSize(this.getWidth()-20, 445);
		m_scrollPane.setLocation(5, 100);
				
		m_inputField = new FTextField("");
		m_inputField.setSize(200, 20);
		m_inputField.setLocation(5, 30);
		m_inputField.setUppCase();
		
		m_container.add(m_doTest);
		m_container.add(m_countLbl);
		m_container.add(m_headLbl);
		m_container.add(m_inputField);
		m_container.add(m_statusLbl);
		m_container.add(m_scrollPane);
		m_container.add(m_resultLbl);
		m_container.add(m_precentage);
		m_container.add(m_precentageLbl);
		
		m_inputField.addKeyListener(this);
		
		this.setJMenuBar(m_menuBar);
	}
}
