import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.LinkedHashMap;
import javax.swing.*;


/**
 * Top-level class for the Huffman Encoding Demonstration.
 * 
 * This can either be executed as an applet or an application.
 */
public class HuffmanDemo extends JApplet {
	private final static int WIDTH = 800;
	private final static int HEIGHT = 600;
	
	/**
	 * Starts the demo as an Application
	 * @param args
	 */
	public static void main(String[] args) {
		HuffmanDemo demo = new HuffmanDemo();
		demo.init();
		JFrame frame = new JFrame();
		frame.add(demo);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(WIDTH, HEIGHT);
        frame.setVisible(true);
	}

	/**
	 * Starts the demo as an Applet
	 */
	public void init() {
		final InputDialog inputDialog = new InputDialog();
		final NonEmptyValidator rawValidator = new NonEmptyValidator();
		final FrequencyValidator codeValidator = new FrequencyValidator();
		final CodebookValidator freqValidator = new CodebookValidator();
		
		inputDialog.addInputListener(new InputListener()
		{
			public void inputSubmitted(Object input) {
				if (input != null)
					display.setText("Current Model\n-------------\n" + input);
				cards.show(topPanel, "main");
				repaint();
			}	
						
		});
		display = new JTextArea();
		display.setEditable(false);
		topPanel = new JPanel();
		add(topPanel);
		
		cards = new CardLayout();
		topPanel.setLayout(cards);
		
		JPanel defaultPanel = new JPanel();
		defaultPanel.setLayout(new BorderLayout());
		defaultPanel.add(new JScrollPane(display), BorderLayout.CENTER);
		topPanel.add(defaultPanel, "main");
		topPanel.add(inputDialog, "input");

		JMenuBar menuBar = new JMenuBar();
		defaultPanel.add(menuBar, BorderLayout.NORTH);

		JMenu menu;
		JMenuItem item;

		menu = new JMenu("Load");
		menuBar.add(menu);
		item = new JMenuItem("Raw Text");
		item.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent arg0) {
				cards.show(topPanel,  "input");
				inputDialog.setValidator(new NonEmptyValidator());
				inputDialog.setMessage("Enter sample text", Color.BLACK);
				inputDialog.setText("");  // clear the input box
				repaint();
			}
		});
		menu.add(item);
		
		item = new JMenuItem("Frequencies");
		item.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent arg0) {
				cards.show(topPanel,  "input");
				inputDialog.setValidator(new FrequencyValidator());
				inputDialog.setMessage("Enter symbol frequencies using sample format shown below", Color.BLACK);
				inputDialog.setText("a 25\nb 76\ne 135");
				repaint();
			}
		});
		menu.add(item);

		item = new JMenuItem("Codebook");
		item.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent arg0) {
				cards.show(topPanel,  "input");
				inputDialog.setValidator(new CodebookValidator());
				inputDialog.setMessage("Enter codebook using sample format shown below", Color.BLACK);
				inputDialog.setText("a 01\nb 00\ne 1");
				repaint();
			}
		});
		menu.add(item);
	}

	
	private JPanel topPanel;
	private CardLayout cards;
	private JTextArea display; 
}
