import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.JMenuBar;
import javax.swing.JTabbedPane;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JMenu;
import javax.swing.KeyStroke;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.awt.event.InputEvent;
import java.awt.FlowLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JLabel;
import com.jgoodies.forms.factories.DefaultComponentFactory;
import javax.swing.JTextField;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JCheckBox;

public class MainFrame extends JFrame {

	private JPanel contentPane;
	private JTextField textField;
	private JTextField textField_1;
	JButton btnEinlesen = new JButton("Einlesen");
	JLabel lblNewLabel = new JLabel("Ausgelesener Wert: -");
	JButton btnDrucken = new JButton("Drucken");
	JButton btnSpeichern = new JButton("Speichern");
	
	// Parent für JFileChooser
	JFrame _this = this;
	// File zum speichern / lesen
	File f;
	// Generierter QR-Code
	BufferedImage img = null;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
					MainFrame frame = new MainFrame();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public MainFrame() {
		setTitle("Sven.QR");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 600, 400);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(new BorderLayout(0, 0));
		
		JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);
		contentPane.add(tabbedPane, BorderLayout.CENTER);
		
		JPanel panel_1 = new JPanel();
		tabbedPane.addTab("   QR-Code generieren   ", null, panel_1, null);
		panel_1.setLayout(null);
		
		JLabel lblQrcode = new JLabel("QR-Code Wert:");
		lblQrcode.setBounds(10, 14, 80, 14);
		panel_1.add(lblQrcode);
		
		textField_1 = new JTextField();
		textField_1.setBounds(94, 11, 424, 20);
		panel_1.add(textField_1);
		textField_1.setColumns(10);
		
		//
		// = BUTTON GENERIEREN: Generiert einen QR-Code aus dem Wert der TextBox und speichert ihn.
		//
		JButton btnGenerieren = new JButton("Generieren");
		btnGenerieren.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				try {
					int value = Integer.parseInt(textField_1.getText());
					img = SvenQR.GenerateQR(value);
				} catch(Exception e1) {
					 JOptionPane.showMessageDialog(_this, "QR-Code konnte nicht generiert werden: " + e1.getMessage());
					 return;
				}
				
				btnDrucken.setEnabled(true);
				btnSpeichern.setEnabled(true);
			}
		});
		btnGenerieren.setBounds(94, 42, 89, 23);
		panel_1.add(btnGenerieren);
		
		//
		// = BUTTON DRUCKEN: Druckt den generierten QR-Code.
		//
		
		btnDrucken.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				new Thread(new PrintActionListener(img)).start();  
			}
		});
		btnDrucken.setEnabled(false);
		btnDrucken.setBounds(292, 42, 89, 23);
		panel_1.add(btnDrucken);
		
		//
		// = BUTTON SPEICHERN: Speichert den generierten QR-Code.
		//
		
		btnSpeichern.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				// JFileChooser erstellen
				JFileChooser fc = new JFileChooser();
				// Dateifilter setzen
				 FileNameExtensionFilter filter = new FileNameExtensionFilter(
					        "PNG (*.png)", "png");
				
				 fc.setFileFilter(filter);
				 
				// Wenn im Dialog nicht OK gedrückt wurde, Methode verlassen
				if (fc.showSaveDialog(_this) != JFileChooser.APPROVE_OPTION)
					return;
				
				f = fc.getSelectedFile();
				
				try {
					ImageIO.write(img, "png", f);
				} catch (IOException e1) {
					JOptionPane.showMessageDialog(_this, "QR-Code konnte nicht gespeichert werden: " + e1.getMessage());
					 return;
				}
			}
		});
		btnSpeichern.setEnabled(false);
		btnSpeichern.setBounds(193, 42, 89, 23);
		panel_1.add(btnSpeichern);

		JPanel panel = new JPanel();
		tabbedPane.addTab("   QR-Code einlesen   ", null, panel, null);
		panel.setLayout(null);
		
		JLabel lblQuelldatei = new JLabel("Quelldatei:");
		lblQuelldatei.setBounds(10, 12, 55, 14);
		panel.add(lblQuelldatei);
		
		textField = new JTextField();
		textField.setBounds(75, 8, 451, 21);
		panel.add(textField);
		textField.setColumns(10);
		
		// 
		// = BUTTON ... : Wählt die Quelldatei mit einem JFileChooser aus. =
		//
		JButton button = new JButton("...");
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				// JFileChooser erstellen
				JFileChooser fc = new JFileChooser();
				fc.setCurrentDirectory(new File("T:/INTABI19/Projekt/ELMO Interactive Toolbox/rec"));
				
				// Wenn im Dialog nicht OK gedrückt wurde, Methode verlassen
				if (fc.showOpenDialog(_this) != JFileChooser.APPROVE_OPTION)
					return;
				
				// Ausgewählte Datei auslesen
				f = fc.getSelectedFile();
				// Pfad der Datei in Textbox schreiben
				textField.setText(f.getAbsolutePath());
				
				// Einlesen-Button aktivieren
				btnEinlesen.setEnabled(true);
			}
		});
		button.setBounds(536, 7, 23, 23);
		panel.add(button);
		
		//
		// = BUTTON EINLESEN: Liest ausgewählten QR-Code aus Datei ein. =
		//
		btnEinlesen.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				// Ausgelesener Wert
				int value = -1;
				
				// Versuche, den QR-Code einzulesen
				// Wenn das nicht geht, wird eine Fehlermeldung ausgegeben
				try {
					value = SvenQR.ReadQR(f.getAbsolutePath());
				} catch (IOException e1) {
					JOptionPane.showMessageDialog(_this, "QR-Code konnte nicht eingelesen werden: " + e1.getMessage());
					return;
				}
				
				// Ausgelesener Wert auf Label schreiben
				lblNewLabel.setText("Ausgelesener Wert: " + value);
			}
		});
		btnEinlesen.setEnabled(false);
		btnEinlesen.setBounds(75, 40, 89, 23);
		panel.add(btnEinlesen);
		
		
		lblNewLabel.setBounds(10, 74, 549, 14);
		panel.add(lblNewLabel);
	}
}
