package mindfinder;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSlider;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

/**
* This code was edited or generated using CloudGarden's Jigloo
* SWT/Swing GUI Builder, which is free for non-commercial
* use. If Jigloo is being used commercially (ie, by a corporation,
* company or business for any purpose whatever) then you
* should purchase a license for each developer using Jigloo.
* Please visit www.cloudgarden.com for details.
* Use of Jigloo implies acceptance of these licensing terms.
* A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR
* THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED
* LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE.
*/
public class MindfinderGui extends javax.swing.JFrame implements KeyListener{

	{
		//Set Look & Feel
		try {
			javax.swing.UIManager.setLookAndFeel(javax.swing.UIManager.getSystemLookAndFeelClassName());
		} catch(Exception e) {
			e.printStackTrace();
		}
	}

	
	private Controller controller;
	
	private JPanel panelNorth;
	private JButton btnRight;
	private JButton btnLeft;
	private JButton btnForward;
	private JButton btnForwardRight;
	private JButton btnMeasureDistance;
	private JButton btnCallibrateLow;
	private JButton btnCalibrateHigh;
	private JButton btnPlaySound;
	private JSlider sliderSpeed;
	private JPanel panelSpeedControls;
	private JScrollPane scrollPaneSouth;
	private JButton btnMeasureLight;
	private JPanel panelMoveControls;
	private JPanel panelSensorControls;
	private JTextArea txtArMsgs;
	private JButton btnHeadRight;
	private JButton btnHeadLeft;
	private JPanel panelHeadControl;
	private JButton btnBackwardRight;
	private JButton btnBackward;
	private JButton btnStop;
	private JButton btnBackwardLeft;
	private JButton btnForwardLeft;
	private JPanel panelControl;
	private JPanel panelCenter;

