package com.hackerdude.apps.sqlide.plugins.isql;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.StringReader;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JEditorPane;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumnModel;
import javax.swing.table.TableModel;
import com.hackerdude.apps.sqlide.ProgramIcons;
import com.hackerdude.apps.sqlide.components.ScrollableResultSetTableModel;
/**
* The panel with query results.
*
* @author David Martinez
* @version 1.0
*/
public class ResultSetPanel extends JPanel {
private BorderLayout borderLayout1 = new BorderLayout();
private JPanel pnlTitle = new JPanel();
private JLabel lblStatement = new JLabel();
private BorderLayout borderLayout4 = new BorderLayout();
public JTable tblResults = new JTable();
private JSplitPane splitTableAndLog = new JSplitPane();
private JEditorPane statusLog = new JEditorPane("text/html", "");
private JScrollPane spStatus = new JScrollPane();
public static final String PROPERTY_QUERY_REFRESH_REQUEST = "DATA_READ_REQUEST";
public static final String PROPERTY_SQL_EXCEPTION_REPORTED = "SQL_EXCEPTION_OCURRED";
public final Action ACTION_COMMIT = new CommitAction();
public final Action ACTION_ROLLBACK = new RollBackAction();
public final Action ACTION_DELETE = new DeleteRowAction();
public final Action ACTION_INSERT = new InsertRowAction();
Action viewClobAction;
JPanel pnlResultsPanel = new JPanel();
BorderLayout blBorderLayout = new BorderLayout();
JScrollPane resultScroll = new JScrollPane();
JPanel pnlUpdateButtonBar = new JPanel();
GridBagLayout gbGridBagLayout = new GridBagLayout();
JButton btnCommit = new JButton(ACTION_COMMIT);
JButton btnInsert = new JButton(ACTION_INSERT);
JButton btnDelete = new JButton(ACTION_DELETE);
JButton btnRollback = new JButton(ACTION_ROLLBACK);
ResultSet resultSet;
public ResultSetPanel() {
try {
jbInit();
pnlUpdateButtonBar.setVisible(false);
}
catch (Exception ex) {
ex.printStackTrace();
}
}
public void setViewClobAction(Action action) {
viewClobAction = action;
}
void jbInit() throws Exception {
tblResults.setToolTipText("This is the result table.");
tblResults.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
this.setLayout(borderLayout1);
lblStatement.setText("Statement");
pnlTitle.setLayout(borderLayout4);
statusLog.setToolTipText("");
statusLog.setText("<P>Ready.");
splitTableAndLog.setOrientation(JSplitPane.VERTICAL_SPLIT);
pnlResultsPanel.setLayout(blBorderLayout);
btnCommit.setMnemonic('C');
pnlUpdateButtonBar.setLayout(gbGridBagLayout);
btnInsert.setMnemonic('I');
btnDelete.setMnemonic('D');
spStatus.getViewport().add(statusLog);
this.add(pnlTitle, BorderLayout.NORTH);
pnlTitle.add(lblStatement, BorderLayout.CENTER);
splitTableAndLog.add(spStatus, JSplitPane.BOTTOM);
splitTableAndLog.add(pnlResultsPanel, JSplitPane.LEFT);
this.add(splitTableAndLog, BorderLayout.CENTER);
pnlResultsPanel.add(resultScroll, BorderLayout.CENTER);
pnlResultsPanel.add(pnlUpdateButtonBar, BorderLayout.EAST);
pnlUpdateButtonBar.add(btnDelete, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(5, 5, 0, 5), 0, 0));
pnlUpdateButtonBar.add(btnInsert, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0
,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(5, 5, 0, 5), 0, 0));
pnlUpdateButtonBar.add(btnCommit, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0
,GridBagConstraints.SOUTH, GridBagConstraints.HORIZONTAL, new Insets(20, 5, 0, 5), 0, 0));
pnlUpdateButtonBar.add(btnRollback, new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0
,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
tblResults.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
viewClobAction.actionPerformed(null);
}
}
});
resultScroll.getViewport().add(tblResults);
statusLog.setPreferredSize(new Dimension(getWidth(), 80));
statusLog.setMinimumSize(new Dimension(getWidth(), 80));
splitTableAndLog.setDividerLocation(-80);
}
public void setResultSetModel(TableColumnModel newColumnModel, TableModel newTableModel, ResultSet resultSet) {
tblResults.setModel(newTableModel);
tblResults.setColumnModel(newColumnModel);
this.resultSet = resultSet;
tblResults.updateUI();
resultScroll.validate();
try {
pnlUpdateButtonBar.setVisible( resultSet.getConcurrency() == ResultSet.CONCUR_UPDATABLE );
}
catch (Exception ex) {
}
}
public void clearResultSetModel() {
setResultSetModel(new DefaultTableColumnModel(), new DefaultTableModel(0,0), null);
}
public void clearStatusText() {
statusLog.setText("");
}
public void addStatusText(String text) {
String newText = "<FONT COLOR=\"BLACK\">"+text + "</FONT>\n";
_addText(newText);
}
public void addWarningText(String text) {
String newWarning = "<FONT COLOR=\"RED\"><B>"+text+"</B></FONT>\n";
_addText(newWarning);
}
public synchronized void _addText(String newText) {
try {
StringReader reader = new StringReader(newText);
int position = statusLog.getDocument().getLength()-1;
statusLog.getEditorKit().read(reader, statusLog.getDocument(), position);
reader.close();
}
catch (Exception ex) {
}
}
class DeleteRowAction extends AbstractAction {
public DeleteRowAction() {
super("Delete", ProgramIcons.getInstance().findIcon("images/DeleteRow.gif"));
}
public void actionPerformed(ActionEvent evt) {
try {
deleteRow(tblResults.getSelectedRow());
}
catch (SQLException ex) {
logSQLException(ex);
}
}
}
class InsertRowAction extends AbstractAction {
public InsertRowAction() {
super("Insert", ProgramIcons.getInstance().findIcon("images/NewRow.gif"));
}
public void actionPerformed(ActionEvent evt) {
if ( tblResults.getModel() instanceof ScrollableResultSetTableModel ) {
prepareInsertRow();
}
}
}
class RollBackAction extends AbstractAction {
public RollBackAction() {
super("Rollback", ProgramIcons.getInstance().findIcon("images/DataQuery.gif"));
}
public void actionPerformed(ActionEvent evt) {
try {
rollBack();
fireTableDataChanged();
}
catch (SQLException ex) {
logSQLException(ex);
}
}
}
class CommitAction extends AbstractAction {
public CommitAction() {
super("Commit", ProgramIcons.getInstance().findIcon("images/Save.gif"));
}
public void actionPerformed(ActionEvent evt) {
try {
saveInsertions();
resultSet.getStatement().getConnection().commit();
}
catch (SQLException ex) {
firePropertyChange(PROPERTY_SQL_EXCEPTION_REPORTED, null, ex);
addWarningText("Could Not Commit!");
logSQLException(ex);
try {
//resultSet.getStatement().getConnection().rollback();
rollBack();
addWarningText("Edits have been rolled back.");
} catch (SQLException ex1) {
firePropertyChange(PROPERTY_SQL_EXCEPTION_REPORTED, null, ex1);
addWarningText("Could not Roll Back!");
logSQLException(ex);
}
}
}
}
private void fireTableDataChanged() {
((AbstractTableModel)tblResults.getModel()).fireTableDataChanged();
}
private void deleteRow(int row) throws SQLException {
((ScrollableResultSetTableModel)tblResults.getModel()).deleteRow(row);
}
private void prepareInsertRow() {
((ScrollableResultSetTableModel)tblResults.getModel()).prepareInsertRow();
}
private void saveInsertions() throws SQLException {
((ScrollableResultSetTableModel)tblResults.getModel()).saveInsertions();
tblResults.getSelectionModel().setSelectionInterval(tblResults.getRowCount()-1,tblResults.getRowCount()-1 );
}
private void rollBack() throws SQLException {
((ScrollableResultSetTableModel)tblResults.getModel()).rollBack();
firePropertyChange(PROPERTY_QUERY_REFRESH_REQUEST, false, true);
}
public void logSQLException(SQLException exc) {
StringBuffer buffer = new StringBuffer();
String message = exc.getMessage();
buffer.append(message);
SQLException nextException = exc;
while ( ( nextException = nextException.getNextException() ) != null ) {
buffer.append("\n").append(nextException.getMessage());
}
addWarningText(buffer.toString());
}
}