Revision: 6134
http://squirrel-sql.svn.sourceforge.net/squirrel-sql/?rev=6134&view=rev
Author: gerdwagner
Date: 2011-01-08 14:38:28 +0000 (Sat, 08 Jan 2011)
Log Message:
-----------
Display errors in result tab
Modified Paths:
--------------
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/mainframe/MainFrame.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/DefaultSQLExecuterHandler.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/ISQLExecuterHandler.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/MessagePanel.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/SQLExecuterTask.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/ResultFrame.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/ResultTab.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/SQLHistoryController.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/SQLResultExecuterPanel.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/properties/SessionProperties.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/properties/SessionPropertiesBeanInfo.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/properties/SessionSQLPropertiesPanel.java
trunk/sql12/app/src/main/resources/net/sourceforge/squirrel_sql/client/gui/db/aliasproperties/I18NStrings.properties
trunk/sql12/app/src/main/resources/net/sourceforge/squirrel_sql/client/resources/squirrel.properties
trunk/sql12/app/src/main/resources/net/sourceforge/squirrel_sql/client/session/mainpanel/I18NStrings.properties
trunk/sql12/app/src/main/resources/net/sourceforge/squirrel_sql/client/session/properties/I18NStrings.properties
trunk/sql12/doc/src/main/resources/changes.txt
trunk/sql12/fw/src/main/java/net/sourceforge/squirrel_sql/fw/util/StringManager.java
trunk/sql12/fw/src/main/java/net/sourceforge/squirrel_sql/fw/util/StringUtilities.java
trunk/sql12/fw/src/main/java/net/sourceforge/squirrel_sql/fw/util/Utilities.java
trunk/sql12/plugins/laf/src/main/resources/net/sourceforge/squirrel_sql/plugins/laf/I18NStrings.properties
trunk/sql12/plugins/postgres/src/main/java/net/sourceforge/squirrel_sql/plugins/postgres/commands/handler/MessageSQLExecuterHandler.java
trunk/sql12/plugins/postgres/src/main/java/net/sourceforge/squirrel_sql/plugins/postgres/commands/handler/ProgressSQLExecuterHandler.java
trunk/sql12/plugins/postgres/src/main/java/net/sourceforge/squirrel_sql/plugins/postgres/explain/ExplainExecuterPanel.java
trunk/sql12/plugins/refactoring/src/main/java/net/sourceforge/squirrel_sql/plugins/refactoring/commands/AbstractRefactoringCommand.java
trunk/sql12/plugins/refactoring/src/main/java/net/sourceforge/squirrel_sql/plugins/refactoring/commands/AddLookupTableCommand.java
Added Paths:
-----------
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/CancelPanel.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/CancelPanelCtrl.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/CancelPanelListener.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/ErrorPanel.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/ErrorPanelListener.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/ISQLExecutionHandlerListener.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/SQLExecutionHandler.java
Modified: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/mainframe/MainFrame.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/mainframe/MainFrame.java 2011-01-03 01:58:23 UTC (rev 6133)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/mainframe/MainFrame.java 2011-01-08 14:38:28 UTC (rev 6134)
@@ -345,6 +345,7 @@
_splitPn.add(new JScrollPane(_msgPnl));
_splitPn.setResizeWeight(1);
+ _splitPn.setOneTouchExpandable(true);
//i18n[MainFrame.saveSize=Save size]
String key = s_stringMgr.getString("MainFrame.saveSize");
Modified: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/DefaultSQLExecuterHandler.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/DefaultSQLExecuterHandler.java 2011-01-03 01:58:23 UTC (rev 6133)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/DefaultSQLExecuterHandler.java 2011-01-08 14:38:28 UTC (rev 6134)
@@ -19,9 +19,9 @@
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.SQLWarning;
+import java.util.ArrayList;
import net.sourceforge.squirrel_sql.fw.datasetviewer.IDataSetUpdateableTableModel;
-import net.sourceforge.squirrel_sql.fw.util.ExceptionFormatter;
/**
* This default implementation of the sql executer handler simply notifies the
@@ -59,7 +59,7 @@
{
}
- public void sqlExecutionException(Throwable th, String postErrorString)
+ public String sqlExecutionException(Throwable th, String postErrorString)
{
String msg = "Error: ";
@@ -82,7 +82,8 @@
}
_session.showErrorMessage(msg);
- }
+ return msg;
+ }
public void sqlExecutionWarning(SQLWarning warn)
{
@@ -93,7 +94,7 @@
{
}
- public void sqlCloseExecutionHandler()
+ public void sqlCloseExecutionHandler(ArrayList<String> sqlExecErrorMsgs, String lastExecutedStatement)
{
}
}
\ No newline at end of file
Modified: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/ISQLExecuterHandler.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/ISQLExecuterHandler.java 2011-01-03 01:58:23 UTC (rev 6133)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/ISQLExecuterHandler.java 2011-01-08 14:38:28 UTC (rev 6134)
@@ -19,6 +19,7 @@
*/
import java.sql.ResultSet;
import java.sql.SQLWarning;
+import java.util.ArrayList;
import net.sourceforge.squirrel_sql.fw.datasetviewer.DataSetException;
import net.sourceforge.squirrel_sql.fw.datasetviewer.IDataSetUpdateableTableModel;
@@ -70,7 +71,7 @@
/** Called when the SQLExecutor terminates due to an exception
*/
- public void sqlExecutionException(Throwable ex, String postErrorString);
+ public String sqlExecutionException(Throwable th, String postErrorString);
/** Called when a SQLWarning is received during execuion of the sql*/
public void sqlExecutionWarning(SQLWarning warn);
@@ -84,6 +85,8 @@
* Tell the execution handler that we don't need it anymore
* In SQLExecutionHandler this will close the cancel panel.
*
+ * @param sqlExecErrorMsgs null if no error occurred
+ * @param lastExecutedStatement
*/
- public void sqlCloseExecutionHandler();
+ public void sqlCloseExecutionHandler(ArrayList<String> sqlExecErrorMsgs, String lastExecutedStatement);
}
\ No newline at end of file
Modified: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/MessagePanel.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/MessagePanel.java 2011-01-03 01:58:23 UTC (rev 6133)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/MessagePanel.java 2011-01-08 14:38:28 UTC (rev 6134)
@@ -56,8 +56,9 @@
/** Internationalized strings for this class. */
private static final StringManager s_stringMgr =
StringManagerFactory.getStringManager(MessagePanel.class);
+ public static final Color ERROR_MESSAGE_FG = new Color(255,102,102);
- /** Popup menu for this component. */
+ /** Popup menu for this component. */
private final TextPopupMenu _popupMenu = new MessagePanelPopupMenu();
/**
@@ -150,7 +151,7 @@
SimpleAttributeSet saSetErrorHistory = new SimpleAttributeSet();
//StyleConstants.setBackground(saSetErrorHistory, Color.pink);
- StyleConstants.setForeground(saSetErrorHistory, new Color(255,102,102));
+ StyleConstants.setForeground(saSetErrorHistory, ERROR_MESSAGE_FG);
_saSetHistoryBySaSet.put(_saSetError, saSetErrorHistory);
//
//////////////////////////////////////////////////////////////////
Modified: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/SQLExecuterTask.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/SQLExecuterTask.java 2011-01-03 01:58:23 UTC (rev 6133)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/SQLExecuterTask.java 2011-01-08 14:38:28 UTC (rev 6134)
@@ -31,6 +31,7 @@
import java.sql.SQLException;
import java.sql.SQLWarning;
import java.sql.Statement;
+import java.util.ArrayList;
import javax.swing.SwingUtilities;
@@ -143,6 +144,9 @@
String lastExecutedStatement = null;
int statementCount = 0;
final SessionProperties props = _session.getProperties();
+
+ ArrayList<String> sqlExecErrorMsgs = new ArrayList<String>();
+
try
{
final ISQLConnection conn = _session.getSQLConnection();
@@ -237,11 +241,11 @@
{
if(1 < statementCount)
{
- handleError(ex, "Error occured in:\n" + lastExecutedStatement);
+ sqlExecErrorMsgs.add(handleError(ex, "Error occured in:\n" + lastExecutedStatement));
}
else
{
- handleError(ex, null);
+ sqlExecErrorMsgs.add(handleError(ex, null));
}
}
}
@@ -266,11 +270,11 @@
{
if(props.getAbortOnError() && 1 < statementCount)
{
- handleError(ex, "Error occured in:\n" + lastExecutedStatement);
+ sqlExecErrorMsgs.add(handleError(ex, "Error occured in:\n" + lastExecutedStatement));
}
else
{
- handleError(ex, null);
+ sqlExecErrorMsgs.add(handleError(ex, null));
}
if(false == ex instanceof SQLException)
@@ -301,7 +305,7 @@
}
if (_handler != null)
{
- _handler.sqlCloseExecutionHandler();
+ _handler.sqlCloseExecutionHandler(sqlExecErrorMsgs, lastExecutedStatement);
}
if (schemaCheck) {
@@ -646,10 +650,14 @@
}
}
- private void handleError(Throwable th, String postErrorString)
+ private String handleError(Throwable th, String postErrorString)
{
if (_handler != null)
- _handler.sqlExecutionException(th, postErrorString);
+ {
+ return _handler.sqlExecutionException(th, postErrorString);
+ }
+
+ return null;
}
Added: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/CancelPanel.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/CancelPanel.java (rev 0)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/CancelPanel.java 2011-01-08 14:38:28 UTC (rev 6134)
@@ -0,0 +1,58 @@
+package net.sourceforge.squirrel_sql.client.session.mainpanel;
+
+import net.sourceforge.squirrel_sql.fw.util.StringManager;
+import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
+
+import javax.swing.*;
+import java.awt.*;
+
+public class CancelPanel extends JPanel
+{
+ private static final StringManager s_stringMgr = StringManagerFactory.getStringManager(CancelPanel.class);
+
+ JLabel sqlLbl = new JLabel();
+ JLabel currentStatusLbl = new JLabel();
+ JButton cancelBtn;
+
+
+ public CancelPanel()
+ {
+ super(new GridBagLayout());
+
+ // i18n[SQLResultExecuterPanel.cancelButtonLabel=Cancel]
+ String label = s_stringMgr.getString("SQLResultExecuterPanel.cancelButtonLabel");
+ cancelBtn = new JButton(label);
+
+ GridBagConstraints gbc = new GridBagConstraints();
+
+ gbc.anchor = GridBagConstraints.WEST;
+ gbc.insets = new Insets(5, 10, 5, 10);
+
+ gbc.gridx = 0;
+ gbc.gridy = 0;
+
+ // i18n[SQLResultExecuterPanel.sqlLabel=SQL:]
+ label = s_stringMgr.getString("SQLResultExecuterPanel.sqlLabel");
+ add(new JLabel(label), gbc);
+
+ gbc.weightx = 1;
+ ++gbc.gridx;
+ add(sqlLbl, gbc);
+
+ gbc.weightx = 0;
+ gbc.gridx = 0;
+ ++gbc.gridy;
+ // i18n[SQLResultExecuterPanel.statusLabel=Status:]
+ label =
+ s_stringMgr.getString("SQLResultExecuterPanel.statusLabel");
+ add(new JLabel(label), gbc);
+
+ ++gbc.gridx;
+ add(currentStatusLbl, gbc);
+
+ gbc.gridx = 0;
+ ++gbc.gridy;
+ gbc.fill = GridBagConstraints.NONE;
+ add(cancelBtn, gbc);
+ }
+}
Added: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/CancelPanelCtrl.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/CancelPanelCtrl.java (rev 0)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/CancelPanelCtrl.java 2011-01-08 14:38:28 UTC (rev 6134)
@@ -0,0 +1,112 @@
+package net.sourceforge.squirrel_sql.client.session.mainpanel;
+
+import net.sourceforge.squirrel_sql.fw.gui.GUIUtils;
+import net.sourceforge.squirrel_sql.fw.util.StringManager;
+import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
+
+import javax.swing.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+class CancelPanelCtrl
+{
+ private static final StringManager s_stringMgr = StringManagerFactory.getStringManager(CancelPanelCtrl.class);
+
+ private CancelPanel _panel;
+
+
+ /**
+ * Total number of queries that will be executed.
+ */
+ private int _queryCount;
+
+ /**
+ * Number of the query currently being executed (starts from 1).
+ */
+ private int _currentQueryIndex = 0;
+ private CancelPanelListener _listener;
+
+ CancelPanelCtrl(CancelPanelListener listener)
+ {
+ _listener = listener;
+ _panel = new CancelPanel();
+
+ _panel.cancelBtn.addActionListener(new ActionListener()
+ {
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+ onCancel();
+ }
+ });
+
+
+ }
+
+ void incCurrentQueryIndex()
+ {
+ ++_currentQueryIndex;
+ }
+
+ void setSQL(final String sql)
+ {
+ Runnable runnable = new Runnable()
+ {
+ public void run()
+ {
+ // i18n[SQLResultExecuterPanel.currentSQLLabel={0} of {1} - {2}]
+ String label =
+ s_stringMgr.getString("SQLResultExecuterPanel.currentSQLLabel",
+ new Object[]{String.valueOf(_currentQueryIndex),
+ String.valueOf(_queryCount),
+ sql});
+
+ _panel.sqlLbl.setText(label);
+ }
+ };
+
+ GUIUtils.processOnSwingEventThread(runnable);
+
+ }
+
+ void setStatusLabel(final String text)
+ {
+ Runnable runnable = new Runnable()
+ {
+ public void run()
+ {
+ _panel.currentStatusLbl.setText(text);
+ }
+ };
+
+ GUIUtils.processOnSwingEventThread(runnable);
+ }
+
+ void setQueryCount(int value)
+ {
+ _queryCount = value;
+ _currentQueryIndex = 0;
+ }
+
+ int getTotalCount()
+ {
+ return _queryCount;
+ }
+
+ int getCurrentQueryIndex()
+ {
+ return _currentQueryIndex;
+ }
+
+
+ private void onCancel()
+ {
+ _listener.cancelRequested();
+ }
+
+
+ CancelPanel getPanel()
+ {
+ return _panel;
+ }
+}
Added: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/CancelPanelListener.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/CancelPanelListener.java (rev 0)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/CancelPanelListener.java 2011-01-08 14:38:28 UTC (rev 6134)
@@ -0,0 +1,6 @@
+package net.sourceforge.squirrel_sql.client.session.mainpanel;
+
+public interface CancelPanelListener
+{
+ void cancelRequested();
+}
Added: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/ErrorPanel.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/ErrorPanel.java (rev 0)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/ErrorPanel.java 2011-01-08 14:38:28 UTC (rev 6134)
@@ -0,0 +1,206 @@
+package net.sourceforge.squirrel_sql.client.session.mainpanel;
+
+import net.sourceforge.squirrel_sql.client.action.SquirrelAction;
+import net.sourceforge.squirrel_sql.client.session.ISession;
+import net.sourceforge.squirrel_sql.client.session.MessagePanel;
+import net.sourceforge.squirrel_sql.fw.util.StringManager;
+import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
+import net.sourceforge.squirrel_sql.fw.util.StringUtilities;
+import net.sourceforge.squirrel_sql.fw.util.Utilities;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.datatransfer.Clipboard;
+import java.awt.datatransfer.StringSelection;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.util.ArrayList;
+
+public class ErrorPanel extends JPanel
+{
+ private static final StringManager s_stringMgr = StringManagerFactory.getStringManager(ErrorPanel.class);
+ private ErrorPanelListener _errorPanelListener;
+
+ private JPopupMenu _popUp = new JPopupMenu();
+ private JTextArea _txtArea;
+
+
+ public ErrorPanel(ISession session, ArrayList<String> sqlExecErrorMsgs, String lastExecutedStatement)
+ {
+ super(new BorderLayout());
+
+ _txtArea = new JTextArea();
+
+ _txtArea.setFont(_txtArea.getFont().deriveFont(Font.BOLD));
+ _txtArea.setForeground(Color.red);
+ _txtArea.setSelectedTextColor(Color.red);
+ _txtArea.setEditable(false);
+
+
+
+ for (int i = 0; i < sqlExecErrorMsgs.size(); i++)
+ {
+ _txtArea.append(sqlExecErrorMsgs.get(i));
+
+ if(i < sqlExecErrorMsgs.size() - 1)
+ {
+ _txtArea.append("\n\n");
+ }
+ }
+
+ JScrollPane scrp = new JScrollPane(_txtArea);
+
+
+ add(createNorthPanel(session, sqlExecErrorMsgs, lastExecutedStatement), BorderLayout.NORTH);
+ add(scrp, BorderLayout.CENTER);
+
+ initPopup();
+
+ scrp.scrollRectToVisible(new Rectangle(0,0,1,1));
+ }
+
+ private void initPopup()
+ {
+ JMenuItem mnuCopyAll = new JMenuItem(s_stringMgr.getString("ErrorPanel.copyAll"));
+ mnuCopyAll.addActionListener(new ActionListener()
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ onCopyAll();
+ }
+ });
+ _popUp.add(mnuCopyAll);
+
+ JMenuItem mnuCopySelection = new JMenuItem(s_stringMgr.getString("ErrorPanel.copySelection"));
+ mnuCopySelection.addActionListener(new ActionListener()
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ onCopySelection();
+ }
+ });
+ _popUp.add(mnuCopySelection);
+
+
+ _txtArea.addMouseListener(new MouseAdapter()
+ {
+ public void mousePressed(MouseEvent evt)
+ {
+ maybeShowPopup(evt);
+ }
+
+ public void mouseReleased(MouseEvent evt)
+ {
+ maybeShowPopup(evt);
+ }
+
+ });
+
+
+ }
+
+ private void onCopyAll()
+ {
+ if(null == _txtArea.getText())
+ {
+ return;
+ }
+
+ Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
+ StringSelection data = new StringSelection(_txtArea.getText().trim());
+ clip.setContents(data, data);
+ }
+
+ private void onCopySelection()
+ {
+ if(null == _txtArea.getSelectedText())
+ {
+ return;
+ }
+
+ Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
+ StringSelection data = new StringSelection(_txtArea.getSelectedText().trim());
+ clip.setContents(data, data);
+ }
+
+ private JPanel createNorthPanel(ISession session, ArrayList<String> sqlExecErrorMsgs, String lastExecutedStatement)
+ {
+ JPanel ret = new JPanel(new GridBagLayout());
+
+
+ String msg = s_stringMgr.getString("ErrorPanel.NoErrorStatement") ;
+ if(1 < sqlExecErrorMsgs.size() && false == session.getProperties().getAbortOnError())
+ {
+ msg = s_stringMgr.getString("ErrorPanel.MultibleStatements") ;
+ }
+ else if(null != lastExecutedStatement && 0 < lastExecutedStatement.trim().length())
+ {
+ msg = s_stringMgr.getString("ErrorPanel.occuredIn", StringUtilities.cleanString(lastExecutedStatement.trim())) ;
+ }
+
+ String escapedMsg = Utilities.escapeHtmlChars(msg);
+ String htmlMsg = "<html><pre> " + escapedMsg + "</pre></html>";
+
+
+ GridBagConstraints gbc;
+
+ gbc = new GridBagConstraints(0,0,1,1,1,1, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(0,0,0,5),0,0 );
+ ret.add(new JLabel(htmlMsg), gbc);
+
+
+
+ gbc = new GridBagConstraints(1,0,1,1,0,0, GridBagConstraints.NORTHEAST, GridBagConstraints.NONE, new Insets(0,0,0,0),0,0 );
+ ret.add(new TabButton(new CloseAction(session)), gbc);
+
+ return ret;
+ }
+
+ public void setErrorPanelListener(ErrorPanelListener errorPanelListener)
+ {
+ _errorPanelListener = errorPanelListener;
+ }
+
+ private class CloseAction extends SquirrelAction
+ {
+ CloseAction(ISession session)
+ {
+ super(
+ session.getApplication(),
+ session.getApplication().getResources());
+ }
+
+ public void actionPerformed(ActionEvent evt)
+ {
+ closeTab();
+ }
+ }
+
+ private void closeTab()
+ {
+ _errorPanelListener.removeErrorPanel(this);
+ }
+
+ private final class TabButton extends JButton
+ {
+ TabButton(Action action)
+ {
+ super(action);
+ setMargin(new Insets(0, 0, 0, 0));
+ setBorderPainted(false);
+ setText("");
+ }
+ }
+
+
+ private void maybeShowPopup(MouseEvent evt)
+ {
+ if (evt.isPopupTrigger())
+ {
+ _popUp.show(evt.getComponent(), evt.getX(), evt.getY());
+ }
+ }
+
+
+}
Added: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/ErrorPanelListener.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/ErrorPanelListener.java (rev 0)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/ErrorPanelListener.java 2011-01-08 14:38:28 UTC (rev 6134)
@@ -0,0 +1,6 @@
+package net.sourceforge.squirrel_sql.client.session.mainpanel;
+
+public interface ErrorPanelListener
+{
+ public void removeErrorPanel(ErrorPanel errorPanel);
+}
Added: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/ISQLExecutionHandlerListener.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/ISQLExecutionHandlerListener.java (rev 0)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/ISQLExecutionHandlerListener.java 2011-01-08 14:38:28 UTC (rev 6134)
@@ -0,0 +1,22 @@
+package net.sourceforge.squirrel_sql.client.session.mainpanel;
+
+import net.sourceforge.squirrel_sql.client.session.SQLExecutionInfo;
+import net.sourceforge.squirrel_sql.fw.datasetviewer.IDataSetUpdateableTableModel;
+import net.sourceforge.squirrel_sql.fw.datasetviewer.ResultSetDataSet;
+import net.sourceforge.squirrel_sql.fw.datasetviewer.ResultSetMetaDataDataSet;
+
+public interface ISQLExecutionHandlerListener
+{
+ void addResultsTab(SQLExecutionInfo info,
+ ResultSetDataSet rsds,
+ ResultSetMetaDataDataSet rsmdds,
+ IDataSetUpdateableTableModel model,
+ IResultTab resultTabToReplace);
+
+
+ void removeCancelPanel(CancelPanelCtrl cancelPanelCtrl, IResultTab resultTabToReplace);
+
+ void setCancelPanel(CancelPanelCtrl cancelPanelCtrl);
+
+ void addErrorPanel(ErrorPanel errorPanel);
+}
Modified: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/ResultFrame.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/ResultFrame.java 2011-01-03 01:58:23 UTC (rev 6133)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/ResultFrame.java 2011-01-08 14:38:28 UTC (rev 6134)
@@ -159,4 +159,9 @@
return session.getTitle() + " - " + tab.getViewableSqlString();
}
+
+ public IResultTab getTab()
+ {
+ return _tab;
+ }
}
Modified: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/ResultTab.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/ResultTab.java 2011-01-03 01:58:23 UTC (rev 6133)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/ResultTab.java 2011-01-08 14:38:28 UTC (rev 6134)
@@ -53,6 +53,7 @@
import net.sourceforge.squirrel_sql.client.session.SQLExecutionInfo;
import net.sourceforge.squirrel_sql.client.session.EditableSqlCheck;
import net.sourceforge.squirrel_sql.client.session.properties.SessionProperties;
+import net.sourceforge.squirrel_sql.fw.util.Utilities;
public class ResultTab extends JPanel implements IHasIdentifier, IResultTab
{
@@ -143,7 +144,7 @@
_session = session;
_sqlPanel = sqlPanel;
_id = id;
- reInit(creator, exInfo);
+ init(creator, exInfo);
createGUI();
@@ -153,7 +154,7 @@
/**
* @see net.sourceforge.squirrel_sql.client.session.mainpanel.IResultTab#reInit(net.sourceforge.squirrel_sql.fw.datasetviewer.IDataSetUpdateableTableModel, net.sourceforge.squirrel_sql.client.session.SQLExecutionInfo)
*/
- private void reInit(IDataSetUpdateableTableModel creator, SQLExecutionInfo exInfo)
+ private void init(IDataSetUpdateableTableModel creator, SQLExecutionInfo exInfo)
{
_creator = creator;
_creator.addListener(new DataSetUpdateableTableModelListener()
@@ -245,7 +246,7 @@
final int rowCount = _resultSetOutput.getRowCount();
final int maxRows =_exInfo.getMaxRows();
- String escapedSql = escapeHtmlChars(_sql);
+ String escapedSql = Utilities.escapeHtmlChars(_sql);
if (maxRows > 0 && rowCount >= maxRows)
{
@@ -272,15 +273,6 @@
_queryInfoPanel.load(rsds, rowCount, exInfo);
}
- private String escapeHtmlChars(String sql)
- {
- String buf = sql.replaceAll("&", "&");
- buf = buf.replaceAll("<", "<");
- buf = buf.replaceAll("<", ">");
- buf = buf.replaceAll("\"", """);
- return buf;
- }
-
/**
* @see net.sourceforge.squirrel_sql.client.session.mainpanel.IResultTab#clear()
*/
@@ -334,7 +326,7 @@
public void closeTab()
{
add(_tp, BorderLayout.CENTER);
- _sqlPanel.closeTab(this);
+ _sqlPanel.closeResultTab(this);
}
/**
@@ -518,7 +510,7 @@
public void actionPerformed(ActionEvent evt)
{
- _sqlPanel.createWindow(ResultTab.this);
+ _sqlPanel.createSQLResultFrame(ResultTab.this);
}
}
Added: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/SQLExecutionHandler.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/SQLExecutionHandler.java (rev 0)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/SQLExecutionHandler.java 2011-01-08 14:38:28 UTC (rev 6134)
@@ -0,0 +1,457 @@
+package net.sourceforge.squirrel_sql.client.session.mainpanel;
+
+import net.sourceforge.squirrel_sql.client.preferences.SquirrelPreferences;
+import net.sourceforge.squirrel_sql.client.session.ISQLExecuterHandler;
+import net.sourceforge.squirrel_sql.client.session.ISession;
+import net.sourceforge.squirrel_sql.client.session.SQLExecuterTask;
+import net.sourceforge.squirrel_sql.client.session.SQLExecutionInfo;
+import net.sourceforge.squirrel_sql.client.session.event.ISQLExecutionListener;
+import net.sourceforge.squirrel_sql.client.session.properties.SessionProperties;
+import net.sourceforge.squirrel_sql.fw.datasetviewer.DataSetException;
+import net.sourceforge.squirrel_sql.fw.datasetviewer.IDataSetUpdateableTableModel;
+import net.sourceforge.squirrel_sql.fw.datasetviewer.ResultSetDataSet;
+import net.sourceforge.squirrel_sql.fw.datasetviewer.ResultSetMetaDataDataSet;
+import net.sourceforge.squirrel_sql.fw.dialects.DialectFactory;
+import net.sourceforge.squirrel_sql.fw.dialects.DialectType;
+import net.sourceforge.squirrel_sql.fw.sql.SQLExecutionException;
+import net.sourceforge.squirrel_sql.fw.util.StringManager;
+import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
+import net.sourceforge.squirrel_sql.fw.util.StringUtilities;
+import net.sourceforge.squirrel_sql.fw.util.log.ILogger;
+import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
+
+import java.sql.ResultSet;
+import java.sql.SQLWarning;
+import java.text.NumberFormat;
+import java.util.ArrayList;
+
+/**
+ * This class is the handler for the execution of sql against the SQLExecuterPanel
+ */
+class SQLExecutionHandler implements ISQLExecuterHandler
+{
+ private static final ILogger s_log =
+ LoggerController.createLogger(SQLExecutionHandler.class);
+
+ private static final StringManager s_stringMgr =
+ StringManagerFactory.getStringManager(SQLExecutionHandler.class);
+
+
+ private CancelPanelCtrl _cancelPanelCtrl;
+ private SQLExecuterTask _executer;
+ private ISession _session;
+ private ISQLExecutionHandlerListener _executionHandlerListener;
+
+ private static enum SQLType
+ {
+ INSERT, SELECT, UPDATE, DELETE, UNKNOWN
+ }
+
+
+
+ /**
+ * Hold onto the current ResultDataSet so if the execution is
+ * cancelled then this can be cancelled.
+ */
+ private ResultSetDataSet rsds = null;
+
+ private String sqlToBeExecuted = null;
+ private SQLType sqlType = null;
+ private IResultTab _resultTabToReplace;
+ private boolean _largeScript = false;
+ private double _scriptTotalTime = 0;
+ private double _scriptQueryTime = 0;
+ private double _scriptOutptutTime = 0;
+ private int _scriptRowsInserted = 0;
+ private int _scriptRowsSelected = 0;
+ private int _scriptRowsUpdated = 0;
+ private int _scriptRowsDeleted = 0;
+
+ public SQLExecutionHandler(IResultTab resultTabToReplace,
+ ISession session,
+ String sql,
+ ISQLExecutionHandlerListener executionHandlerListener,
+ ISQLExecutionListener[] executionListeners)
+ {
+ _session = session;
+ _executionHandlerListener = executionHandlerListener;
+
+
+ _executer = new SQLExecuterTask(_session, sql, this, executionListeners);
+ SquirrelPreferences prefs = _session.getApplication().getSquirrelPreferences();
+
+ if (prefs.getLargeScriptStmtCount() > 0
+ && _executer.getQueryCount() > prefs.getLargeScriptStmtCount())
+ {
+ _executer.setExecutionListeners(new ISQLExecutionListener[0]);
+ setLargeScript(true);
+ }
+
+
+
+ _resultTabToReplace = resultTabToReplace;
+ _cancelPanelCtrl = new CancelPanelCtrl(new CancelPanelListener()
+ {
+ @Override
+ public void cancelRequested()
+ {
+ onCancelRequested();
+ }
+ });
+ _executionHandlerListener.setCancelPanel(_cancelPanelCtrl);
+
+
+
+
+ _session.getApplication().getThreadPool().addTask(_executer);
+ }
+
+ private void onCancelRequested()
+ {
+ try
+ {
+ if (_executer != null)
+ {
+ _executer.cancel();
+ }
+ }
+ catch (Throwable th)
+ {
+ s_log.error("Error occured cancelling SQL", th);
+ }
+ }
+
+ /**
+ * Set whether or not the script is large. If the script is large, then
+ * do some performance optimizations with the GUI so that it remains
+ * responsive. If the UI is not responsive, then the user is not able
+ * to see what is happening, nor are they able to control it (cancelling
+ * becomes ineffective)
+ *
+ * @param aBoolean whether or not the script is large.
+ */
+ public void setLargeScript(boolean aBoolean)
+ {
+ _largeScript = aBoolean;
+ }
+
+ /**
+ * Determines whether or not the current statement SQL should be rendered.
+ * Since too many statements can cause the UI to stop rendering the
+ * statements, we back off rendering after many statements so that the UI
+ * can continue to provide feedback to the user.
+ *
+ * @param current
+ * @param total
+ * @return
+ */
+ private boolean shouldRenderSQL(int current, int total)
+ {
+ if (!_largeScript)
+ {
+ return true;
+ }
+ boolean result = true;
+ // Back-off a bit after a hundred updates to allow the UI to update
+ if (total > 200 && current > 100 && current % 10 != 0)
+ {
+ result = false;
+ }
+ if (total > 1000 && current > 500 && current % 50 != 0)
+ {
+ result = false;
+ }
+ if (total > 2000 && current > 1000 && current % 100 != 0)
+ {
+ result = false;
+ }
+ return result;
+ }
+
+ public void sqlToBeExecuted(final String sql)
+ {
+ _cancelPanelCtrl.incCurrentQueryIndex();
+ int currentStmtCount = _cancelPanelCtrl.getCurrentQueryIndex();
+ if (!shouldRenderSQL(currentStmtCount, _cancelPanelCtrl.getTotalCount()))
+ {
+ return;
+ }
+ final String cleanSQL = StringUtilities.cleanString(sql);
+ sqlToBeExecuted = cleanSQL;
+ sqlType = getSQLType(cleanSQL);
+
+ _cancelPanelCtrl.setSQL(sqlToBeExecuted);
+
+ // i18n[SQLResultExecuterPanel.execStatus=Executing SQL...]
+ String status = s_stringMgr.getString("SQLResultExecuterPanel.execStatus");
+ _cancelPanelCtrl.setStatusLabel(status);
+ }
+
+ private SQLType getSQLType(String sql)
+ {
+ SQLType result = SQLType.UNKNOWN;
+ if (sql.toLowerCase().startsWith("insert"))
+ {
+ result = SQLType.INSERT;
+ }
+ if (sql.toLowerCase().startsWith("update"))
+ {
+ result = SQLType.UPDATE;
+ }
+ if (sql.toLowerCase().startsWith("select"))
+ {
+ result = SQLType.SELECT;
+ }
+ if (sql.toLowerCase().startsWith("delete"))
+ {
+ result = SQLType.DELETE;
+ }
+ return result;
+ }
+
+
+ /**
+ * This will - depending on the size of the script - print a message
+ * indicating the time that it took to execute one or more queries.
+ * When executing a large script (as defined by the user, but default is
+ * > 200 statements) we don't want to keep sending messages to the
+ * message panel, otherwise the UI will get behind and slow the execution
+ * of the script and prevent the user from cancelling the operation. So
+ * this method will track the total time when executing a large script,
+ * otherwise for small scripts it puts out a message for every statement.
+ */
+ public void sqlExecutionComplete(SQLExecutionInfo exInfo,
+ int processedStatementCount,
+ int statementCount)
+ {
+ double executionLength = ((double) exInfo.getSQLExecutionElapsedMillis()) / 1000;
+ double outputLength = ((double) exInfo.getResultsProcessingElapsedMillis()) / 1000;
+ double totalLength = executionLength + outputLength;
+ Integer numberResultRowsRead = exInfo.getNumberResultRowsRead();
+
+ if (_largeScript)
+ {
+ // Track the time in aggregate for the script.
+ _scriptQueryTime += executionLength;
+ _scriptOutptutTime += outputLength;
+ _scriptTotalTime += totalLength;
+
+ // When we get to the last statement, if the script is large,
+ // show the user the total execution time.
+ if (statementCount == processedStatementCount)
+ {
+ printScriptExecDetails(statementCount,
+ _scriptQueryTime,
+ _scriptOutptutTime,
+ _scriptTotalTime);
+ }
+ }
+ else
+ {
+ printStatementExecTime(
+ processedStatementCount,
+ statementCount,
+ numberResultRowsRead,
+ executionLength,
+ outputLength,
+ totalLength);
+ }
+ }
+
+ private void printScriptExecDetails(int statementCount,
+ double executionLength,
+ double outputLength,
+ double totalLength)
+ {
+ final NumberFormat nbrFmt = NumberFormat.getNumberInstance();
+
+ Object[] args = new Object[]{
+ Integer.valueOf(statementCount),
+ nbrFmt.format(totalLength),
+ nbrFmt.format(executionLength),
+ nbrFmt.format(outputLength)
+ };
+
+ //i18n[SQLResultExecuterPanel.scriptQueryStatistics=Executed {0}
+ //queries; elapsed time (seconds) - Total: {1}, SQL query: {2},
+ //Building output: {3}]
+ String stats = s_stringMgr.getString("SQLResultExecuterPanel.scriptQueryStatistics", args);
+
+ String[] counts =
+ new String[]{Integer.toString(_scriptRowsInserted),
+ Integer.toString(_scriptRowsSelected),
+ Integer.toString(_scriptRowsUpdated),
+ Integer.toString(_scriptRowsDeleted)};
+
+ //i18n[SQLResultExecuterPanel.scriptStmtCounts=Row update
+ //counts: {0} Inserts, {1} Selects, {2} Updates, {3} Deletes
+ String msg =
+ s_stringMgr.getString("SQLResultExecuterPanel.scriptStmtCounts", counts);
+
+ _session.showMessage(msg);
+ _session.showMessage(stats);
+ }
+
+ private void printStatementExecTime(
+ int processedStatementCount,
+ int statementCount,
+ Integer numberResultRowsRead,
+ double executionLength,
+ double outputLength,
+ double totalLength)
+ {
+ final NumberFormat nbrFmt = NumberFormat.getNumberInstance();
+
+ Object[] args = new Object[]{
+ Integer.valueOf(processedStatementCount),
+ Integer.valueOf(statementCount),
+ numberResultRowsRead == null ? 0 : numberResultRowsRead,
+ nbrFmt.format(totalLength),
+ nbrFmt.format(executionLength),
+ nbrFmt.format(outputLength)
+ };
+
+ //i18n[SQLResultExecuterPanel.queryStatistics=Query {0} of {1}
+ //elapsed time (seconds) - Total: {2}, SQL query: {3},
+ //Building output: {4}]
+ String stats = s_stringMgr.getString("SQLResultExecuterPanel.queryStatistics", args);
+
+ _session.showMessage(stats);
+ }
+
+ public void sqlExecutionCancelled()
+ {
+ if (rsds != null)
+ {
+ rsds.cancelProcessing();
+ }
+ // i18n[SQLResultExecuterPanel.canceleRequested=Query execution cancel requested by user.]
+// String canc =
+// s_stringMgr.getString("SQLResultExecuterPanel.canceleRequested");
+// getSession().getMessageHandler().showMessage(canc);
+ }
+
+ public void sqlDataUpdated(int updateCount)
+ {
+
+ Integer count = Integer.valueOf(updateCount);
+ String msg = "";
+
+ switch (sqlType)
+ {
+ case INSERT:
+ if (_largeScript)
+ {
+ _scriptRowsInserted++;
+ }
+ else
+ {
+ // i18n[SQLResultExecuterPanel.rowsUpdated={0} Row(s) Inserted]
+ msg = s_stringMgr.getString("SQLResultExecuterPanel.rowsInserted", count);
+ }
+ break;
+ case SELECT:
+ if (_largeScript)
+ {
+ _scriptRowsSelected++;
+ }
+ else
+ {
+ // i18n[SQLResultExecuterPanel.rowsSelected={0} Row(s) Selected]
+ msg = s_stringMgr.getString("SQLResultExecuterPanel.rowsSelected", count);
+ }
+ break;
+ case UPDATE:
+ if (_largeScript)
+ {
+ _scriptRowsUpdated++;
+ }
+ else
+ {
+ // i18n[SQLResultExecuterPanel.rowsUpdated={0} Row(s) Updated]
+ msg = s_stringMgr.getString("SQLResultExecuterPanel.rowsUpdated", count);
+ }
+ break;
+ case DELETE:
+ if (_largeScript)
+ {
+ _scriptRowsDeleted++;
+ }
+ else
+ {
+ // i18n[SQLResultExecuterPanel.rowsDeleted={0} Row(s) Deleted]
+ msg = s_stringMgr.getString("SQLResultExecuterPanel.rowsDeleted", count);
+ }
+ break;
+ }
+ if (_largeScript)
+ {
+ return;
+ }
+ _session.showMessage(msg);
+ }
+
+ public void sqlResultSetAvailable(ResultSet rs, SQLExecutionInfo info, IDataSetUpdateableTableModel model)
+ throws DataSetException
+ {
+ // i18n[SQLResultExecuterPanel.outputStatus=Building output...]
+ String outputStatus = s_stringMgr.getString("SQLResultExecuterPanel.outputStatus");
+
+ _cancelPanelCtrl.setStatusLabel(outputStatus);
+ rsds = new ResultSetDataSet();
+
+ SessionProperties props = _session.getProperties();
+
+ ResultSetMetaDataDataSet rsmdds = null;
+ if (props.getShowResultsMetaData())
+ {
+ rsmdds = new ResultSetMetaDataDataSet(rs);
+ }
+ DialectType dialectType =
+ DialectFactory.getDialectType(_session.getMetaData());
+ info.setNumberResultRowsRead(rsds.setResultSet(rs, dialectType));
+
+ _executionHandlerListener.addResultsTab(info, rsds, rsmdds, model, _resultTabToReplace);
+ rsds = null;
+ }
+
+ public void sqlExecutionWarning(SQLWarning warn)
+ {
+ _session.showMessage(warn);
+ }
+
+ public void sqlStatementCount(int statementCount)
+ {
+ _cancelPanelCtrl.setQueryCount(statementCount);
+ }
+
+ public void sqlCloseExecutionHandler(ArrayList<String> sqlExecErrorMsgs, String lastExecutedStatement)
+ {
+ _executionHandlerListener.removeCancelPanel(_cancelPanelCtrl, _resultTabToReplace);
+
+ if (null != sqlExecErrorMsgs && 0 < sqlExecErrorMsgs.size() && _session.getProperties().getShowSQLErrorsInTab())
+ {
+ _executionHandlerListener.addErrorPanel(new ErrorPanel(_session, sqlExecErrorMsgs, lastExecutedStatement));
+ }
+
+ _executer = null;
+ }
+
+ public String sqlExecutionException(Throwable th, String postErrorString)
+ {
+ SQLExecutionException ex =
+ new SQLExecutionException(th, postErrorString);
+
+ String message = _session.formatException(ex);
+
+ _session.showErrorMessage(message);
+
+ if (_session.getProperties().getWriteSQLErrorsToLog())
+ {
+ s_log.info(message);
+ }
+
+ return message;
+ }
+
+}
Modified: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/SQLHistoryController.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/SQLHistoryController.java 2011-01-03 01:58:23 UTC (rev 6133)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/SQLHistoryController.java 2011-01-08 14:38:28 UTC (rev 6134)
@@ -36,7 +36,7 @@
@SuppressWarnings("serial")
-public SQLHistoryController(ISession session, ISQLPanelAPI sqlPanelAPI, ArrayList<SQLHistoryItem> items)
+ public SQLHistoryController(ISession session, ISQLPanelAPI sqlPanelAPI, ArrayList<SQLHistoryItem> items)
{
_sqlPanelAPI = sqlPanelAPI;
_sqlHistoryItemWrappers = SQLHistoryItemWrapper.wrap(items);
@@ -94,7 +94,7 @@
// i18n[SQLHistoryController.mnuAppendSelectionToEditor=Append selected statements to SQL editor]
- JMenuItem mnuAppendSelectionToEditor = new JMenuItem("Append selected statements to SQL editor");
+ JMenuItem mnuAppendSelectionToEditor = new JMenuItem(s_stringMgr.getString("SQLHistoryController.mnuAppendSelectionToEditor"));
mnuAppendSelectionToEditor.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
Modified: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/SQLResultExecuterPanel.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/SQLResultExecuterPanel.java 2011-01-03 01:58:23 UTC (rev 6133)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/SQLResultExecuterPanel.java 2011-01-08 14:38:28 UTC (rev 6134)
@@ -19,30 +19,18 @@
*/
import java.awt.BorderLayout;
import java.awt.Component;
-import java.awt.GridBagConstraints;
-import java.awt.GridBagLayout;
-import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
-import java.sql.ResultSet;
import java.sql.SQLException;
-import java.sql.SQLWarning;
-import java.text.NumberFormat;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
import javax.swing.Action;
import javax.swing.ImageIcon;
-import javax.swing.JButton;
import javax.swing.JComponent;
-import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
@@ -58,9 +46,7 @@
import net.sourceforge.squirrel_sql.client.gui.desktopcontainer.DialogWidget;
import net.sourceforge.squirrel_sql.client.preferences.SquirrelPreferences;
import net.sourceforge.squirrel_sql.client.session.ISQLEntryPanel;
-import net.sourceforge.squirrel_sql.client.session.ISQLExecuterHandler;
import net.sourceforge.squirrel_sql.client.session.ISession;
-import net.sourceforge.squirrel_sql.client.session.SQLExecuterTask;
import net.sourceforge.squirrel_sql.client.session.SQLExecutionInfo;
import net.sourceforge.squirrel_sql.client.session.action.CloseAllSQLResultTabsAction;
import net.sourceforge.squirrel_sql.client.session.action.CloseAllSQLResultTabsButCurrentAction;
@@ -72,16 +58,11 @@
import net.sourceforge.squirrel_sql.client.session.properties.SessionProperties;
import net.sourceforge.squirrel_sql.fw.datasetviewer.*;
import net.sourceforge.squirrel_sql.fw.datasetviewer.cellcomponent.DataTypeClob;
-import net.sourceforge.squirrel_sql.fw.dialects.DialectFactory;
-import net.sourceforge.squirrel_sql.fw.dialects.DialectType;
-import net.sourceforge.squirrel_sql.fw.id.IIdentifier;
import net.sourceforge.squirrel_sql.fw.id.IntegerIdentifierFactory;
import net.sourceforge.squirrel_sql.fw.sql.ISQLConnection;
-import net.sourceforge.squirrel_sql.fw.sql.SQLExecutionException;
import net.sourceforge.squirrel_sql.fw.util.Resources;
import net.sourceforge.squirrel_sql.fw.util.StringManager;
import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
-import net.sourceforge.squirrel_sql.fw.util.StringUtilities;
import net.sourceforge.squirrel_sql.fw.util.log.ILogger;
import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
/**
@@ -91,17 +72,15 @@
public class SQLResultExecuterPanel extends JPanel
implements ISQLResultExecuter
{
- static final long serialVersionUID = 6961615570741567740L;
-
/** Logger for this class. */
private static final ILogger s_log =
LoggerController.createLogger(SQLResultExecuterPanel.class);
/** Internationalized strings for this class. */
- private static final StringManager s_stringMgr =
+ private static final StringManager s_stringMgr =
StringManagerFactory.getStringManager(SQLResultExecuterPanel.class);
-
- static interface i18n {
+
+ static interface i18n {
// i18n[SQLResultExecuterPanel.exec=Executing SQL]
String EXEC_SQL_MSG =
s_stringMgr.getString("SQLResultExecuterPanel.exec");
@@ -118,20 +97,9 @@
/** Each tab is a <TT>ResultTab</TT> showing the results of a query. */
private JTabbedPane _tabbedExecutionsPanel;
- /**
- * Collection of <TT>ResultTabInfo</TT> objects for all
- * <TT>ResultTab</TT> objects that have been created. Keyed
- * by <TT>ResultTab.getIdentifier()</TT>.
- */
- private Map<IIdentifier,ResultTabInfo> _allTabs =
- new HashMap<IIdentifier,ResultTabInfo>();
+ private ArrayList<ResultFrame>_sqlResultFrames = new ArrayList<ResultFrame>();
- /**
- * Pool of <TT>ResultTabInfo</TT> objects currently being used.
- */
- private ArrayList<ResultTabInfo> _usedTabs = new ArrayList<ResultTabInfo>();
-
/** Listeners */
private EventListenerList _listeners = new EventListenerList();
@@ -141,10 +109,6 @@
private SquirrelPreferences _prefs = null;
- /** Reference to the executor so that it can be called from the CancelPanel*/
- private SQLExecuterTask _executer;
-
- private static enum SQLType { INSERT, SELECT, UPDATE, DELETE, UNKNOWN };
/**
* Ctor.
*
@@ -269,6 +233,8 @@
public void execute(ISQLEntryPanel sqlPanel)
{
+ removeErrorPanels();
+
String sql = sqlPanel.getSQLToBeExecuted();
if (sql != null && sql.length() > 0)
{
@@ -283,42 +249,108 @@
}
}
- public void executeSQL(String sql)
+ private void removeErrorPanels()
+ {
+ ArrayList<ErrorPanel> toRemove = new ArrayList<ErrorPanel>();
+
+ for (int i = 0; i < _tabbedExecutionsPanel.getTabCount(); i++)
+ {
+ Component tab = _tabbedExecutionsPanel.getComponentAt(i);
+ if(tab instanceof ErrorPanel)
+ {
+ toRemove.add((ErrorPanel) tab);
+ }
+ }
+
+ for (ErrorPanel errorPanel : toRemove)
+ {
+ closeTab(errorPanel);
+ }
+ }
+
+ public void executeSQL(String sql)
{
- if (sql != null && sql.trim().length() > 0)
- {
- String origSQL = sql;
- sql = fireSQLToBeExecutedEvent(sql);
-
- // This can happen if an impl of ISQLExecutionListener returns null
- // from the statementExecuting API method, to indicate that the SQL
- // shouldn't be executed.
- if (sql == null) {
- s_log.info(
- "executeSQL: An ISQLExecutionListener veto'd execution of "+
- "the following SQL: "+origSQL);
- return;
+ if (sql != null && sql.trim().length() > 0)
+ {
+ String origSQL = sql;
+ sql = fireSQLToBeExecutedEvent(sql);
+
+ // This can happen if an impl of ISQLExecutionListener returns null
+ // from the statementExecuting API method, to indicate that the SQL
+ // shouldn't be executed.
+ if (sql == null)
+ {
+ s_log.info(
+ "executeSQL: An ISQLExecutionListener veto'd execution of " +
+ "the following SQL: " + origSQL);
+ return;
+ }
+
+ ISQLExecutionListener[] executionListeners =
+ _listeners.getListeners(ISQLExecutionListener.class);
+
+ ISQLExecutionHandlerListener executionHandlerListener = createSQLExecutionHandlerListener();
+
+ new SQLExecutionHandler((IResultTab)null, _session, sql, executionHandlerListener, executionListeners);
+ }
+ }
+
+ private ISQLExecutionHandlerListener createSQLExecutionHandlerListener()
+ {
+ return
+ new ISQLExecutionHandlerListener()
+ {
+ @Override
+ public void addResultsTab(SQLExecutionInfo info, ResultSetDataSet rsds, ResultSetMetaDataDataSet rsmdds, IDataSetUpdateableTableModel model, IResultTab resultTabToReplace)
+ {
+ onAddResultsTab(info, rsds, rsmdds, model, resultTabToReplace);
}
-
- ISQLExecutionListener[] executionListeners =
- _listeners.getListeners(ISQLExecutionListener.class);
- SQLExecutionHandler handler = new SQLExecutionHandler(null);
- _executer = new SQLExecuterTask(_session, sql, handler, executionListeners);
-
- if (_prefs.getLargeScriptStmtCount() > 0
- && _executer.getQueryCount() > _prefs.getLargeScriptStmtCount()) {
- _executer.setExecutionListeners(new ISQLExecutionListener[0]);
- handler.setLargeScript(true);
+
+ @Override
+ public void removeCancelPanel(CancelPanelCtrl cancelPanelCtrl, IResultTab resultTabToReplace)
+ {
+ onRemoveCancelPanel(cancelPanelCtrl, resultTabToReplace);
}
-
- _session.getApplication().getThreadPool().addTask(_executer);
- }
- }
+ @Override
+ public void setCancelPanel(CancelPanelCtrl cancelPanelCtrl)
+ {
+ onSetCancelPanel(cancelPanelCtrl);
+ }
+
+ @Override
+ public void addErrorPanel(ErrorPanel errorPanel)
+ {
+ onAddErrorPanel(errorPanel);
+ }
+ };
+ }
+
+ private void onAddErrorPanel(final ErrorPanel errorPanel)
+ {
+ Runnable runnable = new Runnable()
+ {
+ public void run()
+ {
+ _tabbedExecutionsPanel.add(s_stringMgr.getString("SQLResultExecuterPanel.ErrorTabHeader"), errorPanel);
+ _tabbedExecutionsPanel.setSelectedComponent(errorPanel);
+ errorPanel.setErrorPanelListener(new ErrorPanelListener()
+ {
+ @Override
+ public void removeErrorPanel(ErrorPanel errorPanel)
+ {
+ _tabbedExecutionsPanel.remove(errorPanel);
+ }
+ });
+ }
+ };
+
+ SwingUtilities.invokeLater(runnable);
+ }
+
private void onRerunSQL(String sql, IResultTab resultTab)
{
- _executer = new SQLExecuterTask(_session, sql, new SQLExecutionHandler(resultTab), new ISQLExecutionListener[0]);
- _session.getApplication().getThreadPool().addTask(_executer);
+ new SQLExecutionHandler(resultTab, _session, sql, createSQLExecutionHandlerListener(), new ISQLExecutionListener[0]);
}
@@ -327,16 +359,10 @@
*/
public synchronized void closeAllSQLResultFrames()
{
- List<ResultTabInfo> tabs = new ArrayList<ResultTabInfo>(_usedTabs);
- for (Iterator<ResultTabInfo> it = tabs.iterator(); it.hasNext();)
- {
- ResultTabInfo ti = it.next();
- if (ti._resultFrame != null)
- {
- ti._resultFrame.dispose();
- ti._resultFrame = null;
- }
- }
+ for (ResultFrame sqlResultFrame : _sqlResultFrames)
+ {
+ sqlResultFrame.dispose();
+ }
}
/**
@@ -344,32 +370,43 @@
*/
public synchronized void closeAllSQLResultTabs()
{
- List<ResultTabInfo> tabs = new ArrayList<ResultTabInfo>(_usedTabs);
- for (Iterator<ResultTabInfo> it = tabs.iterator(); it.hasNext();)
- {
- ResultTabInfo ti = it.next();
- if (ti._resultFrame == null)
- {
- closeTab(ti._tab);
- }
- }
+ ArrayList<Component> allTabs = getAllTabs();
+
+ for (Component tab : allTabs)
+ {
+ closeTab(tab);
+ }
+
}
+ private ArrayList<Component> getAllTabs()
+ {
+ ArrayList<Component> allTabs = new ArrayList<Component>();
+ for (int i = 0; i < _tabbedExecutionsPanel.getTabCount(); i++)
+ {
+ Component component = _tabbedExecutionsPanel.getComponentAt(i);
+ if (false == component instanceof CancelPanel)
+ {
+ allTabs.add(component);
+ }
+ }
+ return allTabs;
+ }
+
public synchronized void closeAllButCurrentResultTabs()
{
Component selectedTab = _tabbedExecutionsPanel.getSelectedComponent();
- List<ResultTabInfo> tabs = new ArrayList<ResultTabInfo>(_usedTabs);
- for (Iterator<ResultTabInfo> it = tabs.iterator(); it.hasNext();)
+ ArrayList<Component> allTabs = getAllTabs();
+
+
+ for (Component tab : allTabs)
{
- ResultTabInfo ti = it.next();
- if(false == ti._tab.equals(selectedTab))
+ if(tab != selectedTab)
{
- if (ti._resultFrame == null)
- {
- closeTab(ti._tab);
- }
+ closeTab(tab);
}
+
}
}
@@ -426,14 +463,20 @@
private int getIndexOfTab(IResultTab resultTab)
{
- if(null == resultTab)
+ return getIndexOfTab((JComponent)resultTab);
+ }
+
+
+ private int getIndexOfTab(JComponent tab)
+ {
+ if(null == tab)
{
return -1;
}
for (int i = 0; i < _tabbedExecutionsPanel.getTabCount(); i++)
{
- if (resultTab.equals(_tabbedExecutionsPanel.getComponentAt(i)))
+ if (tab == _tabbedExecutionsPanel.getComponentAt(i))
{
return i;
}
@@ -446,19 +489,7 @@
public synchronized void closeCurrentResultTab()
{
Component selectedTab = _tabbedExecutionsPanel.getSelectedComponent();
-
- List<ResultTabInfo> tabs = new ArrayList<ResultTabInfo>(_usedTabs);
- for (Iterator<ResultTabInfo> it = tabs.iterator(); it.hasNext();)
- {
- ResultTabInfo ti = it.next();
- if(ti._tab.equals(selectedTab))
- {
- if (ti._resultFrame == null)
- {
- closeTab(ti._tab);
- }
- }
- }
+ closeTab(selectedTab);
}
/**
@@ -478,6 +509,19 @@
closeAllSQLResultFrames();
}
+ private void closeTab(Component tab)
+ {
+ if(tab instanceof ErrorPanel)
+ {
+ _tabbedExecutionsPanel.remove(tab);
+ }
+ else if(tab instanceof ResultTab)
+ {
+ closeResultTab((ResultTab) tab);
+ }
+ }
+
+
/**
* Close the passed <TT>ResultTab</TT>. This is done by clearing
* all data from the tab, removing it from the tabbed panel
@@ -486,20 +530,17 @@
* @throws IllegalArgumentException
* Thrown if a <TT>null</TT> <TT>ResultTab</TT> passed.
*/
- public void closeTab(ResultTab tab)
+ public void closeResultTab(ResultTab tab)
{
if (tab == null)
{
throw new IllegalArgumentException("Null ResultTab passed");
}
s_log
- .debug("SQLPanel.closeTab(" + tab.getIdentifier().toString()
+ .debug("SQLPanel.closeResultTab(" + tab.g...
[truncated message content] |