import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class MemoryConverter extends JApplet implements ActionListener{

	
	public static final long serialVersionUID = 1L;
	public static final String[] comboUnits = {	"PiB", "PB",
												"TiB", "TB",
												"GiB", "GB",
												"MiB", "MB",
												"KiB", "kB",
												"B"};
	public static final double[] unitValues = {	Math.pow(1024.0, 5.0), Math.pow(1000.0, 5.0),
												Math.pow(1024.0, 4.0), Math.pow(1000.0, 4.0),
												Math.pow(1024.0, 3.0), Math.pow(1000.0, 3.0),
												Math.pow(1024.0, 2.0), Math.pow(1000.0, 2.0),
												1024, 1000,
												1};
	
	//public JLabel lbl_Header = new JLabel("<html><h2>Memory Unit Converter</h2><p>Units which include an 'i' conform to the IEC standard for binary prefixes. Others are orders of 10.</p></html>");
	public JLabel lbl_InputSize = new JLabel("Storage Size: ");
	public JLabel lbl_InputUnits = new JLabel("Input Units: ");
	public JLabel lbl_OutputUnits = new JLabel("Output Units: ");
	public JLabel lbl_OutputResults = new JLabel("Results: ");
	public JLabel lbl_Output = new JLabel();
	
	public JTextField tf_InputSize = new JTextField(20);
		
	public JComboBox cb_InputUnits = new JComboBox(comboUnits);
	public JComboBox cb_OutputUnits = new JComboBox(comboUnits);
	
	public JButton b_Submit = new JButton("Calculate");
	
	
	/**
	 * Constructor
	 */
	public MemoryConverter() {
		lbl_InputSize.setHorizontalAlignment(JLabel.RIGHT);
		lbl_InputUnits.setHorizontalAlignment(JLabel.RIGHT);
		lbl_OutputUnits.setHorizontalAlignment(JLabel.RIGHT);
		lbl_OutputResults.setHorizontalAlignment(JLabel.RIGHT);
		b_Submit.addActionListener(this);
				
		JPanel fields = new JPanel();
			fields.setLayout(new GridLayout(4,2));
			fields.setBackground(Color.WHITE);
		
		Container window = getContentPane();
			window.setLayout(new BorderLayout());
		
			fields.add(lbl_InputSize);
			fields.add(tf_InputSize);
			fields.add(lbl_InputUnits);
			fields.add(cb_InputUnits);
			fields.add(lbl_OutputUnits);
			fields.add(cb_OutputUnits);
			fields.add(lbl_OutputResults);
			fields.add(lbl_Output);			
			
			//window.add(lbl_Header, "North");
			window.add(fields, "Center");
			window.add(b_Submit, "South");
			window.setBackground(Color.WHITE);
	}
	
	// When "Calculate" button is clicked...
	public void actionPerformed(ActionEvent event) {
		String s_InputSize = tf_InputSize.getText();
		try {
	         double d_InputSize = Double.valueOf(s_InputSize.trim()).doubleValue();
	         double d_Output = _GetCalculatedValue(cb_InputUnits.getSelectedIndex(), cb_OutputUnits.getSelectedIndex(), d_InputSize);
	         	if(d_Output > Double.MAX_VALUE || d_Output < 0) {
	         		lbl_Output.setText("Invalid Input.");
	         	}
	         	else {
	         		lbl_Output.setText(Double.toString(d_Output) + " " + comboUnits[cb_OutputUnits.getSelectedIndex()]);
	         	}
		}
		catch (NumberFormatException nfe) {
	         lbl_Output.setText("NumberFormatException: " + nfe.getMessage());
		}
	}
	
	// Returns converted value...
	public double _GetCalculatedValue(int inputIndex, int outputIndex, double value) {
        	return (value * unitValues[inputIndex]) / unitValues[outputIndex];
    }

	public void init() {
		JApplet frm = new MemoryConverter();
		frm.setSize(375, 200);
		frm.setVisible(true);
	}

}

