package Utilities;

/*
 * DBUtility.java
 *
 * Created on December 23, 2001, 3:36 PM
 */

import ca.mb.armchair.DBAppBuilder.Beans.*;
import ca.mb.armchair.DBAppBuilder.Dialogs.*;
import java.sql.*;

/**
 * Simple utility for querying a database.
 *
 * @author  Dave Voorhis
 */
public class DBUtility extends javax.swing.JFrame {

    private ResultSetMetaDataTableModel mDTM = null;
    private int zoom = 10;
    
    /** Creates new DBUtility. */
    public DBUtility() {
        initComponents();
        jComboBoxConnection.setModel(DatabaseConnections.getComboBoxModel());
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    private void initComponents() {
        java.awt.GridBagConstraints gridBagConstraints;

        jPanel2 = new javax.swing.JPanel();
        jLabelConnection = new javax.swing.JLabel();
        jComboBoxConnection = new javax.swing.JComboBox();
        jLabelQuery = new javax.swing.JLabel();
        jPanel3 = new javax.swing.JPanel();
        jButtonExecute = new javax.swing.JButton();
        jButtonClear = new javax.swing.JButton();
        jScrollPane1 = new javax.swing.JScrollPane();
        jTextAreaQuery = new javax.swing.JTextArea();
        jButtonDatabases = new javax.swing.JButton();
        jPanel1 = new javax.swing.JPanel();
        jTabbedPane1 = new javax.swing.JTabbedPane();
        jScrollPane2 = new javax.swing.JScrollPane();
        jTableResultSet = new javax.swing.JTable();
        jScrollPane3 = new javax.swing.JScrollPane();
        jTextAreaResult = new javax.swing.JTextArea();
        jScrollPane4 = new javax.swing.JScrollPane();
        jTableMetaData = new javax.swing.JTable();

        setTitle("Interactive SQL");
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        jPanel2.setLayout(new java.awt.GridBagLayout());

        jPanel2.setMinimumSize(new java.awt.Dimension(200, 300));
        jPanel2.setPreferredSize(new java.awt.Dimension(770, 180));
        jLabelConnection.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        jLabelConnection.setText("Connection:");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 2);
        jPanel2.add(jLabelConnection, gridBagConstraints);

        jComboBoxConnection.setToolTipText("Select a database connection");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        jPanel2.add(jComboBoxConnection, gridBagConstraints);

        jLabelQuery.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        jLabelQuery.setText("Query:");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 1;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
        gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 2);
        jPanel2.add(jLabelQuery, gridBagConstraints);

