/*
 * This is a programm to translate latin letters to morse or written morse or backwards.
 * 
 * Marcel Michael Kapfer
 * 
 * GPL v3.0
 * 
 * 2014
 * 
 * Version: 0.99 beta
 * 
 */


package morse;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JTextArea;
import javax.swing.JLabel;
import javax.swing.JRadioButton;
import javax.swing.JButton;
import javax.swing.JMenu;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

import javax.swing.ButtonGroup;
import javax.swing.JCheckBoxMenuItem;

import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JScrollPane;
import javax.swing.JPopupMenu;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class Morse extends JFrame {

	/**
	 * 
	 */
	private static final long serialVersionUID = -4342211364299252760L;
	private JPanel contentPane;
	private JTextArea tfOutput;
	private JTextArea tfInput;
	private JRadioButton rdbtnwmll;
	private JRadioButton rdbtnllwm;
	private JRadioButton rdbtnmll;
	private JRadioButton rdbtnllm;
	private JButton btnConvert;
	private JButton btnSelectInput;
	private final ButtonGroup buttonGroup = new ButtonGroup();
	private JCheckBoxMenuItem chckbxmntmClipboardAutomatic;

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

	/**
	 * Create the frame.
	 */
	public Morse() {
		setResizable(false);
		setTitle("Morse Converter");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 792, 420);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);

		JMenuBar menuBar = new JMenuBar();
		menuBar.setBorderPainted(false);
		menuBar.setBounds(0, 0, 820, 21);
		contentPane.add(menuBar);

		JMenu mnMain = new JMenu("Main Menu");
		menuBar.add(mnMain);

		JMenuItem mntmAbout = new JMenuItem("About");
		mntmAbout.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				About.main(null);
			}
		});
		mnMain.add(mntmAbout);

		JMenuItem mntmBug = new JMenuItem("Bug");
		mnMain.add(mntmBug);
		//TODO add jDialog and event listner

		JMenuItem mntmHowTo = new JMenuItem("How to");
		mnMain.add(mntmHowTo);
		//TODO add jDialog and event listner

		JMenuItem mntmMissingCode = new JMenuItem("Missing Code");
		mnMain.add(mntmMissingCode);
		//TODO add jDialog and event listner

		JMenu mnClipboard = new JMenu("Clipboard");
		menuBar.add(mnClipboard);

		JMenuItem mntnPaste = new JMenuItem("Paste from Clipboard");
		mnClipboard.add(mntnPaste);
		//TODO add jDialog and event listner

		JMenuItem mntmCopy = new JMenuItem("Copy into Clipboard");
		mnClipboard.add(mntmCopy);
		//TODO add jDialog and event listner

		chckbxmntmClipboardAutomatic = new JCheckBoxMenuItem(
				"Copy automatically into Clipboard");
		mnClipboard.add(chckbxmntmClipboardAutomatic);

		JScrollPane scrollPaneInput = new JScrollPane();
		scrollPaneInput.setBounds(12, 60, 758, 140);
		contentPane.add(scrollPaneInput);

		tfInput = new JTextArea();
		scrollPaneInput.setViewportView(tfInput);
		tfInput.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent e) {
			}

			@Override
			public void keyReleased(KeyEvent e) {
				if (e.getKeyCode() == KeyEvent.VK_ENTER) {
					ChooseProcess();
				}
			}

			@Override
			public void keyTyped(KeyEvent e) {
			}
		});
		tfInput.setLineWrap(true);
		
		JPopupMenu popupMenuIp = new JPopupMenu();
		addPopup(tfInput, popupMenuIp);
		
		JMenuItem mntmIpPaste = new JMenuItem("Paste from Clipboard");
		mntmIpPaste.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				onPaste(tfInput);
			}
		});
		popupMenuIp.add(mntmIpPaste);
		
		JMenuItem mntnIpSelect = new JMenuItem("Select text");
		mntnIpSelect.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				tfInput.selectAll();
			}
		});
		popupMenuIp.add(mntnIpSelect);
		
		JMenuItem mntmIpDelete = new JMenuItem("Delete text");
		mntmIpDelete.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				tfInput.setText(null);
			}
		});
		popupMenuIp.add(mntmIpDelete);

		JLabel lblEnterYourText = new JLabel("Enter your text:");
		lblEnterYourText.setBounds(10, 33, 111, 15);
		contentPane.add(lblEnterYourText);

		rdbtnwmll = new JRadioButton("writtenMorse to Latin Letters");
		buttonGroup.add(rdbtnwmll);
		rdbtnwmll.setBounds(12, 208, 250, 23);
		contentPane.add(rdbtnwmll);

		rdbtnllwm = new JRadioButton("Latin Letters to writtenMorse");
		buttonGroup.add(rdbtnllwm);
		rdbtnllwm.setBounds(266, 208, 250, 23);
		contentPane.add(rdbtnllwm);

		rdbtnmll = new JRadioButton("Morse to Latin Letters");
		buttonGroup.add(rdbtnmll);
		rdbtnmll.setBounds(12, 235, 250, 23);
		contentPane.add(rdbtnmll);

		rdbtnllm = new JRadioButton("Latin Letters to Morse");
		buttonGroup.add(rdbtnllm);
		rdbtnllm.setBounds(266, 235, 250, 23);
		contentPane.add(rdbtnllm);

		btnConvert = new JButton("Convert");
		btnConvert.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				ChooseProcess();
			}
		});
		btnConvert.setBounds(612, 218, 160, 25);
		contentPane.add(btnConvert);

		JScrollPane scrollPaneOutput = new JScrollPane();
		scrollPaneOutput.setBounds(12, 266, 758, 140);
		contentPane.add(scrollPaneOutput);

		tfOutput = new JTextArea();
		scrollPaneOutput.setViewportView(tfOutput);
		tfOutput.setEditable(false);
		tfOutput.setLineWrap(true);
		
		JPopupMenu popupMenuOp = new JPopupMenu();
		addPopup(tfOutput, popupMenuOp);
		
		JMenuItem mntmOpClipboardCopy = new JMenuItem("Copy into Clipboard");
		mntmOpClipboardCopy.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				StringSelection selection = new StringSelection(tfOutput.getText());
				Clipboard clipboard = Toolkit.getDefaultToolkit()
						.getSystemClipboard();
				clipboard.setContents(selection, selection);
			}
		});
		popupMenuOp.add(mntmOpClipboardCopy);
		
		JMenuItem mntmOpSelect = new JMenuItem("Select Text");
		popupMenuOp.add(mntmOpSelect);
		//TODO add right click popup menu

		btnSelectInput = new JButton("Select Input Text");
		btnSelectInput.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				tfInput.requestFocus();
				tfInput.selectAll();
				btnSelectInput.setVisible(false);
			}
		});
		btnSelectInput.setBounds(612, 28, 158, 25);
		btnSelectInput.setVisible(false);
		contentPane.add(btnSelectInput);
	}

	/*
	 * Choose the convert process
	 */
	private void ChooseProcess() {
		if (rdbtnwmll.isSelected()) {
			tfOutput.setText("Process not available");
			// TODO Add function
		} else if (rdbtnllwm.isSelected()) {
			LlWm();
		} else if (rdbtnmll.isSelected()) {
			tfOutput.setText("Process not available");
			// TODO Add function
		} else if (rdbtnllm.isSelected()) {
			tfOutput.setText("Process not available");
			// TODO Add function
		} else {
			tfOutput.setText("Please select a convert process");
			rdbtnwmll.requestFocus();
		}
	}

	/*
	 * Tasks to do after the converting process
	 */
	private void After() {
		tfOutput.selectAll();
		btnSelectInput.setVisible(true);
		if (chckbxmntmClipboardAutomatic.isSelected()) {
			StringSelection selection = new StringSelection(tfOutput.getText());
			Clipboard clipboard = Toolkit.getDefaultToolkit()
					.getSystemClipboard();
			clipboard.setContents(selection, selection);
		}
	}

	/*
	 * Code for converting latin letters into written morse
	 */
	private void LlWm() {
		// Variables
		StringBuffer input = new StringBuffer();
		input = input.replace(0, input.length(), tfInput.getText()
				.toUpperCase());
		StringBuffer output = new StringBuffer();
		if (input.toString().equals("")) {
			tfOutput.setText("Please enter at least one character");
			After();
		} else if (input.toString().equals("LETTERSPACE")) {
			tfOutput.setText("#");
			After();
		} else if (input.toString().equals("END OF WORK")) {
			tfOutput.setText("000101");
			After();
		} else if (input.toString().equals("ERROR")) {
			tfOutput.setText("00000000");
			After();
		} else if (input.toString().equals("STARTING SIGNAL")) {
			tfOutput.setText("10101");
			After();
		} else if (input.toString().equals("ENDING SIGNAL")) {
			tfOutput.setText("01010");
			After();
		} else if (input.toString().equals("UNDERSTOOD")) {
			tfOutput.setText("00010");
			After();
		} else if (input.toString().equals("WAIT")) {
			tfOutput.setText("01000");
			After();
		} else if (input.toString().equals("SOS")) {
			tfOutput.setText("000111000");
			After();
		} else if (input.toString().equals("LETTER SPACE")) {
			tfOutput.setText("#");
			After();
		} else if (input.toString().equals("WORD SPACE")) {
			tfOutput.setText("+");
			After();
		} else {
			for (int c = input.length(); c > 0; c--) {
				if (input.toString().startsWith(" ")) {
					if (output.toString().endsWith("#")) {
						output.delete((output.length() - 1), output.length());
					}
					output.append("+");
					input.delete(0, 1);
				} else if (input.toString().startsWith("\n")) {
					output.append("\n");
				} else if (input.toString().startsWith("A")) {
					output.append("01#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("B")) {
					output.append("1000#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("C")) {
					output.append("1010#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("D")) {
					output.append("100#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("E")) {
					output.append("0#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("F")) {
					output.append("0010#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("G")) {
					output.append("110#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("H")) {
					output.append("0000#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("I")) {
					output.append("00#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("J")) {
					output.append("0111#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("K")) {
					output.append("101#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("L")) {
					output.append("0100#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("M")) {
					output.append("11#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("N")) {
					output.append("10#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("O")) {
					output.append("111#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("P")) {
					output.append("0110#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("Q")) {
					output.append("1101#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("R")) {
					output.append("010#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("S")) {
					output.append("000#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("T")) {
					output.append("1#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("U")) {
					output.append("001#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("V")) {
					output.append("0001#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("W")) {
					output.append("011#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("X")) {
					output.append("1001#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("Y")) {
					output.append("1011#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("Z")) {
					output.append("1100#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("0")) {
					output.append("11111#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("1")) {
					output.append("01111#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("2")) {
					output.append("00111#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("3")) {
					output.append("00011#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("4")) {
					output.append("00001#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("5")) {
					output.append("00000#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("6")) {
					output.append("10000#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("7")) {
					output.append("11000#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("8")) {
					output.append("11100#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("9")) {
					output.append("11110#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("Ä")) {
					output.append("0101#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("Ö")) {
					output.append("1110#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("Ü")) {
					output.append("0011#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("ß")) {
					output.append("00011000#");
					input.delete(0, 1);
				} else if (input.toString().startsWith(".")) {
					output.append("010101#");
					input.delete(0, 1);
				} else if (input.toString().startsWith(",")) {
					output.append("110011#");
					input.delete(0, 1);
				} else if (input.toString().startsWith(":")) {
					output.append("111000#");
					input.delete(0, 1);
				} else if (input.toString().startsWith(";")) {
					output.append("101010#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("?")) {
					output.append("001100#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("!")) {
					output.append("101011#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("-")) {
					output.append("100001#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("_")) {
					output.append("001101#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("(")) {
					output.append("10110#");
					input.delete(0, 1);
				} else if (input.toString().startsWith(")")) {
					output.append("101101#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("=")) {
					output.append("10001#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("+")) {
					output.append("01010#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("/")) {
					output.append("10010#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("@")) {
					output.append("011010#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("'")) {
					output.append("011110#");
					input.delete(0, 1);
				} else if (input.toString().startsWith("$")) {
					output.append("0001001#");
					input.delete(0, 1);
				} else {
					tfOutput.setText("Code not listed or wrong.");
				}
			}
			tfOutput.setText(output.delete(output.length() - 1, output.length())
					.toString());
			After();
		}
	}
	private static void addPopup(Component component, final JPopupMenu popup) {
		component.addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent e) {
				if (e.isPopupTrigger()) {
					showMenu(e);
				}
			}
			public void mouseReleased(MouseEvent e) {
				if (e.isPopupTrigger()) {
					showMenu(e);
				}
			}
			private void showMenu(MouseEvent e) {
				popup.show(e.getComponent(), e.getX(), e.getY());
			}
		});
	}
	private void onPaste(JTextArea tf){
		Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
		Transferable t = c.getContents(this);
		if (t == null)
			return;
		try {
			tf.setText((String) t.getTransferData(DataFlavor.stringFlavor));
		} catch (Exception e){
			e.printStackTrace();
		}//try
	}//onPaste
	private void onCopy(JTextArea tf){
		StringSelection selection = new StringSelection(tf.getText());
		Clipboard clipboard = Toolkit.getDefaultToolkit()
				.getSystemClipboard();
		clipboard.setContents(selection, selection);
	}
}