import java.awt.GridLayout;
import java.util.Random;

import javax.swing.JApplet;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.table.DefaultTableModel;

/*
 * Created on May 31, 2005
 *
 * To change the template for this generated file go to
 * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
 */

/**
 * @author tvalesky
 *
 * To change the template for this generated type comment go to
 * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
 */
public class KimsGame extends JApplet {

	Object[][] data1; 

	Object [][] data2;
	
	int rows = 2;
	int cols = 2;
	 

	Object[] colnames;
	String results;      
	
	Random r2 = new Random(); //this one is used to generate random characters

	DefaultTableModel dtm1;                             

	DefaultTableModel dtm2;    



	private javax.swing.JPanel jContentPane = null;

//	private javax.swing.JTable jTable = null;
	private javax.swing.JButton jButton = null;
	private javax.swing.JButton jButton1 = null;
	private javax.swing.JButton jButton2 = null;
	private javax.swing.JButton jButton3 = null;
	private javax.swing.JTable jTable1 = null;
	private javax.swing.JScrollPane jScrollPane = null;
	/**
	 * This is the default constructor
	 */
	public KimsGame() {
		super();
		init();
	}
	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	public void init() {
		this.setSize(300, 200);
		this.setContentPane(getJContentPane());
		getJButton().doClick();
	}
	/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	private javax.swing.JPanel getJContentPane() {
		if (jContentPane == null) {
			jContentPane = new javax.swing.JPanel();
			jContentPane.setLayout(new java.awt.BorderLayout());
			jContentPane.add(getJScrollPane(), java.awt.BorderLayout.CENTER);
			JPanel buttonPanel = new JPanel();
			buttonPanel.setLayout(new GridLayout(1, 3));
			buttonPanel.add(getJButton());
			buttonPanel.add(getJButton2());				
			buttonPanel.add(getJButton1());
		
			jContentPane.add(buttonPanel, java.awt.BorderLayout.NORTH);
			jContentPane.add(getJButton3(), java.awt.BorderLayout.SOUTH);			


		}
		return jContentPane;
	}


