/*
 * This is a programm to translate latin letters, words, sentences, books and so on, to morse or written morse or backwards.
 * 
 * Marcel Michael Kapfer
 * 
 * GPL v3.0
 * 
 * 2014
 * 
 * Version: 1.0.0
 * 
 */

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, 443);
		contentPane = new JPanel();
		contentPane.setBackground(new Color(255, 255, 255));
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);

		JMenuBar menuBar = new JMenuBar();
		menuBar.setBackground(new Color(51, 102, 255));
		menuBar.setBorderPainted(false);
		menuBar.setBounds(0, 0, 820, 21);
		contentPane.add(menuBar);

		JMenu mnMain = new JMenu("Main Menu");
		mnMain.setBackground(new Color(255, 255, 255));
		menuBar.add(mnMain);

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

		JMenuItem mntmBug = new JMenuItem("Bug");
		mntmBug.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				Bug.main(null);
			}
		});
		mntmBug.setToolTipText("Information about handling a bug");
		mnMain.add(mntmBug);

		JMenuItem mntmHowTo = new JMenuItem("How to");
		mntmHowTo.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				HowTo.main(null);
			}
		});
		mntmHowTo.setToolTipText("Information about how to use the software");
		mnMain.add(mntmHowTo);
		JMenuItem mntmMissingCode = new JMenuItem("Missing Code");
		mntmMissingCode
				.setToolTipText("Information about handling a missing code");
		mnMain.add(mntmMissingCode);
		
		JMenuItem mntmExit = new JMenuItem("Exit");
		mntmExit.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				setVisible(false);
				dispose();
			}
		});
		mnMain.add(mntmExit);
		mntmMissingCode.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				MissingCode.main(null);
			}
		});

		JMenu mnClipboard = new JMenu("Clipboard");
		mnClipboard.setBackground(new Color(255, 255, 255));
		menuBar.add(mnClipboard);

		JMenuItem mntnPaste = new JMenuItem("Paste from Clipboard");
		mntnPaste
				.setToolTipText("Paste the text from your Clipboard into the input field");
		mntnPaste.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				onPaste(tfInput);
			}
		});
		mnClipboard.add(mntnPaste);

		JMenuItem mntmCopy = new JMenuItem("Copy into Clipboard");
		mntmCopy.setToolTipText("Copy the text from the output field into your clipboard");
		mntmCopy.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				onCopy(tfOutput);
			}
		});
		mnClipboard.add(mntmCopy);

		chckbxmntmClipboardAutomatic = new JCheckBoxMenuItem(
				"Copy automatically into Clipboard");
		chckbxmntmClipboardAutomatic
				.setToolTipText("Copy the text form the output field automatically into your clipboard");
		mnClipboard.add(chckbxmntmClipboardAutomatic);

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

		tfInput = new JTextArea();
		tfInput.setToolTipText("Enter here your text");
		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
				.setToolTipText("Paste the text from your Clipboard into the input field");
		mntmIpPaste.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				onPaste(tfInput);
			}
		});
		popupMenuIp.add(mntmIpPaste);

		JMenuItem mntnIpSelect = new JMenuItem("Select text");
		mntnIpSelect.setToolTipText("Select the whole text");
		mntnIpSelect.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				tfInput.requestFocus();
				tfInput.selectAll();
			}
		});
		popupMenuIp.add(mntnIpSelect);

		JMenuItem mntmIpDelete = new JMenuItem("Delete text");
		mntmIpDelete.setToolTipText("Delete the whole text");
		mntmIpDelete.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				tfInput.setText(null);
			}
		});
		popupMenuIp.add(mntmIpDelete);

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

		rdbtnwmll = new JRadioButton("writtenMorse to Latin Letters");
		rdbtnwmll.setBackground(new Color(255, 255, 255));
		rdbtnwmll
				.setToolTipText("Convert writtenMorse into normal latin letters");
		buttonGroup.add(rdbtnwmll);
		rdbtnwmll.setBounds(12, 208, 250, 23);
		contentPane.add(rdbtnwmll);

		rdbtnllwm = new JRadioButton("Latin Letters to writtenMorse");
		rdbtnllwm.setBackground(new Color(255, 255, 255));
		rdbtnllwm
				.setToolTipText("Convert normal latin letters into writtenMorse");
		buttonGroup.add(rdbtnllwm);
		rdbtnllwm.setBounds(266, 208, 250, 23);
		contentPane.add(rdbtnllwm);

		rdbtnmll = new JRadioButton("Morse to Latin Letters");
		rdbtnmll.setBackground(new Color(255, 255, 255));
		rdbtnmll.setToolTipText("Convert normal morse code into normal latin letters");
		buttonGroup.add(rdbtnmll);
		rdbtnmll.setBounds(12, 235, 250, 23);
		contentPane.add(rdbtnmll);

		rdbtnllm = new JRadioButton("Latin Letters to Morse");
		rdbtnllm.setBackground(new Color(255, 255, 255));
		rdbtnllm.setToolTipText("convert normal latin letters into normal morse code");
		buttonGroup.add(rdbtnllm);
		rdbtnllm.setBounds(266, 235, 250, 23);
		contentPane.add(rdbtnllm);

		btnConvert = new JButton("Convert");
		btnConvert.setForeground(new Color(255, 255, 255));
		btnConvert.setBackground(new Color(51, 102, 255));
		btnConvert
				.setToolTipText("Convert the insert text to the choosen code");
		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();
		tfOutput.setToolTipText("This is the output text field");
		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) {
				onCopy(tfOutput);
			}
		});
		popupMenuOp.add(mntmOpClipboardCopy);

		JMenuItem mntmOpSelect = new JMenuItem("Select Text");
		mntmOpSelect.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				tfOutput.requestFocus();
				tfOutput.selectAll();
			}
		});
		popupMenuOp.add(mntmOpSelect);

		btnSelectInput = new JButton("Select Input Text");
		btnSelectInput.setForeground(new Color(255, 255, 255));
		btnSelectInput.setBackground(new Color(51, 102, 255));
		btnSelectInput.setToolTipText("Select the whole text of the input box");
		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");
			WmLl();
		} else if (rdbtnllwm.isSelected()) {
			LlWm();
		} else if (rdbtnmll.isSelected()) {
			MLl();
		} else if (rdbtnllm.isSelected()) {
			LlM();
		} else {
			tfOutput.setText("Please select a convert process");
			rdbtnwmll.requestFocus();
		}
	}

	/*
	 * Tasks to do after the converting process
	 */
	private void After() {
		tfOutput.requestFocus();
		tfOutput.selectAll();
		btnSelectInput.setVisible(true);
		if (chckbxmntmClipboardAutomatic.isSelected()) {
			onCopy(tfOutput);
		}
	}

	/*
	 * Code for converting latin letters into written morse
	 */
	private void LlWm() {
		try {
			// 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(" ")) {
						output.append("+");
						input.delete(0, 1);
					} 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.");
					}
				}
				if (output.toString().endsWith("#")
						&& (output.toString().equals("#") == false)) {
					output.delete(output.length() - 1, output.length());
				}
				tfOutput.setText(output.toString());
				After();
			}
		} catch (Exception e) {
			tfOutput.setText("Some error occured. I'm sorry!");
		}
	}

	/*
	 * Code for converting writtenMorse to latin letters
	 */
	private void WmLl() {
		try {
			// Variables
			String input;
			StringBuffer output = new StringBuffer();
			input = tfInput.getText().toUpperCase() + "#";
			StringBuffer inputToSign = new StringBuffer(input);
			while (inputToSign.toString().equals("#") == false) {
				int d = 0;
				boolean signFull = true;
				StringBuffer sign = new StringBuffer();
				while (signFull) {
					if (inputToSign.toString().charAt(d) == '+'
							|| inputToSign.toString().charAt(d) == '#') {
						if (d == 0) {
							if (inputToSign.toString().startsWith("+")) {
								output.append(" ");
							}
							inputToSign.deleteCharAt(0);
						} else {
							sign.replace(0, sign.length(), inputToSign
									.toString().substring(0, d));
							inputToSign.delete(0, d);
							signFull = false;
						}
					} else {
						d++;
					}
				}
				if (input.equals("°")) {
					break;
				} else if (sign.toString().equals("01")) {
					output.append("A");
				} else if (sign.toString().equals("1000")) {
					output.append("B");
				} else if (sign.toString().equals("1010")) {
					output.append("C");
				} else if (sign.toString().equals("100")) {
					output.append("D");
				} else if (sign.toString().equals("0")) {
					output.append("E");
				} else if (sign.toString().equals("0010")) {
					output.append("F");
				} else if (sign.toString().equals("110")) {
					output.append("G");
				} else if (sign.toString().equals("0000")) {
					output.append("H");
				} else if (sign.toString().equals("00")) {
					output.append("I");
				} else if (sign.toString().equals("0111")) {
					output.append("J");
				} else if (sign.toString().equals("101")) {
					output.append("K");
				} else if (sign.toString().equals("0100")) {
					output.append("L");
				} else if (sign.toString().equals("11")) {
					output.append("M");
				} else if (sign.toString().equals("10")) {
					output.append("N");
				} else if (sign.toString().equals("111")) {
					output.append("O");
				} else if (sign.toString().equals("0110")) {
					output.append("P");
				} else if (sign.toString().equals("1101")) {
					output.append("Q");
				} else if (sign.toString().equals("010")) {
					output.append("R");
				} else if (sign.toString().equals("000")) {
					output.append("S");
				} else if (sign.toString().equals("1")) {
					output.append("T");
				} else if (sign.toString().equals("001")) {
					output.append("U");
				} else if (sign.toString().equals("0001")) {
					output.append("V");
				} else if (sign.toString().equals("011")) {
					output.append("W");
				} else if (sign.toString().equals("1001")) {
					output.append("X");
				} else if (sign.toString().equals("1011")) {
					output.append("Y");
				} else if (sign.toString().equals("1100")) {
					output.append("Z");
				} else if (sign.toString().equals("11111")) {
					output.append("0 (zero)");
				} else if (sign.toString().equals("01111")) {
					output.append("1");
				} else if (sign.toString().equals("00111")) {
					output.append("2");
				} else if (sign.toString().equals("00011")) {
					output.append("3");
				} else if (sign.toString().equals("00001")) {
					output.append("4");
				} else if (sign.toString().equals("00000")) {
					output.append("5");
				} else if (sign.toString().equals("10000")) {
					output.append("6");
				} else if (sign.toString().equals("11000")) {
					output.append("7");
				} else if (sign.toString().equals("11100")) {
					output.append("8");
				} else if (sign.toString().equals("11110")) {
					output.append("9");
				} else if (sign.toString().equals("0101")) {
					output.append("Ä");
				} else if (sign.toString().equals("1110")) {
					output.append("Ö");
				} else if (sign.toString().equals("0011")) {
					output.append("Ü");
				} else if (sign.toString().equals("00011000")) {
					output.append("ß");
				} else if (sign.toString().equals("1111")) {
					output.append("CH");
				} else if (sign.toString().equals("010101")) {
					output.append(".");
				} else if (sign.toString().equals("110011")) {
					output.append(",");
				} else if (sign.toString().equals("111000")) {
					output.append(":");
				} else if (sign.toString().equals("101010")) {
					output.append(";");
				} else if (sign.toString().equals("001100")) {
					output.append("?");
				} else if (sign.toString().equals("101011")) {
					output.append("!");
				} else if (sign.toString().equals("100001")) {
					output.append("-");
				} else if (sign.toString().equals("001101")) {
					output.append("_");
				} else if (sign.toString().equals("10110")) {
					output.append("(");
				} else if (sign.toString().equals("101101")) {
					output.append(")");
				} else if (sign.toString().equals("011110")) {
					output.append("'");
				} else if (sign.toString().equals("10001")) {
					output.append("=");
				} else if (sign.toString().equals("01010")) {
					output.append("+ or End of the signal");
				} else if (sign.toString().equals("10010")) {
					output.append("/");
				} else if (sign.toString().equals("011010")) {
					output.append("@");
				} else if (sign.toString().equals("10101")) {
					output.append("Begin of the signal");
				} else if (sign.toString().equals("10001")) {
					output.append("Wait");
				} else if (sign.toString().equals("00010")) {
					output.append("Understood");
				} else if (sign.toString().equals("000101")) {
					output.append("End of work");
				} else if (sign.toString().equals("000111000")) {
					output.append("SOS");
				} else if (sign.toString().equals("00000000")) {
					output.append("Error");
				} else {
					tfOutput.setText("Code not listed or wrong.");
				}
			}
			tfOutput.setText(output.toString());
			After();
		} catch (Exception e) {
			tfOutput.setText("Some error occured. I'm sorry!");
		}
	}

	/*
	 * Code for converting normal letters into morse code
	 */

	private void LlM() {
		try {
			// 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("...-.-");
				After();
			} else if (input.toString().equals("ERROR")) {
				tfOutput.setText("........");
				After();
			} else if (input.toString().equals("STARTING SIGNAL")) {
				tfOutput.setText("-.-.-");
				After();
			} else if (input.toString().equals("ENDING SIGNAL")) {
				tfOutput.setText(".-.-.");
				After();
			} else if (input.toString().equals("UNDERSTOOD")) {
				tfOutput.setText("...-.");
				After();
			} else if (input.toString().equals("WAIT")) {
				tfOutput.setText(".-...");
				After();
			} else if (input.toString().equals("SOS")) {
				tfOutput.setText("...---...");
				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(" ")) {
						output.append("         ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("A")) {
						output.append(".-   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("B")) {
						output.append("-...   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("C")) {
						output.append("-.-.   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("D")) {
						output.append("-..   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("E")) {
						output.append(".   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("F")) {
						output.append("..-.   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("G")) {
						output.append("--.   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("H")) {
						output.append("....   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("I")) {
						output.append("..   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("J")) {
						output.append(".---   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("K")) {
						output.append("-.-   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("L")) {
						output.append(".-..   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("M")) {
						output.append("--   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("N")) {
						output.append("-.   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("O")) {
						output.append("---   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("P")) {
						output.append(".--.   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("Q")) {
						output.append("--.-   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("R")) {
						output.append(".-.   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("S")) {
						output.append("...   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("T")) {
						output.append("-   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("U")) {
						output.append("..-   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("V")) {
						output.append("...-   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("W")) {
						output.append(".--   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("X")) {
						output.append("-..-   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("Y")) {
						output.append("-.--   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("Z")) {
						output.append("--..   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("0")) {
						output.append("-----   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("1")) {
						output.append(".----   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("2")) {
						output.append("..---   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("3")) {
						output.append("...--   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("4")) {
						output.append("....-   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("5")) {
						output.append(".....   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("6")) {
						output.append("-....   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("7")) {
						output.append("--...   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("8")) {
						output.append("---..   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("9")) {
						output.append("----.   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("Ä")) {
						output.append(".-.-   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("Ö")) {
						output.append("---.   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("Ü")) {
						output.append("..--   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("ß")) {
						output.append("...--...   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith(".")) {
						output.append(".-.-.-   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith(",")) {
						output.append("--..--   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith(":")) {
						output.append("---...   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith(";")) {
						output.append("-.-.-.   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("?")) {
						output.append("..--..   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("!")) {
						output.append("-.-.--   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("-")) {
						output.append("-....-   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("_")) {
						output.append("..--.-   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("(")) {
						output.append("-.--.   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith(")")) {
						output.append("-.--.-   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("=")) {
						output.append("-...-   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("+")) {
						output.append(".-.-.   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("/")) {
						output.append("-..-.   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("@")) {
						output.append(".--.-.   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("'")) {
						output.append(".----.   ");
						input.delete(0, 1);
					} else if (input.toString().startsWith("$")) {
						output.append("...-..-   ");
						input.delete(0, 1);
					} else {
						tfOutput.setText("Code not listed or wrong.");
					}
				}
				if (output.toString().endsWith("   ")
						&& (output.toString().equals("   ") == false)) {
					output.delete(output.length() - 3, output.length());
				}
				tfOutput.setText(output.toString());
				After();
			}
		} catch (Exception e) {
			tfOutput.setText("Some error occured. I'm sorry!");
		}
	}

	/*
	 * Code for converting morse code into latin letters
	 */
	private void MLl() {
		try {
			// Variables
			String input;
			StringBuffer output = new StringBuffer();
			input = tfInput.getText() + "   ";
			StringBuffer inputToSign = new StringBuffer(input);
			while (inputToSign.toString().equals("   ") == false) {
				int d = 0;
				boolean signFull = true;
				StringBuffer sign = new StringBuffer();
				while (signFull) {
					if (inputToSign.toString().startsWith("         ")) {
						output.append(" ");
						inputToSign.delete(d, d + 9);
					} else if (inputToSign.toString().substring(d, d + 3)
							.equals("   ")) {
						if (d == 0) {
							inputToSign.delete(0, 3);
						} else {
							sign.replace(0, sign.length(), inputToSign
									.toString().substring(0, d));
							inputToSign.delete(0, d);
							signFull = false;
						}
					} else {
						d++;
					}
				}
				if (sign.toString().equals(".-")) {
					output.append("A");
				} else if (sign.toString().equals("-...")) {
					output.append("B");
				} else if (sign.toString().equals("-.-.")) {
					output.append("C");
				} else if (sign.toString().equals("-..")) {
					output.append("D");
				} else if (sign.toString().equals(".")) {
					output.append("E");
				} else if (sign.toString().equals("..-.")) {
					output.append("F");
				} else if (sign.toString().equals("--.")) {
					output.append("G");
				} else if (sign.toString().equals("....")) {
					output.append("H");
				} else if (sign.toString().equals("..")) {
					output.append("I");
				} else if (sign.toString().equals(".---")) {
					output.append("J");
				} else if (sign.toString().equals("-.-")) {
					output.append("K");
				} else if (sign.toString().equals(".-..")) {
					output.append("L");
				} else if (sign.toString().equals("--")) {
					output.append("M");
				} else if (sign.toString().equals("-.")) {
					output.append("N");
				} else if (sign.toString().equals("---")) {
					output.append("O");
				} else if (sign.toString().equals(".--.")) {
					output.append("P");
				} else if (sign.toString().equals("--.-")) {
					output.append("Q");
				} else if (sign.toString().equals(".-.")) {
					output.append("R");
				} else if (sign.toString().equals("...")) {
					output.append("S");
				} else if (sign.toString().equals("-")) {
					output.append("T");
				} else if (sign.toString().equals("..-")) {
					output.append("U");
				} else if (sign.toString().equals("...-")) {
					output.append("V");
				} else if (sign.toString().equals(".--")) {
					output.append("W");
				} else if (sign.toString().equals("-..-")) {
					output.append("X");
				} else if (sign.toString().equals("-.--")) {
					output.append("Y");
				} else if (sign.toString().equals("--..")) {
					output.append("Z");
				} else if (sign.toString().equals("-----")) {
					output.append(". (zero)");
				} else if (sign.toString().equals(".----")) {
					output.append("-");
				} else if (sign.toString().equals("..---")) {
					output.append("2");
				} else if (sign.toString().equals("...--")) {
					output.append("3");
				} else if (sign.toString().equals("....-")) {
					output.append("4");
				} else if (sign.toString().equals(".....")) {
					output.append("5");
				} else if (sign.toString().equals("-....")) {
					output.append("6");
				} else if (sign.toString().equals("--...")) {
					output.append("7");
				} else if (sign.toString().equals("---..")) {
					output.append("8");
				} else if (sign.toString().equals("----.")) {
					output.append("9");
				} else if (sign.toString().equals(".-.-")) {
					output.append("Ä");
				} else if (sign.toString().equals("---.")) {
					output.append("Ö");
				} else if (sign.toString().equals("..--")) {
					output.append("Ü");
				} else if (sign.toString().equals("...--...")) {
					output.append("ß");
				} else if (sign.toString().equals("----")) {
					output.append("CH");
				} else if (sign.toString().equals(".-.-.-")) {
					output.append(".");
				} else if (sign.toString().equals("--..--")) {
					output.append(",");
				} else if (sign.toString().equals("---...")) {
					output.append(":");
				} else if (sign.toString().equals("-.-.-.")) {
					output.append(";");
				} else if (sign.toString().equals("..--..")) {
					output.append("?");
				} else if (sign.toString().equals("-.-.--")) {
					output.append("!");
				} else if (sign.toString().equals("-....-")) {
					output.append("-");
				} else if (sign.toString().equals("..--.-")) {
					output.append("_");
				} else if (sign.toString().equals("-.--.")) {
					output.append("(");
				} else if (sign.toString().equals("-.--.-")) {
					output.append(")");
				} else if (sign.toString().equals(".----.")) {
					output.append("'");
				} else if (sign.toString().equals("-...-")) {
					output.append("=");
				} else if (sign.toString().equals(".-.-.")) {
					output.append("+ or End of the signal");
				} else if (sign.toString().equals("-..-.")) {
					output.append("/");
				} else if (sign.toString().equals(".--.-.")) {
					output.append("@");
				} else if (sign.toString().equals("-.-.-")) {
					output.append("Begin of the signal");
				} else if (sign.toString().equals("-...-")) {
					output.append("Wait");
				} else if (sign.toString().equals("...-.")) {
					output.append("Understood");
				} else if (sign.toString().equals("...-.-")) {
					output.append("End of work");
				} else if (sign.toString().equals("...---...")) {
					output.append("SOS");
				} else if (sign.toString().equals("........")) {
					output.append("Error");
				} else {
					tfOutput.setText("Code not listed or wrong.");
				}
			}
			tfOutput.setText(output.toString());
			After();
		} catch (Exception e) {
			tfOutput.setText("Some error occured. I'm sorry!");
		}
	}

	/*
	 * popup menu
	 */
	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());
			}
		});
	}

	/*
	 * Past function
	 */
	private void onPaste(JTextArea tf) {
		try{
		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
		} catch (Exception e){
			tfOutput.setText("Some error occured. I'm sorry! \n Are you sure that your clipboard isn't empty?");
		}
	}// onPaste

	/*
	 * Copy function
	 */
	private void onCopy(JTextArea tf) {
		StringSelection selection = new StringSelection(tf.getText());
		Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
		clipboard.setContents(selection, selection);
	}
}