        jButtonExecute.setMnemonic('x');
        jButtonExecute.setText("Execute");
        jButtonExecute.setToolTipText("Execute the SQL query");
        jButtonExecute.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                doExecute(evt);
            }
        });

        jPanel3.add(jButtonExecute);

        jButtonClear.setMnemonic('c');
        jButtonClear.setText("Clear");
        jButtonClear.setToolTipText("Clear query and all results");
        jButtonClear.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                doClear(evt);
            }
        });

        jPanel3.add(jButtonClear);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 2;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
        jPanel2.add(jPanel3, gridBagConstraints);

        jScrollPane1.setMinimumSize(new java.awt.Dimension(600, 100));
        jScrollPane1.setPreferredSize(new java.awt.Dimension(600, 100));
        jTextAreaQuery.setToolTipText("Enter a SQL query");
        jTextAreaQuery.setMinimumSize(new java.awt.Dimension(100, 13));
        jTextAreaQuery.setPreferredSize(new java.awt.Dimension(600, 50));
        jScrollPane1.setViewportView(jTextAreaQuery);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 1;
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        jPanel2.add(jScrollPane1, gridBagConstraints);

        jButtonDatabases.setText("...");
        jButtonDatabases.setToolTipText("Manage database connections");
        jButtonDatabases.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                doDatabases(evt);
            }
        });

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL;
        jPanel2.add(jButtonDatabases, gridBagConstraints);

        getContentPane().add(jPanel2, java.awt.BorderLayout.NORTH);

        jPanel1.setLayout(new java.awt.BorderLayout());

        jTabbedPane1.setToolTipText("Results of query");
        jScrollPane2.setToolTipText("ResultSet (query results)");
        jTableResultSet.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);
        jScrollPane2.setViewportView(jTableResultSet);

        jTabbedPane1.addTab("ResultSet", jScrollPane2);

        jScrollPane3.setToolTipText("Results of query in text format");
        jScrollPane3.setViewportView(jTextAreaResult);

        jTabbedPane1.addTab("Text", jScrollPane3);

        jScrollPane4.setToolTipText("Information about the query result");
        jTableMetaData.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);
        jScrollPane4.setViewportView(jTableMetaData);

        jTabbedPane1.addTab("Metadata", jScrollPane4);

        jPanel1.add(jTabbedPane1, java.awt.BorderLayout.CENTER);

        getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER);

        pack();
    }

    private void doDatabases(java.awt.event.ActionEvent evt) {
        new DialogDB().show();
        DatabaseConnections.load();
        jComboBoxConnection.setModel(DatabaseConnections.getComboBoxModel());        
    }

    private void doClear(java.awt.event.ActionEvent evt) {
        jTextAreaQuery.setText("");
        jTextAreaResult.setText("");
        jTableMetaData.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
            },
            new String [] {
            }));
        jTableResultSet.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {

            }
        ));
    }

    /** Set zoom factor */
    public void setZoom(int Zoom) {
        zoom = Zoom;
        if (mDTM==null)
            return;
        int maxWidth = 200;
        int minWidth = 50;
        for (int i = 0; i < jTableMetaData.getColumnCount(); i++)
            jTableMetaData.getColumnModel().getColumn(i).setPreferredWidth(maxWidth);
        for (int i = 1; i<=jTableResultSet.getColumnCount(); i++)
        {
            int preferredWidth, headingWidth;
            try {
                preferredWidth = mDTM.getResultSetMetaData().getColumnDisplaySize(i) * zoom;
                headingWidth = mDTM.getResultSetMetaData().getColumnName(i).length() * zoom;
            } catch (SQLException e) {
                preferredWidth = maxWidth;
                headingWidth = maxWidth;
            }                    
            if (headingWidth>preferredWidth)
                preferredWidth = headingWidth;
            if (preferredWidth > maxWidth)
                preferredWidth = maxWidth;
            if (preferredWidth < minWidth)
                preferredWidth = minWidth;
            jTableResultSet.getColumnModel().getColumn(i-1).setPreferredWidth(preferredWidth);
        }
    }

    /** Get zoom factor */
    public int getZoom() {
        return zoom;
    }
        
    /** Execute query on given connection and display results */
    public void executeQuery(String sql, DatabaseConnection d) {
        String output = "";
        if (d!=null)
        {
            ResultSet r = d.executeQuery(sql);
            if (r!=null)
            {
                jTableResultSet.setModel(new ResultSetTableModel(r));
                mDTM = new ResultSetMetaDataTableModel(r);
                jTableMetaData.setModel(mDTM);
                setZoom(getZoom());
                output = mDTM.getText();
            }
            else
            {
                jTableResultSet.setModel(new ResultSetTableModel());
                jTableMetaData.setModel(new ResultSetMetaDataTableModel());
                output = "1 Problem: Query did not execute.\n\n" + d.getStatus();
                mDTM = null;
            }   
        }
        else
        {
            jTableResultSet.setModel(new ResultSetTableModel());
            jTableMetaData.setModel(new ResultSetMetaDataTableModel());
            output = "1 Problem: Unable to open connection.";
            mDTM = null;
        }
        jTextAreaResult.setText(jTextAreaResult.getText() + "\n\n" + output);
    }
    
    /** Execute query and display results */
    public void executeQuery(String sql)
    {
        DatabaseConnection d=DatabaseConnections.getDatabaseConnectionFromSelection(jComboBoxConnection);
        executeQuery(sql, d);
    }
    
    private void doExecute(java.awt.event.ActionEvent evt) {
        executeQuery(jTextAreaQuery.getText());
    }

    /** Exit the form */
    private void exitForm(java.awt.event.WindowEvent evt) {
        dispose();
        System.exit(0);
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        new DBUtility().show();
    }

    // Variables declaration - do not modify
    private javax.swing.JLabel jLabelQuery;
    private javax.swing.JButton jButtonDatabases;
    private javax.swing.JPanel jPanel3;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane4;
    private javax.swing.JScrollPane jScrollPane3;
    private javax.swing.JTable jTableMetaData;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JButton jButtonClear;
    private javax.swing.JLabel jLabelConnection;
    private javax.swing.JComboBox jComboBoxConnection;
    private javax.swing.JTextArea jTextAreaResult;
    private javax.swing.JTable jTableResultSet;
    private javax.swing.JButton jButtonExecute;
    private javax.swing.JTabbedPane jTabbedPane1;
    private javax.swing.JTextArea jTextAreaQuery;
    // End of variables declaration

}