	/**
	 * This method initializes jButton
	 * 
	 * @return javax.swing.JButton
	 */
	private javax.swing.JButton getJButton() {
		if(jButton == null) {
			jButton = new javax.swing.JButton();
			jButton.setText("Restart");
			jButton.addActionListener(new java.awt.event.ActionListener() { 
				public void actionPerformed(java.awt.event.ActionEvent e) {    
					System.out.println("starting"); 
					System.out.println("generating test grid");
					generateTestGrid();
					System.out.println("displaying test grid"); 
					displayTestModel();
				}

				private void generateTestGrid() {
					Random r = new Random();
					data1 = new Object[rows][cols];	
					data2 = new Object[rows][cols];			
					colnames = new Object[cols];	
					for (int i = 0; i < cols; i++)
					{
						colnames[i] = "column " + i;	
					}
					for (int i = 0; i < data1.length; i++)
					{

						for (int j = 0; j < data1[0].length; j++)
						{
								//randomize
								int val = r.nextInt();
								System.out.println(val);
								if ((val % 2) == 0)
								{
									data1[i][j] = getRandomChar();									
								}
								else
								{
									data1[i][j] = null;
								}

						}
					}
					dtm1 = new DefaultTableModel(data1, colnames);                              

					dtm2 = new DefaultTableModel(data2, colnames);  

					
				}

				private String getRandomChar() {
					String s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";

					return new String(""+s.charAt(r2.nextInt(s.length())));
				}
			});
		}
		return jButton;
	}
	/**
	 * 
	 */
	protected void displayTestModel() {
		jTable1.setModel(dtm1);

		dtm1.addTableModelListener(jTable1);

		
	}
	/**
	 * This method initializes jButton1
	 * 
	 * @return javax.swing.JButton
	 */
	private javax.swing.JButton getJButton1() {
		if(jButton1 == null) {
			jButton1 = new javax.swing.JButton();
			jButton1.setText("Check");
			jButton1.addActionListener(new java.awt.event.ActionListener() { 
				public void actionPerformed(java.awt.event.ActionEvent e) {    
					System.out.println("comparing test grid and user-input grid");
					compareTestAndInputGrids();
					System.out.println("displaying results");
					displayResults(); 
					getJButton().doClick(); //reinitialize
				}

				private void displayResults() {
					if (results == null)
					{

						results = "they all match!";
					}
					System.out.println(results);	

					JOptionPane.showMessageDialog(getJContentPane(), results);					

					
				}

				private void compareTestAndInputGrids() {
					results = null;
					boolean errorFound = false;
					StringBuffer errbuff = new StringBuffer();
					for (int i = 0; i < data1.length; i++)
					{
						for (int j = 0; j < data1[0].length; j++)
						{
							System.out.println("looking at data[" + i + "," + j + "]");
							String s1 = (String)data1[i][j];
							if (s1 == null) s1 = "";
							String s2 = (String)getJTable1().getModel().getValueAt(i,j);
							if (s2 == null) s2 = "";							
							if (!s1.equals(s2))
							{
								errbuff.append("mismatch at [" + i + ", " + j + "]; " +data1[i][j] + "!= " +getJTable1().getModel().getValueAt(i,j) + "\n");
								errorFound = true;	
							}
						}
					}
					if (errorFound)
					{
						results = errbuff.toString();
					}
					else
					{
						results = null;
					}

					
					
				}
			});			
		}
		return jButton1;
	}
	/**
	 * This method initializes jButton2
	 * 
	 * @return javax.swing.JButton
	 */
	private javax.swing.JButton getJButton2() {
		if(jButton2 == null) {
			jButton2 = new javax.swing.JButton();
			jButton2.setText("Clear");
			jButton2.addActionListener(new java.awt.event.ActionListener() { 
				public void actionPerformed(java.awt.event.ActionEvent e) {    
					switchDataModels();
				}

				private void switchDataModels() {
					jTable1.setModel(dtm2);

					dtm2.addTableModelListener(jTable1);
					
				}
			});
		}
		return jButton2;
	}
	/**
	 * This method initializes jButton2
	 * 
	 * @return javax.swing.JButton
	 */
	private javax.swing.JButton getJButton3() {
		if(jButton3 == null) {
			jButton3 = new javax.swing.JButton();
			jButton3.setText("Modify grid size");
			jButton3.addActionListener(new java.awt.event.ActionListener() { 
				public void actionPerformed(java.awt.event.ActionEvent e) {    
					promptForNewGridDimensions();
				}

				private void promptForNewGridDimensions() {
					String input = null;

					while(input == null) {
						input = JOptionPane.showInputDialog(getJContentPane(), "enter number of rows (between 1 and 10)");
						if (input != null)
						{
							try
							{
								rows = Integer.parseInt(input);
								if ((rows < 0) || (rows > 10))
								{
									input = null;
								}
							}
							catch(Exception e)
							{
								input = null;
							}
						}
					}
					input = null;
					while(input == null) {
						input = JOptionPane.showInputDialog(getJContentPane(), "enter number of columns (between 1 and 10)");
						if (input != null)
						{
							try
							{
								cols = Integer.parseInt(input);
								if ((cols < 0) || (cols > 10))
								{
									input = null;
								}
							}
							catch(Exception e)
							{
								input = null;
							}
						}
					}		
					getJButton().doClick(); //fire the "start" button	
					System.out.println("clicked");		

					
				}


			});
		}
		return jButton3;
	}
	/**
	 * This method initializes jTable1
	 * 
	 * @return javax.swing.JTable
	 */
	private javax.swing.JTable getJTable1() {
		if(jTable1 == null) {
			jTable1 = new javax.swing.JTable();
		}
		return jTable1;
	}
	/**
	 * This method initializes jScrollPane
	 * 
	 * @return javax.swing.JScrollPane
	 */
	private javax.swing.JScrollPane getJScrollPane() {
		if(jScrollPane == null) {
			jScrollPane = new javax.swing.JScrollPane();
			jScrollPane.setViewportView(getJTable1());
			jScrollPane.setHorizontalScrollBarPolicy(javax.swing.JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
		}
		return jScrollPane;
	}
}