	/**
	* Auto-generated main method to display this JFrame
	*/
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				MindfinderGui inst = new MindfinderGui();
				inst.setLocationRelativeTo(null);
				inst.setVisible(true);
			}
		});
	}
	
	public MindfinderGui() {
		super();
		initGUI();
		this.addKeyListener(this);
		controller = new Controller();
		sliderSpeed.setMaximum((int)controller.getPilotMaxSpeed());
		sliderSpeed.setPaintLabels(true);

	}
	
	private void initGUI() {
		try {
			setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

			{
				panelNorth = new JPanel();
				getContentPane().add(panelNorth, BorderLayout.NORTH);
			}
			{
				panelCenter = new JPanel();
				FlowLayout panelCenterLayout = new FlowLayout();
				panelCenter.setLayout(panelCenterLayout);
				getContentPane().add(panelCenter, BorderLayout.CENTER);
				{
					panelSensorControls = new JPanel();
					panelCenter.add(panelSensorControls);
					FlowLayout panelSensorControlsLayout = new FlowLayout();
					panelSensorControls.setLayout(panelSensorControlsLayout);
					panelSensorControls.setPreferredSize(new java.awt.Dimension(187, 200));
					{
						btnMeasureDistance = new JButton();
						panelSensorControls.add(btnMeasureDistance);
						btnMeasureDistance.setText("Distanz messen");
						btnMeasureDistance.addActionListener(new ActionListener() {
							public void actionPerformed(ActionEvent evt) {
								String distance = controller.getUltrasonicDistance();
								Date now = new Date();
								SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
								
								String res = sdf.format(now) + " - Distanz-Messung: " + distance + "\n"; 
								txtArMsgs.append(res);
							}
						});
					}
					{
						btnMeasureLight = new JButton();
						panelSensorControls.add(btnMeasureLight);
						btnMeasureLight.setText("Licht messen");
						btnMeasureLight.addActionListener(new ActionListener() {
							public void actionPerformed(ActionEvent evt) {
								String lightValues = controller.getLightValues();
								Date now = new Date();
								SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
								
								String res = sdf.format(now) + " - Licht-Messung: " + lightValues + "\n"; 
								txtArMsgs.append(res);
							}
						});
					}
					{
						btnPlaySound = new JButton();
						panelSensorControls.add(btnPlaySound);
						btnPlaySound.setText("Ton spielen");
						btnPlaySound.addActionListener(new ActionListener() {
							public void actionPerformed(ActionEvent evt) {
								controller.playBeep();
							}
						});
					}
					{
						btnCalibrateHigh = new JButton();
						panelSensorControls.add(btnCalibrateHigh);
						btnCalibrateHigh.setText("Lichtsensor kallibrieren High");
						btnCalibrateHigh.addActionListener(new ActionListener() {
							public void actionPerformed(ActionEvent evt) {
								controller.calibrateHigh();
							}
						});
					}
					{
						btnCallibrateLow = new JButton();
						panelSensorControls.add(btnCallibrateLow);
						btnCallibrateLow.setText("Lichtsensor kallibrieren Low");
						btnCallibrateLow.addActionListener(new ActionListener() {
							public void actionPerformed(ActionEvent evt) {
								controller.calibrateLow();
							}
						});
					}

				}
				panelCenter.addKeyListener(this);
				{
					panelMoveControls = new JPanel();
					BoxLayout panelMoveControlsLayout = new BoxLayout(panelMoveControls, javax.swing.BoxLayout.Y_AXIS);
					panelMoveControls.setLayout(panelMoveControlsLayout);
					panelCenter.add(panelMoveControls);
					{
						panelHeadControl = new JPanel();
						panelMoveControls.add(panelHeadControl);
						
						{
							btnHeadLeft = new JButton();
							panelHeadControl.add(btnHeadLeft);
							btnHeadLeft.setText("Kopf Links");
							btnHeadLeft.setPreferredSize(new java.awt.Dimension(108, 47));
							btnHeadLeft.addMouseListener(new MouseAdapter() {
								public void mouseReleased(MouseEvent evt) {
									controller.headStop();
								}
								public void mousePressed(MouseEvent evt) {
									controller.headLeft();
								}
							});
						}
						{
							btnHeadRight = new JButton();
							panelHeadControl.add(btnHeadRight);
							btnHeadRight.setText("Kopf Rechts");
							btnHeadRight.setPreferredSize(new java.awt.Dimension(108, 47));
							btnHeadRight.addMouseListener(new MouseAdapter() {
								public void mouseReleased(MouseEvent evt) {
									controller.headStop();
								}
								public void mousePressed(MouseEvent evt) {
									controller.headRight();
								}
							});
						}
					}
					{
						panelControl = new JPanel();
						panelMoveControls.add(panelControl);
						GridLayout panelControlLayout = new GridLayout(3, 3);
						panelControlLayout.setColumns(3);
						panelControlLayout.setHgap(5);
						panelControlLayout.setVgap(5);
						panelControlLayout.setRows(3);
						panelControl.setLayout(panelControlLayout);
						panelControl.setPreferredSize(new java.awt.Dimension(334, 151));
						{
							btnForwardLeft = new JButton();
							panelControl.add(btnForwardLeft);
							btnForwardLeft.setText("Vor Links" +
									"");
							btnForwardLeft.addKeyListener(this);
							btnForwardLeft.addMouseListener(new MouseAdapter() {
								public void mouseReleased(MouseEvent evt) {
									controller.stop();
								}
								public void mousePressed(MouseEvent evt) {
									controller.forwardLeft();
								}
							});
						}
						{
							btnForward = new JButton();
							panelControl.add(btnForward);
							btnForward.setText("Vor");
							btnForward.addKeyListener(this);
							btnForward.addMouseListener(new MouseAdapter() {
								public void mouseReleased(MouseEvent evt) {
									controller.stop();
								}
								public void mousePressed(MouseEvent evt) {
									controller.forward();
								}
							});
						}
						{
							btnForwardRight = new JButton();
							panelControl.add(btnForwardRight);
							btnForwardRight.setText("Vor Rechts");
							btnForwardRight.addKeyListener(this);
							btnForwardRight.addMouseListener(new MouseAdapter() {
								public void mousePressed(MouseEvent evt) {
									controller.forwardRight();
								}
								public void mouseReleased(MouseEvent evt) {
									controller.stop();
								}
							});
						}
						{
							btnLeft = new JButton();
							panelControl.add(btnLeft);
							btnLeft.setText("Links");
							btnLeft.addKeyListener(this);
							btnLeft.addMouseListener(new MouseAdapter() {
								public void mouseReleased(MouseEvent evt) {
									controller.stop();
								}
								public void mousePressed(MouseEvent evt) {
									controller.left();
								}
							});
						}
						{
							btnStop = new JButton();
							panelControl.add(btnStop);
							btnStop.setText("Stop");
							btnStop.addKeyListener(this);
							btnStop.addActionListener(new ActionListener() {
								public void actionPerformed(ActionEvent evt) {
									controller.stop();
								}
							});
						}
						{
							btnRight = new JButton();
							panelControl.add(btnRight);
							btnRight.setText("Rechts");
							btnRight.addKeyListener(this);
							btnRight.addMouseListener(new MouseAdapter() {
								public void mousePressed(MouseEvent evt) {
									controller.right();
								}
								public void mouseReleased(MouseEvent evt) {
									controller.stop();
								}
							});
						}
						{
							btnBackwardLeft = new JButton();
							panelControl.add(btnBackwardLeft);
							btnBackwardLeft.setText("Zurück Links");
							btnBackwardLeft.addKeyListener(this);
							btnBackwardLeft.addMouseListener(new MouseAdapter() {
								public void mouseReleased(MouseEvent evt) {
									controller.stop();
								}
								public void mousePressed(MouseEvent evt) {
									controller.backwardLeft();
								}
							});
						}
						{
							btnBackward = new JButton();
							panelControl.add(btnBackward);
							btnBackward.setText("Zurück");
							btnBackward.addKeyListener(this);
							btnBackward.addMouseListener(new MouseAdapter() {
								public void mouseReleased(MouseEvent evt) {
									controller.stop();
								}
								public void mousePressed(MouseEvent evt) {
									controller.backward();
								}
							});
						}
						{
							btnBackwardRight = new JButton();
							panelControl.add(btnBackwardRight);
							btnBackwardRight.setText("Zurück Rechts");
							btnBackwardRight.addKeyListener(this);
							btnBackwardRight.addMouseListener(new MouseAdapter() {
								public void mouseReleased(MouseEvent evt) {
									controller.stop();
								}
								public void mousePressed(MouseEvent evt) {
									controller.backwardRight();
								}
							});
						}
						
						
						
						
					}
				}
				{
					panelSpeedControls = new JPanel();
					panelCenter.add(panelSpeedControls);
					panelSpeedControls.setPreferredSize(new java.awt.Dimension(69, 210));
					{
						sliderSpeed = new JSlider();
						sliderSpeed.setOrientation(JSlider.VERTICAL);
						
						sliderSpeed.setMajorTickSpacing(100);
						panelSpeedControls.add(sliderSpeed);
						sliderSpeed.addChangeListener(new ChangeListener() {
							public void stateChanged(ChangeEvent evt) {
								int value = sliderSpeed.getValue();
								controller.setPilotSpeed((float)value);
							}
						});
					}
				}
			}
			{
				scrollPaneSouth = new JScrollPane();
				
				getContentPane().add(scrollPaneSouth, BorderLayout.SOUTH);
				scrollPaneSouth.setSize(600, 80);
				scrollPaneSouth.setPreferredSize(new java.awt.Dimension(784, 282));
//				scrollPaneSouth.setVerticalScrollBarPolicy(Scroll)
				{
					txtArMsgs = new JTextArea();
					scrollPaneSouth.setViewportView(txtArMsgs);
					txtArMsgs.setText("");
//					txtArMsgs.setPreferredSize(new java.awt.Dimension(600, 100));
					
				}
			}
			pack();
			this.setSize(800, 600);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	@Override
	public void keyPressed(KeyEvent arg0) {
		
		switch(arg0.getKeyCode()){
		case KeyEvent.VK_Q:
			controller.forwardLeft();
			break;
		case KeyEvent.VK_W:
			controller.forward();
			break;
		case KeyEvent.VK_E:
			controller.forwardRight();
			break;
		case KeyEvent.VK_A:
			controller.left();
			break;
		case KeyEvent.VK_S:
			controller.stop();
			break;
		case KeyEvent.VK_D:
			controller.right();
			break;
		case KeyEvent.VK_Y:
			controller.backwardLeft();
			break;
		case KeyEvent.VK_X:
			controller.backward();
			break;
		case KeyEvent.VK_C:
			controller.backwardRight();
			break;
		}
	}

	@Override
	public void keyTyped(KeyEvent e) {
		
	}

	@Override
	public void keyReleased(KeyEvent e) {
		controller.stop();
		
	}
	


}
