import java.awt.*;
import mlsoft.mct.*;
import java.util.Vector;
import java.sql.*;

public class MainFrame extends Frame implements MlGridListener
        {
	private GlobalResources		global;
	private GridBagLayout		layout;
	private GridBagConstraints	layoutConstraints;
	private DataGrid		displayGrid;
	private Label 			displayLabel;
	private Label			searchEditLabel;
	private UserInterface		uiPanel;
	private Panel			buttonPanel;
	private Button			searchButton;
	private Button			addButton;
	private Button			modifyButton;
	private Button			deleteButton;
	private Vector			gridContents;
	private Connection		jdbcConnection;
	private Statement		sqlStatement;

        public MainFrame()
                {
		global = new GlobalResources();
		defineGUI();
		connectToDataSource();
		gridContents = new Vector();
		}

	public void connectToDataSource()
		{
		try
			{
			Class.forName(global.getDriverClassLocation());
			System.out.println("Connecting to: " + global.getDataSourceName());
			jdbcConnection = DriverManager.getConnection(global.getDataSourceName());
			sqlStatement = jdbcConnection.createStatement();
			}
		catch(Exception e)
			{
			System.out.println("There was an error connecting to the DataSource: " + e);
			}
		}

	public void defineGUI()
		{
		setTitle(global.getTitleBar());
                setBackground(Color.lightGray);
                layout = new GridBagLayout();
                layoutConstraints = new GridBagConstraints();
                setLayout(layout);

		displayLabel = new Label(" Database Display");
		displayLabel.setBackground(new Color (100,0,100));
                displayLabel.setFont(new Font("Helvetica", Font.BOLD, 12));
                displayLabel.setForeground(Color.white);
                layout.setConstraints(displayLabel, 
			global.defineLayoutConstraints(0,0,4,1,0,0,1,1,
                                                GridBagConstraints.HORIZONTAL,
                                                GridBagConstraints.NORTH,
                                                5,5,5,5));
                add(displayLabel);

		displayGrid = new DataGrid(global);
		displayGrid.addMlGridListener(this);
                layout.setConstraints(displayGrid, global.defineLayoutConstraints(0,1,4,4,1,1,1,1,
                                                GridBagConstraints.BOTH,
                                                GridBagConstraints.NORTH,
                                                5,5,5,5));
                add(displayGrid);

		searchEditLabel = new Label(" Search/Edit Database");
		searchEditLabel.setBackground(new Color (100,0,100));
                searchEditLabel.setFont(new Font("Helvetica", Font.BOLD, 12));
                searchEditLabel.setForeground(Color.white);
                layout.setConstraints(searchEditLabel, global.defineLayoutConstraints(0,5,4,1,0,0,1,1,
                                                GridBagConstraints.HORIZONTAL,
                                                GridBagConstraints.NORTH,
                                                5,5,5,5));
                add(searchEditLabel);

		uiPanel = new UserInterface(global);
                layout.setConstraints(uiPanel, global.defineLayoutConstraints(0,6,4,1,0,0,1,1,
                                                GridBagConstraints.HORIZONTAL,
                                                GridBagConstraints.CENTER,
                                                5,5,5,5));
                add(uiPanel);

		buttonPanel = new Panel();
                layout.setConstraints(buttonPanel, global.defineLayoutConstraints(0,7,4,1,0,0,1,1,
                                                GridBagConstraints.HORIZONTAL,
                                                GridBagConstraints.CENTER,
                                                5,5,5,5));
                add(buttonPanel);

		searchButton = new Button(" Search ");
		buttonPanel.add(searchButton);

		addButton = new Button   ("  Add   ");
		buttonPanel.add(addButton);

		modifyButton = new Button(" Modify ");
		buttonPanel.add(modifyButton);

		deleteButton = new Button(" Delete ");
		buttonPanel.add(deleteButton);
                }

        public boolean handleEvent(Event evt)
                {
                if (evt.id == Event.WINDOW_DESTROY)
                        {
                        dispose();
                        }

		else if (evt.target == modifyButton &&
		    evt.id == Event.ACTION_EVENT)
			{
			int rowNumber = displayGrid.getSelectedRow();
			String row = (String) gridContents.elementAt(rowNumber);
			String updateSQL = "UPDATE " +
					   global.getTableName() +
					   " " + uiPanel.getSetClause() + 
					   " " + uiPanel.createWhereClauseExact(row);
			try
				{
				System.out.println("Updating database using: " + updateSQL);
				sqlStatement.executeUpdate(updateSQL);
				}
			catch (Exception e)
				{
				System.out.println("Update Error: " + e);
				}
			String insertString = uiPanel.getUserInputFieldValues();
			gridContents.removeElementAt(rowNumber);
			displayGrid.removeRows();		
			gridContents.addElement(insertString);
			displayGrid.addRow(insertString);
			}

		else if (evt.target == deleteButton &&
		    evt.id == Event.ACTION_EVENT)
			{
			int rowNumber = displayGrid.getSelectedRow();
			String deleteSQL = "DELETE FROM " +
					   global.getTableName() +
					   " " + uiPanel.getWhereClauseExact();
			try
				{
				System.out.println("Deleting from database using: " + deleteSQL);
				sqlStatement.executeUpdate(deleteSQL);
				}
			catch (Exception e)
				{
				System.out.println("Deletion Error: " + e);
				}

			gridContents.removeElementAt(rowNumber);
			displayGrid.removeRows();		
			}

		else if  (evt.target == addButton &&
		    evt.id == Event.ACTION_EVENT)
			{
			String insertString = uiPanel.getUserInputFieldValues();
			gridContents.addElement(insertString);
			displayGrid.addRow(insertString);
			String addSQL = "INSERT INTO " + global.getTableName() +
					 uiPanel.getInsertFieldList() +
					 uiPanel.getInsertValueList();
			try
				{
				System.out.println("Trying to Add with: " + addSQL);
				sqlStatement.executeUpdate(addSQL);
				}
			catch (SQLException e)
				{
				
				System.out.println("Problem with SQL: " + e);
				}
			}

		else if  (evt.target == searchButton &&
		    evt.id == Event.ACTION_EVENT)
			{
			displayGrid.removeAllRows();
			gridContents.removeAllElements();

			ResultSet results;
			String searchSQL = "SELECT * FROM " +
					    global.getTableName() + " " +
					    uiPanel.getWhereClause();
			try
				{
				System.out.println("Executing Search Query: " + searchSQL);
				results = sqlStatement.executeQuery(searchSQL);	
				System.out.println("Got the Results for your search...now parsing the returned rows");

				while (results.next())
					{
					String insertString = "";
					int counter;
					for (counter = 1; counter < global.getNumberOfFieldsInTable(); counter++)
						{
						insertString = insertString + results.getString(counter) + "|";
						}
					insertString = insertString + results.getString(counter);
					gridContents.addElement(insertString);
					displayGrid.addRow(insertString);
					}
				}

			catch(Exception e)
				{
				System.out.println("Problem Running Search Query: " + e);
				}
			}
                return super.handleEvent(evt);
                }


	public void onGridEvent(MlGridEvent event)
		{
		if (event.id == MlGridEvent.SELECT_ROW)
			{
			int rowNumber = displayGrid.getSelectedRow();
			String row = "";
			if (rowNumber < displayGrid.getNumberOfRows())
				{
				try
					{
					row = (String) gridContents.elementAt(rowNumber);
					}
				catch(Exception e)
					{
					System.out.println("Bad row number of " + rowNumber);
					}
				}
			Vector fields = global.parsePipeDelimitedLine(row);
			uiPanel.setUserInputFieldValues(fields);
			}
		}
        }

