Author: [EMAIL PROTECTED]
Date: Wed Oct 1 11:17:13 2008
New Revision: 2742
Modified:
trunk/src/ca/sqlpower/architect/swingui/query/ExecuteActionListener.java
trunk/src/ca/sqlpower/architect/swingui/query/QueryDialog.java
trunk/src/ca/sqlpower/architect/swingui/query/SQLQueryEntryPanel.java
trunk/src/ca/sqlpower/architect/swingui/query/messages.properties
Log:
Added tabs to the lower panel in the QueryDialog to display a log file as
well as the result. The result tab also has multiple tabs to display
multiple results from the same SQL statement.
The execute action of the SQLQueryEntryPanel now returns a list of result
sets and column counts to the listener so we can create multiple result
tables later.
Added new text to messages.properties for tab labels and such.
Modified:
trunk/src/ca/sqlpower/architect/swingui/query/ExecuteActionListener.java
==============================================================================
---
trunk/src/ca/sqlpower/architect/swingui/query/ExecuteActionListener.java
(original)
+++
trunk/src/ca/sqlpower/architect/swingui/query/ExecuteActionListener.java
Wed Oct 1 11:17:13 2008
@@ -20,12 +20,13 @@
package ca.sqlpower.architect.swingui.query;
import java.sql.ResultSet;
+import java.util.List;
/**
* A listener for executing queries in a [EMAIL PROTECTED] SQLQueryEntryPanel}.
*/
public interface ExecuteActionListener {
- public void sqlQueryExecuted(ResultSet rs);
+ public void sqlQueryExecuted(List<ResultSet> rs, List<Integer>
rowsAffected);
}
Modified: trunk/src/ca/sqlpower/architect/swingui/query/QueryDialog.java
==============================================================================
--- trunk/src/ca/sqlpower/architect/swingui/query/QueryDialog.java
(original)
+++ trunk/src/ca/sqlpower/architect/swingui/query/QueryDialog.java Wed Oct
1 11:17:13 2008
@@ -21,13 +21,13 @@
import java.awt.BorderLayout;
import java.sql.ResultSet;
+import java.util.List;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
-import javax.swing.JTable;
+import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
-import javax.swing.table.TableModel;
import javax.swing.tree.TreeModel;
import org.apache.log4j.Logger;
@@ -36,7 +36,6 @@
import ca.sqlpower.architect.swingui.ArchitectSwingSession;
import ca.sqlpower.architect.swingui.DBTree;
import ca.sqlpower.swingui.table.ResultSetTableFactory;
-import ca.sqlpower.swingui.table.ResultSetTableModel;
import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.layout.FormLayout;
@@ -48,28 +47,20 @@
private static Logger logger = Logger.getLogger(QueryDialog.class);
- /**
- * The table showing the result set. This can only be created when we
get
- * an actual ResultSet to avoid NPEs.
- */
- private JTable resultSetTable;
-
- /**
- * The scroll pane that contains the JTable displaying the results of
the
- * SQL query.
- */
- private JScrollPane tableScrollPane;
-
- /**
- * The text area attached to the table that users can type into for
filtering
- * the table.
- */
- private JTextArea tableFilterTextArea;
-
private final DBTree dbTree;
private SQLQueryEntryPanel queryEntryPanel;
+ private JTabbedPane tabPane;
+
+ /**
+ * Any results returned by SQL statement execution that does not
return a table
+ * will be placed here.
+ */
+ private JTextArea logTextArea;
+
+ private JTabbedPane tableTabPane;
+
/**
* Creates and displays the window for executing SQL queries.
*/
@@ -86,15 +77,25 @@
queryEntryPanel = new SQLQueryEntryPanel(session, dbTree);
queryEntryPanel.addExecuteAction(new ExecuteActionListener() {
- public void sqlQueryExecuted(ResultSet rs) {
- TableModel newModel = new ResultSetTableModel(rs);
- if (resultSetTable == null) {
- resultSetTable =
ResultSetTableFactory.createResultSetJTableWithSearch(rs,
tableFilterTextArea.getDocument());
- tableScrollPane.getViewport().add(resultSetTable);
+ public void sqlQueryExecuted(List<ResultSet> resultSets,
List<Integer> rowsAffected) {
+ tableTabPane.removeAll();
+ for (ResultSet rs : resultSets) {
+
tableTabPane.add(Messages.getString("SQLQuery.result"),
createResultSetTablePanel(rs));
+ }
+
+ logTextArea.setText("");
+ for (Integer i : rowsAffected) {
+
logTextArea.append(Messages.getString("SQLQuery.rowsAffected",
i.toString()));
+ logTextArea.append("\n\n");
}
- resultSetTable.setModel(newModel);
- resultSetTable.createDefaultColumnsFromModel();
- }});
+ }
+
+ });
+
+ tabPane = new JTabbedPane();
+ tableTabPane = new JTabbedPane();
+ logTextArea = new JTextArea();
+
buildUI(session);
}
@@ -103,19 +104,10 @@
JSplitPane queryPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
queryPane.add(queryEntryPanel, JSplitPane.TOP);
- tableFilterTextArea = new JTextArea();
- FormLayout tableAreaLayout = new FormLayout("pref, 10dlu,
pref:grow", "pref, 10dlu, fill:max(100dlu;pref):grow");
- DefaultFormBuilder tableAreaBuilder = new
DefaultFormBuilder(tableAreaLayout);
- tableAreaBuilder.setDefaultDialogBorder();
- tableAreaBuilder.append("Filter");
- tableAreaBuilder.append(tableFilterTextArea);
- tableAreaBuilder.nextLine();
- tableAreaBuilder.nextLine();
- resultSetTable = null;
- tableScrollPane = new JScrollPane();
- tableAreaBuilder.append(tableScrollPane, 3);
+ tabPane.add(Messages.getString("SQLQuery.log"), new
JScrollPane(logTextArea));
- queryPane.add(tableAreaBuilder.getPanel(), JSplitPane.BOTTOM);
+ tabPane.add(Messages.getString("SQLQuery.result"), tableTabPane);
+ queryPane.add(tabPane, JSplitPane.BOTTOM);
JSplitPane treePane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
treePane.add(new JScrollPane(dbTree), JSplitPane.LEFT);
@@ -123,6 +115,24 @@
setLayout(new BorderLayout());
add(treePane, BorderLayout.CENTER);
+ }
+
+ /**
+ * Creates a new JPanel that displays a table of the result set.
+ */
+ private JPanel createResultSetTablePanel(ResultSet rs) {
+ JTextArea tableFilterTextArea = new JTextArea();
+ FormLayout tableAreaLayout = new FormLayout("pref, 10dlu,
pref:grow", "pref, 10dlu, fill:min(pref;100dlu):grow");
+ DefaultFormBuilder tableAreaBuilder = new
DefaultFormBuilder(tableAreaLayout);
+ tableAreaBuilder.setDefaultDialogBorder();
+ tableAreaBuilder.append(Messages.getString("SQLQuery.filter"));
+ tableAreaBuilder.append(new JScrollPane(tableFilterTextArea));
+ tableAreaBuilder.nextLine();
+ tableAreaBuilder.nextLine();
+ JScrollPane tableScrollPane = new
JScrollPane(ResultSetTableFactory.createResultSetJTableWithSearch(rs,
tableFilterTextArea.getDocument()));
+ tableAreaBuilder.append(tableScrollPane, 3);
+
+ return tableAreaBuilder.getPanel();
}
}
Modified:
trunk/src/ca/sqlpower/architect/swingui/query/SQLQueryEntryPanel.java
==============================================================================
--- trunk/src/ca/sqlpower/architect/swingui/query/SQLQueryEntryPanel.java
(original)
+++ trunk/src/ca/sqlpower/architect/swingui/query/SQLQueryEntryPanel.java
Wed Oct 1 11:17:13 2008
@@ -221,7 +221,6 @@
}
Connection con = conMap.get(ds);
Statement stmt = null;
- ResultSet rs = null;
try {
stmt = con.createStatement();
try {
@@ -236,31 +235,41 @@
stmt.setMaxRows(rowLimit);
boolean sqlResult = stmt.execute(queryArea.getText());
+ boolean hasNext = true;
- if (sqlResult) {
- rs = stmt.getResultSet();
- CachedRowSet rowSet = new CachedRowSet();
- rowSet.populate(rs);
- logger.debug("Result set row count is " +
rowSet.size());
-
- for (ExecuteActionListener listener :
executeListeners) {
- listener.sqlQueryExecuted(rowSet);
+ List<ResultSet> resultSets = new ArrayList<ResultSet>();
+ List<Integer> rowsAffected = new ArrayList<Integer>();
+
+ while (hasNext) {
+ if (sqlResult) {
+ ResultSet rs = stmt.getResultSet();
+ CachedRowSet rowSet = new CachedRowSet();
+ rowSet.populate(rs);
+ logger.debug("Result set row count is " +
rowSet.size());
+ resultSets.add(rowSet);
+ rowsAffected.add(new Integer(rowSet.size()));
+ rs.close();
+ } else {
+ rowsAffected.add(new
Integer(stmt.getUpdateCount()));
+ logger.debug("Update count is : " +
stmt.getUpdateCount());
+ }
+ sqlResult = stmt.getMoreResults();
+ hasNext = !((sqlResult == false) &&
(stmt.getUpdateCount() == -1));
+ }
+
+ for (ExecuteActionListener listener : executeListeners) {
+ List<ResultSet> newRSList = new ArrayList<ResultSet>();
+ for (ResultSet rs : resultSets) {
+ CachedRowSet rowSet = new CachedRowSet();
+ rowSet.populate(rs);
+ newRSList.add(rowSet);
}
- } else {
- // TODO: Send the update count to the listeners.
- logger.debug("Update count is : " +
stmt.getUpdateCount());
+ listener.sqlQueryExecuted(resultSets, rowsAffected);
}
} catch (SQLException ex) {
SPSUtils.showExceptionDialogNoReport(getParent(),
Messages.getString("SQLQuery.failedConnectingToDB"), ex);
} finally {
- if (rs != null) {
- try {
- rs.close();
- } catch (SQLException ex) {
- ex.printStackTrace();
- }
- }
if (stmt != null) {
try {
stmt.close();
@@ -333,7 +342,7 @@
}
public void databaseRemoved(DatabaseListChangeEvent e) {
- if (databases.getSelectedItem().equals(e.getDataSource())) {
+ if (databases.getSelectedItem() != null &&
databases.getSelectedItem().equals(e.getDataSource())) {
databases.setSelectedItem(null);
}
Modified: trunk/src/ca/sqlpower/architect/swingui/query/messages.properties
==============================================================================
--- trunk/src/ca/sqlpower/architect/swingui/query/messages.properties
(original)
+++ trunk/src/ca/sqlpower/architect/swingui/query/messages.properties Wed
Oct 1 11:17:13 2008
@@ -13,4 +13,8 @@
SQLQuery.failedRollback=Rollback failed executing on the database.
SQLQuery.mangeConnections=Manage Connections...
SQLQuery.rollback=Rollback
-SQLQuery.rowLimit=Row Limit
\ No newline at end of file
+SQLQuery.rowLimit=Row Limit
+SQLQuery.rowsAffected=SQL statement affected {0} lines.
+SQLQuery.log=Log
+SQLQuery.filter=Filter
+SQLQuery.result=Result
\ No newline at end of file