diff --git a/sql12/build.xml b/sql12/build.xml
index 037360ea33..4abd287625 100644
--- a/sql12/build.xml
+++ b/sql12/build.xml
@@ -8,7 +8,7 @@
-
+
diff --git a/sql12/core/doc/changes.txt b/sql12/core/doc/changes.txt
index 3cac6986f5..b195c6c7fa 100755
--- a/sql12/core/doc/changes.txt
+++ b/sql12/core/doc/changes.txt
@@ -6,7 +6,80 @@ Not yet released, available in our GIT repository, snapshots and future releases
Enhancements:
-Security: Introduced option to use a key password for encrypting Alias passwords.
+https://github.com/squirrel-sql-client/squirrel-sql-code/issues/88
+ The keyboard short cuts tab now contains the action's description (tooltip).
+ See menu File --> Global Preferences --> tab "Keyboard shortcuts"
+
+
+Bug fixes:
+
+Oracle Plugin: Fixed typo, DB Ouptut --> DB Output
+
+
+5.1.0 (03/26/2026)
+==================
+
+Enhancements:
+
+https://github.com/squirrel-sql-client/squirrel-sql-code/issues/87
+ The right mouse menu of UI-tables now offers to toggle columns between a monospaced font and the default font.
+ See the right mouse menu entry named "Toggle selected columns monospaced".
+
+The UI-table's "Copy separated by ..." right mouse menu function now allows
+ to display the copy result in a cell data dialog.
+
+The UI-table's "Copy separated by ..." right mouse menu function now allows
+ to concatenate cell values without separator.
+
+https://github.com/squirrel-sql-client/squirrel-sql-code/issues/81
+ Session Scripts Plugin: Session startup scripts now support running bookmarks
+ by @runbookmark the same way the SQL editor does.
+
+Session Scripts Plugin: Aliases combo box of the Session startup scripts frame now
+ sorts Aliases alphabetically and puts the ones on top which have Session startup scripts defined.
+ See menu Plugins --> Session Scripts ...
+
+https://github.com/squirrel-sql-client/squirrel-sql-code/issues/80
+ SQL results displayed in their own window can be rerun automatically, too.
+ The UI behavior of SQL results displayed in their own window was improved.
+
+https://github.com/squirrel-sql-client/squirrel-sql-code/issues/80
+ SQL results can be rerun automatically after a configurable number of seconds.
+ To give access to this function the SQL result's rerun button was made switchable.
+
+https://github.com/squirrel-sql-client/squirrel-sql-code/issues/81
+ Bookmarks Plugin: A bookmark's statement can be run from within the SQL editor use @runbookmark
+
+https://github.com/squirrel-sql-client/squirrel-sql-code/issues/75
+ The options "Allow to run all SQLs in editor" and "Allow to run a SQL in all open Sessions"
+ are now switched off by default. See menu File --> Global Preferences tab SQL.
+ Note: This change applies only to SQuirreL user directories that did not already
+ contain these options in their prefs.xml file. The path to SQuirreL's user directory is displayed
+ in SQuirrel's window title.
+
+https://github.com/squirrel-sql-client/squirrel-sql-code/issues/79
+ MS Excel file export: The MS Excel section of the file export dialog offers two new options:
+ 1. Option to define the name of the Excel sheet tab that is created inside the Excel file.
+ 2. Option to replace Excel sheet tabs in existing Excel files.
+ Note that those two (as several other) options will apply to automated exports, too.
+ To learn about automated exports see the link at the bottom of the file export dialog.
+
+https://github.com/squirrel-sql-client/squirrel-sql-code/issues/76
+ Cell data popup and cell detail display now offer right mouse menus to
+ Base64/Base32/Hex-decode selected text. The decoded text is written to the message panel.
+
+https://github.com/squirrel-sql-client/squirrel-sql-code/issues/75
+ New function to execute a SQL in multiple Sessions:
+ The new Session toolbar button "Run SQL in all open Sessions" (ctrl+alt+shift+ENTER)
+ executes the current SQL in all open Sessions.
+ The feature can be switched off at menu File --> Global Preferences --> tab SQL
+ --> checkbox "Allow to run a SQL in all open Sessions"
+
+https://github.com/squirrel-sql-client/squirrel-sql-code/issues/74
+ Multiple selected Aliases can be selected and connected to.
+
+https://github.com/squirrel-sql-client/squirrel-sql-code/issues/73
+ Security: Introduced option to use a key password for encrypting Alias passwords.
When a key password is used SQuirreL can decrypt Alias-passwords only after the key password was entered.
SQuirreL stores the key password in memory only. As a consequence the key password must be entered
after SQuirreL was started and before an Alias, that uses password encryption, can be connected to.
@@ -34,6 +107,13 @@ DB2 Plugin: The table details in the Object tree has a new tab
Bug fixes:
+Fixed "java.beans.IntrospectionException: Method not found" when creating an application dump.
+ See menu File --> Dump Application
+
+Deleting or editing SQL table results or Object tree "Content"-tables rose NullPointerException when
+ a table had one or more columns of type LONGVARCHAR and LONGVARCHAR types were chosen to be left out of generated WHERE clauses.
+ See menu File --> Global Preferences --> tab "Data type controls" --> section "CHAR, VARCHAR, LONGVARCHAR"
+
Alias find dialog (ctrl+alt+shift+g or ctrl+alt+shift+f):
Modifying an Alias folder raised NullPointerException.
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/Application.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/Application.java
index dc98aa17db..51e0954086 100755
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/Application.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/Application.java
@@ -23,7 +23,6 @@
*/
import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
@@ -267,13 +266,7 @@ public void startup()
_desktopStyle = new DesktopStyle(_globalPreferences);
preferencesHaveChanged(null);
- _globalPreferences.addPropertyChangeListener(new PropertyChangeListener()
- {
- public void propertyChange(PropertyChangeEvent evt)
- {
- preferencesHaveChanged(evt);
- }
- });
+ _globalPreferences.addPropertyChangeListener(evt -> preferencesHaveChanged(evt));
SquirrelSplashScreen splash = null;
if (args.getShowSplashScreen())
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/Version.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/Version.java
index 2203e371b7..3f5575693e 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/Version.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/Version.java
@@ -18,11 +18,11 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
-
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
+
+import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
/**
* Application version information.
*
@@ -35,7 +35,7 @@ public class Version
* No I18n/StringManager here. This class is used to early. The right Locale may not have been set yet.
*/
private static final String APP_NAME = "SQuirreL SQL Client";
- private static final String COPYRIGHT = "Copyright (c) 2001-2025\nColin Bell, Gerd Wagner, Rob Manning and others";
+ private static final String COPYRIGHT = "Copyright (c) 2001-2026\nColin Bell, Gerd Wagner, Rob Manning and others";
private static final String WEB_SITE = "http://www.squirrelsql.org";
private static final String WEB_SITE2 = "https://squirrelsql.org";
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/action/ActionRegistry.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/action/ActionRegistry.java
index 1f0ea21b37..1ceb0bb4af 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/action/ActionRegistry.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/action/ActionRegistry.java
@@ -50,6 +50,7 @@
import net.sourceforge.squirrel_sql.client.session.action.EscapeDateAction;
import net.sourceforge.squirrel_sql.client.session.action.ExecuteAllSqlsAction;
import net.sourceforge.squirrel_sql.client.session.action.ExecuteSqlAction;
+import net.sourceforge.squirrel_sql.client.session.action.ExecuteSqlInAllSessionsAction;
import net.sourceforge.squirrel_sql.client.session.action.FilterObjectsAction;
import net.sourceforge.squirrel_sql.client.session.action.FindColumnsAction;
import net.sourceforge.squirrel_sql.client.session.action.FindColumnsInObjectTreeNodesAction;
@@ -184,6 +185,7 @@ public void registerToolsPopupActions(ActionCollection ac, ToolsPopupController
toolsPopupController.addAction("redo", sqlPanel.getRedoAction());
toolsPopupController.addAction("runsql", ac.get(ExecuteSqlAction.class));
toolsPopupController.addAction("runallsqls", ac.get(ExecuteAllSqlsAction.class));
+ toolsPopupController.addAction("runsqlinallsession", ac.get(ExecuteSqlInAllSessionsAction.class));
toolsPopupController.addAction("filenew", ac.get(FileNewAction.class));
toolsPopupController.addAction("filedetach", ac.get(FileDetachAction.class));
toolsPopupController.addAction("fileopen", ac.get(FileOpenAction.class));
@@ -325,6 +327,7 @@ public void preloadActions(ActionCollection actionCollection)
actionCollection.add(new DumpSessionAction(app));
actionCollection.add(new ExecuteSqlAction(app));
actionCollection.add(new ExecuteAllSqlsAction(app));
+ actionCollection.add(new ExecuteSqlInAllSessionsAction());
actionCollection.add(new ExitAction(app));
actionCollection.add(new FileNewAction(app));
actionCollection.add(new FileDetachAction(app));
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/cli/CliSQLExecuterHandler.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/cli/CliSQLExecuterHandler.java
index 5e8d1c69ec..359bdbf121 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/cli/CliSQLExecuterHandler.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/cli/CliSQLExecuterHandler.java
@@ -1,5 +1,13 @@
package net.sourceforge.squirrel_sql.client.cli;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.sql.SQLException;
+import java.util.ArrayList;
+
import net.sourceforge.squirrel_sql.client.session.SQLExecutionInfo;
import net.sourceforge.squirrel_sql.fw.datasetviewer.DataSetException;
import net.sourceforge.squirrel_sql.fw.datasetviewer.IDataSetUpdateableTableModel;
@@ -11,14 +19,6 @@
import net.sourceforge.squirrel_sql.fw.sql.querytokenizer.QueryHolder;
import net.sourceforge.squirrel_sql.fw.util.Utilities;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.sql.SQLException;
-import java.util.ArrayList;
-
public class CliSQLExecuterHandler extends CliSQLExecuterHandlerAdapter
{
private CliSession _cliSession;
@@ -124,7 +124,7 @@ public void sqlResultSetAvailable(ResultSetWrapper rst, SQLExecutionInfo info, I
DialectFactory.getDialectType(_cliSession.getMetaData());
- rsds.setSqlExecutionTabResultSet(rst, null, dialectType);
+ rsds.readDataFromJdbcResultSetForSqlExecution(rst, null, dialectType);
ResultAsText resultAsText = new ResultAsText(rsds.getDataSetDefinition().getColumnDefinitions(), true, line -> onAddLine(line));
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/AliasesAndDriversManager.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/AliasesAndDriversManager.java
index 22bba25d2e..2a2543a362 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/AliasesAndDriversManager.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/AliasesAndDriversManager.java
@@ -18,6 +18,14 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
import net.sourceforge.squirrel_sql.client.Main;
import net.sourceforge.squirrel_sql.client.gui.db.listholder.AliasListHolder;
import net.sourceforge.squirrel_sql.client.gui.db.listholder.DriverListHolder;
@@ -28,20 +36,15 @@
import net.sourceforge.squirrel_sql.fw.sql.ISQLDriver;
import net.sourceforge.squirrel_sql.fw.sql.SQLDriver;
import net.sourceforge.squirrel_sql.fw.sql.SQLDriverManager;
-import net.sourceforge.squirrel_sql.fw.util.*;
+import net.sourceforge.squirrel_sql.fw.util.IMessageHandler;
+import net.sourceforge.squirrel_sql.fw.util.IObjectCacheChangeListener;
+import net.sourceforge.squirrel_sql.fw.util.NullMessageHandler;
+import net.sourceforge.squirrel_sql.fw.util.StringManager;
+import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
import net.sourceforge.squirrel_sql.fw.util.log.ILogger;
import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
import net.sourceforge.squirrel_sql.fw.xml.XMLException;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
public class AliasesAndDriversManager
{
private final static StringManager s_stringMgr = StringManagerFactory.getStringManager(AliasesAndDriversManager.class);
@@ -248,12 +251,12 @@ public SQLAlias getAlias(IIdentifier id)
return _aliasListHolder.get(id);
}
- public Iterator extends SQLAlias> aliases()
+ public Iterator aliases()
{
return _aliasListHolder.getAll().iterator();
}
- public List extends SQLAlias> getAliasList()
+ public List getAliasList()
{
return _aliasListHolder.getAll();
}
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/AliasesList.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/AliasesList.java
index c85b062983..7d282aa24f 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/AliasesList.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/AliasesList.java
@@ -1,5 +1,13 @@
package net.sourceforge.squirrel_sql.client.gui.db;
+import java.awt.GridLayout;
+import java.awt.Point;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.util.ArrayList;
+import java.util.List;
+import javax.swing.JComponent;
+import javax.swing.JPanel;
import net.sourceforge.squirrel_sql.client.IApplication;
import net.sourceforge.squirrel_sql.client.Main;
import net.sourceforge.squirrel_sql.client.gui.WindowManager;
@@ -7,13 +15,6 @@
import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
import net.sourceforge.squirrel_sql.fw.util.StringUtilities;
-import javax.swing.*;
-import java.awt.*;
-import java.awt.event.MouseEvent;
-import java.awt.event.MouseListener;
-import java.util.ArrayList;
-import java.util.List;
-
/*
* Copyright (C) 2001-2004 Colin Bell
* colbell@users.sourceforge.net
@@ -165,6 +166,12 @@ public SQLAlias getSelectedAlias(MouseEvent evt)
return getCurrentImpl().getSelectedAlias(evt);
}
+ @Override
+ public List getAllSelectedAliases()
+ {
+ return getCurrentImpl().getAllSelectedAliases();
+ }
+
@Override
public SQLAlias getLeadSelectionValue()
{
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/BaseList.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/BaseList.java
index 107ebdee14..f9d5187421 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/BaseList.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/BaseList.java
@@ -1,16 +1,18 @@
package net.sourceforge.squirrel_sql.client.gui.db;
-import net.sourceforge.squirrel_sql.fw.gui.SortedListModel;
-import net.sourceforge.squirrel_sql.client.ApplicationListener;
-import net.sourceforge.squirrel_sql.client.IApplication;
-
-import javax.swing.*;
-import javax.swing.event.ListDataEvent;
-import javax.swing.event.ListDataListener;
-import java.awt.*;
-import java.awt.event.MouseListener;
+import java.awt.Dimension;
+import java.awt.Point;
import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
import java.util.ArrayList;
+import javax.swing.JComponent;
+import javax.swing.JList;
+import javax.swing.JScrollPane;
+import javax.swing.ListSelectionModel;
+import javax.swing.event.ListDataEvent;
+import javax.swing.event.ListDataListener;
+import net.sourceforge.squirrel_sql.client.Main;
+import net.sourceforge.squirrel_sql.fw.gui.SortedListModel;
import net.sourceforge.squirrel_sql.fw.props.Props;
public abstract class BaseList implements IBaseList
@@ -27,10 +29,17 @@ public String getToolTipText(MouseEvent event)
private JScrollPane _comp = new JScrollPane(_list);
- public BaseList(SortedListModel sortedListModel, IApplication app)
+ public BaseList(SortedListModel sortedListModel, boolean allowMultipleSelection)
{
_list.setModel(sortedListModel);
- getList().getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+ if(allowMultipleSelection)
+ {
+ getList().getSelectionModel().setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
+ }
+ else
+ {
+ getList().getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+ }
// Add listener to listen for items added/removed from list.
_list.getModel().addListDataListener(new ListDataListener()
@@ -51,14 +60,7 @@ public void contentsChanged(ListDataEvent evt)
_comp.setPreferredSize(new Dimension(100, 100));
- app.addApplicationListener(new ApplicationListener()
- {
- public void saveApplicationState()
- {
- onSaveApplicationState();
- }
- });
-
+ Main.getApplication().addApplicationListener(() -> onSaveApplicationState());
setSelIxFromPrefs();
}
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/BaseListInternalFrame.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/BaseListInternalFrame.java
index 6b4eb126cf..2e841a12c0 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/BaseListInternalFrame.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/BaseListInternalFrame.java
@@ -18,6 +18,12 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+import java.awt.BorderLayout;
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import javax.swing.JFrame;
import net.sourceforge.squirrel_sql.client.Main;
import net.sourceforge.squirrel_sql.client.gui.desktopcontainer.DockWidget;
import net.sourceforge.squirrel_sql.fw.gui.BasePopupMenu;
@@ -27,11 +33,6 @@
import net.sourceforge.squirrel_sql.fw.util.log.ILogger;
import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
-import javax.swing.*;
-import java.awt.*;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-
abstract class BaseListInternalFrame extends DockWidget
{
private static final ILogger s_log = LoggerController.createLogger(BaseListInternalFrame.class);
@@ -89,13 +90,6 @@ private void onMousePress(MouseEvent evt)
{
if (evt.isPopupTrigger())
{
-
- // If the user wants to select for Right mouse clicks then change the selection before popup appears
- if (Main.getApplication().getSquirrelPreferences().getSelectOnRightMouseClick())
- {
- _uiFactory.getList().selectListEntryAtPoint(evt.getPoint());
- }
-
if (_popupMenu == null)
{
_popupMenu = _uiFactory.getPopupMenu();
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/DriversList.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/DriversList.java
index dfb632538d..04f72afdcf 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/DriversList.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/DriversList.java
@@ -18,18 +18,17 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+import java.awt.BorderLayout;
+import java.awt.event.MouseEvent;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import javax.swing.ToolTipManager;
import net.sourceforge.squirrel_sql.client.IApplication;
import net.sourceforge.squirrel_sql.client.preferences.SquirrelPreferences;
import net.sourceforge.squirrel_sql.client.resources.SquirrelResources;
import net.sourceforge.squirrel_sql.fw.sql.ISQLDriver;
import net.sourceforge.squirrel_sql.fw.util.StringManager;
import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
-
-import javax.swing.*;
-import java.awt.*;
-import java.awt.event.MouseEvent;
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
/**
* This is a JList that dispays all the ISQLDriver
* objects.
@@ -61,7 +60,7 @@ public class DriversList extends BaseList implements IDriversList
*/
public DriversList(IApplication app) throws IllegalArgumentException
{
- super(new DriversListModel(), app);
+ super(new DriversListModel(), false);
_app = app;
_model = (DriversListModel) getList().getModel();
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/IAliasesList.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/IAliasesList.java
index bcaccd95c9..e46c96273c 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/IAliasesList.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/IAliasesList.java
@@ -1,6 +1,7 @@
package net.sourceforge.squirrel_sql.client.gui.db;
import java.awt.event.MouseEvent;
+import java.util.List;
/*
* Copyright (C) 2004 Colin Bell
@@ -29,6 +30,8 @@ public interface IAliasesList extends IBaseList
*/
SQLAlias getSelectedAlias(MouseEvent evt);
+ List getAllSelectedAliases();
+
void sortAliases();
void requestFocus();
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/JListAliasesListImpl.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/JListAliasesListImpl.java
index a64ea2df06..190920ed5f 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/JListAliasesListImpl.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/JListAliasesListImpl.java
@@ -1,5 +1,14 @@
package net.sourceforge.squirrel_sql.client.gui.db;
+import java.awt.BorderLayout;
+import java.awt.event.KeyAdapter;
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseEvent;
+import java.util.List;
+import javax.swing.JList;
+import javax.swing.SwingUtilities;
+import javax.swing.event.ListDataEvent;
+import javax.swing.event.ListDataListener;
import net.sourceforge.squirrel_sql.client.IApplication;
import net.sourceforge.squirrel_sql.client.Main;
import net.sourceforge.squirrel_sql.client.gui.db.aliascolor.ListAliasColorSelectionHandler;
@@ -7,15 +16,6 @@
import net.sourceforge.squirrel_sql.fw.util.StringManager;
import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
-import javax.swing.JList;
-import javax.swing.SwingUtilities;
-import javax.swing.event.ListDataEvent;
-import javax.swing.event.ListDataListener;
-import java.awt.BorderLayout;
-import java.awt.event.KeyAdapter;
-import java.awt.event.KeyEvent;
-import java.awt.event.MouseEvent;
-
/*
* Copyright (C) 2001-2004 Colin Bell
* colbell@users.sourceforge.net
@@ -53,7 +53,7 @@ public class JListAliasesListImpl extends BaseList implements IAliasesList
public JListAliasesListImpl(IApplication app, AliasesListModel aliasesListModel, AliasListSelectionListener selectionListener)
{
- super(aliasesListModel, app);
+ super(aliasesListModel, true);
_model = aliasesListModel;
getList().setLayout(new BorderLayout());
@@ -160,6 +160,12 @@ public SQLAlias getSelectedAlias(MouseEvent evt)
return (SQLAlias)getList().getSelectedValue();
}
+ @Override
+ public List getAllSelectedAliases()
+ {
+ return getList().getSelectedValuesList();
+ }
+
public void sortAliases()
{
final SQLAlias selectedAlias = getSelectedAlias(null);
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/JTreeAliasesListImpl.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/JTreeAliasesListImpl.java
index 21f2e3915d..abb2a28d05 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/JTreeAliasesListImpl.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/JTreeAliasesListImpl.java
@@ -12,6 +12,7 @@
import java.awt.event.MouseListener;
import java.io.File;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import javax.activation.DataHandler;
@@ -29,7 +30,6 @@
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
-
import net.sourceforge.squirrel_sql.client.IApplication;
import net.sourceforge.squirrel_sql.client.Main;
import net.sourceforge.squirrel_sql.client.gui.db.aliascolor.TreeAliasColorSelectionHandler;
@@ -544,6 +544,16 @@ else if(selNode.getUserObject() instanceof AliasFolder)
_tree.setSelectionPath(new TreePath(treeModel.getPathToRoot(newNode)));
}
+ public List getAllSelectedAliases()
+ {
+ return
+ Arrays.stream(_tree.getSelectionPaths())
+ .map(p -> p.getLastPathComponent())
+ .filter(n -> n instanceof DefaultMutableTreeNode dmt && dmt.getUserObject() instanceof SQLAlias)
+ .map(n -> (SQLAlias)((DefaultMutableTreeNode) n).getUserObject())
+ .toList();
+ }
+
public SQLAlias getSelectedAlias(MouseEvent evt)
{
TreePath path = _tree.getSelectionPath();
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/desktopcontainer/docktabdesktop/DockTabDesktopPane.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/desktopcontainer/docktabdesktop/DockTabDesktopPane.java
index e0caec2a9e..8c7537d8a4 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/desktopcontainer/docktabdesktop/DockTabDesktopPane.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/desktopcontainer/docktabdesktop/DockTabDesktopPane.java
@@ -1,9 +1,41 @@
package net.sourceforge.squirrel_sql.client.gui.desktopcontainer.docktabdesktop;
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.Point;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ComponentAdapter;
+import java.awt.event.ComponentEvent;
+import java.util.ArrayList;
+import java.util.HashSet;
+import javax.swing.Action;
+import javax.swing.BorderFactory;
+import javax.swing.BoxLayout;
+import javax.swing.Icon;
+import javax.swing.JComponent;
+import javax.swing.JMenuItem;
+import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
+import javax.swing.JSplitPane;
+import javax.swing.JTabbedPane;
+import javax.swing.JToggleButton;
+import javax.swing.KeyStroke;
+import javax.swing.WindowConstants;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
import net.sourceforge.squirrel_sql.client.ApplicationListener;
import net.sourceforge.squirrel_sql.client.IApplication;
import net.sourceforge.squirrel_sql.client.Main;
-import net.sourceforge.squirrel_sql.client.gui.desktopcontainer.*;
+import net.sourceforge.squirrel_sql.client.gui.desktopcontainer.DialogWidget;
+import net.sourceforge.squirrel_sql.client.gui.desktopcontainer.DockDelegate;
+import net.sourceforge.squirrel_sql.client.gui.desktopcontainer.DockWidget;
+import net.sourceforge.squirrel_sql.client.gui.desktopcontainer.IDesktopContainer;
+import net.sourceforge.squirrel_sql.client.gui.desktopcontainer.IWidget;
+import net.sourceforge.squirrel_sql.client.gui.desktopcontainer.TabDelegate;
+import net.sourceforge.squirrel_sql.client.gui.desktopcontainer.TabWidget;
import net.sourceforge.squirrel_sql.client.gui.mainframe.SquirrelDesktopManager;
import net.sourceforge.squirrel_sql.client.mainframe.action.CloseAllButCurrentSessionsAction;
import net.sourceforge.squirrel_sql.client.mainframe.action.CloseAllSessionsAction;
@@ -11,22 +43,12 @@
import net.sourceforge.squirrel_sql.client.session.action.CloseSessionWindowAction;
import net.sourceforge.squirrel_sql.client.session.action.GoToAliasSessionAction;
import net.sourceforge.squirrel_sql.client.session.action.RenameSessionAction;
+import net.sourceforge.squirrel_sql.client.shortcut.ShortCutDescriptionReader;
import net.sourceforge.squirrel_sql.fw.gui.GUIUtils;
import net.sourceforge.squirrel_sql.fw.gui.buttontabcomponent.ButtonTabComponent;
import net.sourceforge.squirrel_sql.fw.gui.buttontabcomponent.SmallTabButton;
import net.sourceforge.squirrel_sql.fw.resources.Resources;
-import javax.swing.*;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-import java.awt.*;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.ComponentAdapter;
-import java.awt.event.ComponentEvent;
-import java.util.ArrayList;
-import java.util.HashSet;
-
//
public class DockTabDesktopPane extends JComponent implements IDesktopContainer
{
@@ -602,7 +624,7 @@ private JMenuItem createMenu(Action action)
JMenuItem ret = new JMenuItem(action);
String accel = (String) action.getValue(Resources.ACCELERATOR_STRING);
- Main.getApplication().getShortcutManager().setAccelerator(ret, KeyStroke.getKeyStroke(accel), action);
+ Main.getApplication().getShortcutManager().setAccelerator(ret, KeyStroke.getKeyStroke(accel), action, ShortCutDescriptionReader.of(action));
return ret;
}
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/mainframe/MainFrameMenuBar.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/mainframe/MainFrameMenuBar.java
index e3d41a85be..b73862ab4a 100755
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/mainframe/MainFrameMenuBar.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/mainframe/MainFrameMenuBar.java
@@ -105,6 +105,7 @@
import net.sourceforge.squirrel_sql.client.session.action.EscapeDateAction;
import net.sourceforge.squirrel_sql.client.session.action.ExecuteAllSqlsAction;
import net.sourceforge.squirrel_sql.client.session.action.ExecuteSqlAction;
+import net.sourceforge.squirrel_sql.client.session.action.ExecuteSqlInAllSessionsAction;
import net.sourceforge.squirrel_sql.client.session.action.FindColumnsAction;
import net.sourceforge.squirrel_sql.client.session.action.FormatSQLAction;
import net.sourceforge.squirrel_sql.client.session.action.GoToAliasSessionAction;
@@ -428,14 +429,12 @@ private JMenu createSessionMenu(Resources rsrc)
addToMenu(rsrc, FindColumnsAction.class, menu);
addToMenu(rsrc, ExecuteSqlAction.class, menu);
addToMenu(rsrc, ExecuteAllSqlsAction.class, menu);
+ addToMenu(rsrc, ExecuteSqlInAllSessionsAction.class, menu);
menu.add(createTransactionMenu(rsrc));
addToMenu(rsrc, SQLFilterAction.class, menu);
menu.addSeparator();
addToMenu(rsrc, ViewObjectAtCursorInObjectTreeAction.class, menu);
- menu.addSeparator();
menu.add(createSessionWindowFileMenu(rsrc));
- addToMenu(rsrc, ChangeTrackAction.class, menu);
- menu.addSeparator();
menu.add(createSavedSessionMenu(rsrc));
menu.addSeparator();
addToMenu(rsrc, ShowNativeSQLAction.class, menu);
@@ -655,6 +654,7 @@ private JMenu createSessionWindowFileMenu(Resources rsrc)
addToMenu(rsrc, FileAppendAction.class, menu);
addToMenu(rsrc, FilePrintAction.class, menu);
addToMenu(rsrc, FileReloadAction.class, menu);
+ addToMenu(rsrc, ChangeTrackAction.class, menu);
return menu;
}
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/session/SQLInternalFrameToolBar.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/session/SQLInternalFrameToolBar.java
index 7791e5367f..dd0cfddd7a 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/session/SQLInternalFrameToolBar.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/session/SQLInternalFrameToolBar.java
@@ -6,6 +6,7 @@
import net.sourceforge.squirrel_sql.client.session.action.ChangeTrackAction;
import net.sourceforge.squirrel_sql.client.session.action.ExecuteAllSqlsAction;
import net.sourceforge.squirrel_sql.client.session.action.ExecuteSqlAction;
+import net.sourceforge.squirrel_sql.client.session.action.ExecuteSqlInAllSessionsAction;
import net.sourceforge.squirrel_sql.client.session.action.GoToLastEditLocationAction;
import net.sourceforge.squirrel_sql.client.session.action.NextSqlAction;
import net.sourceforge.squirrel_sql.client.session.action.PreviousSqlAction;
@@ -45,6 +46,7 @@ private void createGUI(ISession session, ISQLPanelAPI panel)
add(actions.get(ExecuteSqlAction.class));
addSeparator();
add(actions.get(ExecuteAllSqlsAction.class));
+ add(actions.get(ExecuteSqlInAllSessionsAction.class));
addSeparator();
add(actions.get(FileNewAction.class));
add(actions.get(FileDetachAction.class));
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/session/SessionPanelToolBar.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/session/SessionPanelToolBar.java
index 6a21f3a9ab..7a6013ee4a 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/session/SessionPanelToolBar.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/session/SessionPanelToolBar.java
@@ -6,6 +6,7 @@
import net.sourceforge.squirrel_sql.client.session.action.ChangeTrackAction;
import net.sourceforge.squirrel_sql.client.session.action.ExecuteAllSqlsAction;
import net.sourceforge.squirrel_sql.client.session.action.ExecuteSqlAction;
+import net.sourceforge.squirrel_sql.client.session.action.ExecuteSqlInAllSessionsAction;
import net.sourceforge.squirrel_sql.client.session.action.FindColumnsAction;
import net.sourceforge.squirrel_sql.client.session.action.GoToLastEditLocationAction;
import net.sourceforge.squirrel_sql.client.session.action.NextSqlAction;
@@ -76,6 +77,7 @@ private void createGUI(ISession session)
add(actions.get(ExecuteSqlAction.class));
addSeparator();
add(actions.get(ExecuteAllSqlsAction.class));
+ add(actions.get(ExecuteSqlInAllSessionsAction.class));
addSeparator();
// actions.get(ExecuteSqlAction.class).setEnabled(false);
add(actions.get(SQLFilterAction.class));
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/mainframe/action/ConnectToAliasAction.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/mainframe/action/ConnectToAliasAction.java
index 6ea21a214a..056cd83e57 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/mainframe/action/ConnectToAliasAction.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/mainframe/action/ConnectToAliasAction.java
@@ -18,12 +18,12 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+import java.awt.event.ActionEvent;
+import java.util.List;
import net.sourceforge.squirrel_sql.client.IApplication;
import net.sourceforge.squirrel_sql.client.gui.db.IAliasesList;
import net.sourceforge.squirrel_sql.client.gui.db.SQLAlias;
-import java.awt.event.ActionEvent;
-
public class ConnectToAliasAction extends AliasAction
{
/**
@@ -51,11 +51,9 @@ public ConnectToAliasAction(IApplication app, IAliasesList list)
*/
public void actionPerformed(ActionEvent evt)
{
- moveToFrontAndSelectAliasFrame();
- final SQLAlias alias = _aliases.getSelectedAlias(null);
- if (alias != null)
- {
- new ConnectToAliasCommand(alias).executeConnect();
- }
+ moveToFrontAndSelectAliasFrame();
+ List selectedAliases = _aliases.getAllSelectedAliases();
+
+ selectedAliases.forEach(a -> new ConnectToAliasCommand(a).executeConnect());
}
}
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/plugin/DefaultSessionPlugin.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/plugin/DefaultSessionPlugin.java
index 6b50476681..7bcc03073e 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/plugin/DefaultSessionPlugin.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/plugin/DefaultSessionPlugin.java
@@ -20,14 +20,13 @@
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-import javax.swing.JMenu;
+import javax.swing.JMenu;
import net.sourceforge.squirrel_sql.client.session.ISession;
import net.sourceforge.squirrel_sql.client.session.event.SessionAdapter;
import net.sourceforge.squirrel_sql.client.session.event.SessionEvent;
import net.sourceforge.squirrel_sql.client.session.mainpanel.objecttree.INodeExpander;
import net.sourceforge.squirrel_sql.client.session.properties.ISessionPropertiesPanel;
-import net.sourceforge.squirrel_sql.fw.gui.GUIUtils;
import net.sourceforge.squirrel_sql.fw.sql.DatabaseObjectType;
import net.sourceforge.squirrel_sql.fw.util.log.ILogger;
import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
@@ -59,6 +58,12 @@ public boolean allowsSessionStartedInBackground()
return false;
}
+ @Override
+ public int getSessionStartedCallRank()
+ {
+ return 0;
+ }
+
/**
* Called when a session shutdown.
*
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/plugin/ISessionPlugin.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/plugin/ISessionPlugin.java
index 86d19d7fa1..b40572f728 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/plugin/ISessionPlugin.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/plugin/ISessionPlugin.java
@@ -19,11 +19,11 @@
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-import net.sourceforge.squirrel_sql.fw.sql.DatabaseObjectType;
import net.sourceforge.squirrel_sql.client.session.ISession;
import net.sourceforge.squirrel_sql.client.session.mainpanel.objecttree.INodeExpander;
import net.sourceforge.squirrel_sql.client.session.properties.ISessionPropertiesPanel;
+import net.sourceforge.squirrel_sql.fw.sql.DatabaseObjectType;
/**
* Base interface for all plugins associated with a session.
*/
@@ -61,6 +61,13 @@ public interface ISessionPlugin extends IPlugin
*/
PluginSessionCallback sessionStarted(ISession session);
+ /**
+ * Allows to influence the order in which {@link #sessionStarted(ISession)} is called with respect to other SessionPlugins.
+ * Safely influencing the order is possible only when {@link #allowsSessionStartedInBackground()} returns false.
+ */
+ int getSessionStartedCallRank();
+
+
/**
* Called when a session shutdown.
*/
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/plugin/PluginInfo.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/plugin/PluginInfo.java
index 99bcfaee7b..8b0d16307c 100755
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/plugin/PluginInfo.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/plugin/PluginInfo.java
@@ -34,7 +34,6 @@ public interface IPropertyNames
String IS_LOADED = "isLoaded";
String PLUGIN_CLASS_NAME = "pluginClassName";
String VERSION = "version";
- String WEB_SITE = "webSite";
}
private String _pluginClassName;
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/plugin/PluginInfoBeanInfo.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/plugin/PluginInfoBeanInfo.java
index 27ffe71d46..0587fba221 100755
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/plugin/PluginInfoBeanInfo.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/plugin/PluginInfoBeanInfo.java
@@ -21,6 +21,8 @@
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.beans.SimpleBeanInfo;
+import java.util.ArrayList;
+import java.util.List;
/**
* This is the BeanInfo class for PluginInfo.
@@ -32,7 +34,7 @@ public final class PluginInfoBeanInfo extends SimpleBeanInfo
private interface IPropNames extends PluginInfo.IPropertyNames
{
- // Empty body, purely to shorten the interface name for convienience.
+ // Empty body, purely to shorten the interface name for convenience.
}
/**
@@ -46,22 +48,17 @@ public PropertyDescriptor[] getPropertyDescriptors()
{
try
{
- PropertyDescriptor[] s_descr = new PropertyDescriptor[8];
+ List s_descr = new ArrayList<>();
- s_descr[0] =
- new PropertyDescriptor(IPropNames.PLUGIN_CLASS_NAME, PluginInfo.class, "getPluginClassName", null);
- s_descr[1] = new PropertyDescriptor(IPropNames.IS_LOADED, PluginInfo.class, "isLoaded", null);
- s_descr[2] =
- new PropertyDescriptor(IPropNames.INTERNAL_NAME, PluginInfo.class, "getInternalName", null);
- s_descr[3] =
- new PropertyDescriptor(IPropNames.DESCRIPTIVE_NAME, PluginInfo.class, "getDescriptiveName", null);
- s_descr[4] = new PropertyDescriptor(IPropNames.AUTHOR, PluginInfo.class, "getAuthor", null);
- s_descr[5] =
- new PropertyDescriptor(IPropNames.CONTRIBUTORS, PluginInfo.class, "getContributors", null);
- s_descr[6] = new PropertyDescriptor(IPropNames.WEB_SITE, PluginInfo.class, "getWebSite", null);
- s_descr[7] = new PropertyDescriptor(IPropNames.VERSION, PluginInfo.class, "getVersion", null);
+ s_descr.add(new PropertyDescriptor(IPropNames.PLUGIN_CLASS_NAME, PluginInfo.class, "getPluginClassName", null));
+ s_descr.add(new PropertyDescriptor(IPropNames.IS_LOADED, PluginInfo.class, "isLoaded", null));
+ s_descr.add(new PropertyDescriptor(IPropNames.INTERNAL_NAME, PluginInfo.class, "getInternalName", null));
+ s_descr.add(new PropertyDescriptor(IPropNames.DESCRIPTIVE_NAME, PluginInfo.class, "getDescriptiveName", null));
+ s_descr.add(new PropertyDescriptor(IPropNames.AUTHOR, PluginInfo.class, "getAuthor", null));
+ s_descr.add(new PropertyDescriptor(IPropNames.CONTRIBUTORS, PluginInfo.class, "getContributors", null));
+ s_descr.add(new PropertyDescriptor(IPropNames.VERSION, PluginInfo.class, "getVersion", null));
- return s_descr;
+ return s_descr.toArray(new PropertyDescriptor[0]);
}
catch (IntrospectionException e)
{
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/plugin/PluginManager.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/plugin/PluginManager.java
index c26d6a4aa1..9228587fff 100755
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/plugin/PluginManager.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/plugin/PluginManager.java
@@ -21,6 +21,20 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
import net.sourceforge.squirrel_sql.client.ApplicationArguments;
import net.sourceforge.squirrel_sql.client.IApplication;
import net.sourceforge.squirrel_sql.client.gui.db.SQLAlias;
@@ -45,21 +59,6 @@
import net.sourceforge.squirrel_sql.fw.util.log.ILogger;
import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
-import java.io.File;
-import java.io.IOException;
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
/**
* Manages plugins for the application.
*
@@ -178,42 +177,47 @@ public synchronized void sessionStarted(final ISession session)
final List plugins = new ArrayList();
_activeSessions.put(session.getIdentifier(), plugins);
- ArrayList startInFG = new ArrayList();
- final ArrayList startInBG = new ArrayList();
+ ArrayList startInFG = new ArrayList<>();
+ final ArrayList startInBG = new ArrayList<>();
for (Iterator it = _sessionPlugins.iterator(); it.hasNext();)
{
SessionPluginInfo spi = it.next();
- if (spi.getSessionPlugin().allowsSessionStartedInBackground())
+ if(spi.getSessionPlugin().allowsSessionStartedInBackground())
{
startInBG.add(spi);
- } else
+ }
+ else
{
startInFG.add(spi);
}
-
}
session.setPluginsfinishedLoading(true);
- for (Iterator it = startInFG.iterator(); it.hasNext();)
- {
- SessionPluginInfo spi = it.next();
- sendSessionStarted(session, spi, plugins);
- }
+
+ startInFG.sort((spi1, spi2) -> compareBySessionStartedCallRank(spi1, spi2));
+ for(SessionPluginInfo spi : startInFG)
+ {
+ sendSessionStarted(session, spi, plugins);
+ }
session.getApplication().getThreadPool().addTask(new Runnable()
{
public void run()
{
- for (Iterator it = startInBG.iterator(); it.hasNext();)
- {
- SessionPluginInfo spi = it.next();
- sendSessionStarted(session, spi, plugins);
- }
+ for(SessionPluginInfo spi : startInBG)
+ {
+ sendSessionStarted(session, spi, plugins);
+ }
session.setPluginsfinishedLoading(true);
}
});
}
+ private int compareBySessionStartedCallRank(SessionPluginInfo spi1, SessionPluginInfo spi2)
+ {
+ return Integer.compare(spi1.getSessionPlugin().getSessionStartedCallRank(), spi2.getSessionPlugin().getSessionStartedCallRank());
+ }
+
private void sendSessionStarted(ISession session, SessionPluginInfo spi, List plugins)
{
try
@@ -222,30 +226,17 @@ private void sendSessionStarted(ISession session, SessionPluginInfo spi, List list =
- _pluginSessionCallbacksBySessionID.get(session.getIdentifier());
- if (null == list)
- {
- list = new ArrayList();
- _pluginSessionCallbacksBySessionID.put(session.getIdentifier(), list);
- }
- list.add(pluginSessionCallback);
-
+ List list = _pluginSessionCallbacksBySessionID.computeIfAbsent(session.getIdentifier(), k -> new ArrayList<>());
+ list.add(pluginSessionCallback);
plugins.add(spi);
}
- } catch (final Throwable th)
+ }
+ catch(final Throwable th)
{
- final String msg =
- s_stringMgr.getString("PluginManager.error.sessionstarted", spi.getPlugin().getDescriptiveName());
- s_log.error(msg, th);
- GUIUtils.processOnSwingEventThread(new Runnable()
- {
- public void run()
- {
- _app.showErrorDialog(msg, th);
- }
- });
+ final String msg =s_stringMgr.getString("PluginManager.error.sessionstarted", spi.getPlugin().getDescriptiveName());
+ s_log.error(msg, th);
+ GUIUtils.processOnSwingEventThread(() -> _app.showErrorDialog(msg, th));
}
}
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/I18NStrings.properties b/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/I18NStrings.properties
index d5ab22254f..efaf97d4fb 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/I18NStrings.properties
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/I18NStrings.properties
@@ -82,6 +82,7 @@ SQLPreferencesPanel.largeScriptStmtCount.note=Note: If the number of statements
SQLPreferencesPanel.copy.quoted.sql.to.clip=In quotes functions should copy quoted SQLs to clipboard
SQLPreferencesPanel.allow.run.all.sqls.in.editor=Allow to run all SQLs in editor
+SQLPreferencesPanel.allow.run.sql.in.all.sessions=Allow to run a SQL in all open Sessions
SQLPreferencesPanel.title=SQL
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/SQLPreferencesController.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/SQLPreferencesController.java
index 70fd9a2692..5c91214f6a 100755
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/SQLPreferencesController.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/SQLPreferencesController.java
@@ -18,6 +18,11 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+import java.awt.Color;
+import java.awt.Component;
+import javax.swing.JColorChooser;
+import javax.swing.JFileChooser;
+import javax.swing.JScrollPane;
import net.sourceforge.squirrel_sql.client.IApplication;
import net.sourceforge.squirrel_sql.client.Main;
import net.sourceforge.squirrel_sql.client.session.mainpanel.changetrack.ChangeTrackPrefsPanelController;
@@ -28,12 +33,6 @@
import net.sourceforge.squirrel_sql.fw.util.StringManager;
import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
-import javax.swing.JColorChooser;
-import javax.swing.JFileChooser;
-import javax.swing.JScrollPane;
-import java.awt.Color;
-import java.awt.Component;
-
/**
* This preferences panel allows maintenance of SQL preferences.
* @author Colin Bell
@@ -78,6 +77,7 @@ void loadData()
_panel.queryTimeout.setInt(prefs.getQueryTimeout());
_panel.chkCopyQuotedSqlsToClip.setSelected(prefs.getCopyQuotedSqlsToClip());
_panel.chkAllowRunAllSQLsInEditor.setSelected(prefs.getAllowRunAllSQLsInEditor());
+ _panel.chkAllowRunSqlInAllSessions.setSelected(prefs.getAllowRunSqlInAllSessions());
_panel.chkMarkCurrentSql.setSelected(prefs.isMarkCurrentSql());
_panel.getCurrentSqlMarkColorIcon().setColor(new Color(prefs.getCurrentSqlMarkColorRGB()));
@@ -113,6 +113,7 @@ public void applyChanges()
prefs.setCopyQuotedSqlsToClip(_panel.chkCopyQuotedSqlsToClip.isSelected());
prefs.setAllowRunAllSQLsInEditor(_panel.chkAllowRunAllSQLsInEditor.isSelected());
+ prefs.setAllowRunSqlInAllSessions(_panel.chkAllowRunSqlInAllSessions.isSelected());
prefs.setMarkCurrentSql(_panel.chkMarkCurrentSql.isSelected());
prefs.setCurrentSqlMarkColorRGB((_panel.getCurrentSqlMarkColorIcon()).getColor().getRGB());
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/SQLPreferencesPanel.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/SQLPreferencesPanel.java
index 238480d604..e0ead47375 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/SQLPreferencesPanel.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/SQLPreferencesPanel.java
@@ -1,14 +1,10 @@
package net.sourceforge.squirrel_sql.client.preferences;
-import net.sourceforge.squirrel_sql.client.session.mainpanel.changetrack.ChangeTrackPrefsPanel;
-import net.sourceforge.squirrel_sql.client.session.mainpanel.resulttabheader.ResultTabHeaderPrefsPanel;
-import net.sourceforge.squirrel_sql.fw.datasetviewer.IDataSetViewer;
-import net.sourceforge.squirrel_sql.fw.gui.IntegerField;
-import net.sourceforge.squirrel_sql.fw.gui.MultipleLineLabel;
-import net.sourceforge.squirrel_sql.fw.gui.OutputLabel;
-import net.sourceforge.squirrel_sql.fw.util.StringManager;
-import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
-
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Insets;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
@@ -18,11 +14,14 @@
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.GridBagConstraints;
-import java.awt.GridBagLayout;
-import java.awt.Insets;
+import net.sourceforge.squirrel_sql.client.session.mainpanel.changetrack.ChangeTrackPrefsPanel;
+import net.sourceforge.squirrel_sql.client.session.mainpanel.resulttabheader.ResultTabHeaderPrefsPanel;
+import net.sourceforge.squirrel_sql.fw.datasetviewer.IDataSetViewer;
+import net.sourceforge.squirrel_sql.fw.gui.IntegerField;
+import net.sourceforge.squirrel_sql.fw.gui.MultipleLineLabel;
+import net.sourceforge.squirrel_sql.fw.gui.OutputLabel;
+import net.sourceforge.squirrel_sql.fw.util.StringManager;
+import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
public final class SQLPreferencesPanel extends JPanel
{
@@ -39,6 +38,7 @@ public final class SQLPreferencesPanel extends JPanel
IntegerField queryTimeout = new IntegerField();
JCheckBox chkCopyQuotedSqlsToClip = new JCheckBox(s_stringMgr.getString("SQLPreferencesPanel.copy.quoted.sql.to.clip"));
JCheckBox chkAllowRunAllSQLsInEditor = new JCheckBox(s_stringMgr.getString("SQLPreferencesPanel.allow.run.all.sqls.in.editor"));
+ JCheckBox chkAllowRunSqlInAllSessions = new JCheckBox(s_stringMgr.getString("SQLPreferencesPanel.allow.run.sql.in.all.sessions"));
JCheckBox chkMarkCurrentSql = new JCheckBox(s_stringMgr.getString("SQLPreferencesPanel.mark.current.sql"));
JButton btnCurrentSqlMarkColorRGB = new JButton();
@@ -149,35 +149,40 @@ private JPanel createGeneralPanel(ResultTabHeaderPrefsPanel resultTabHeaderPrefs
gbc.gridx = 0;
gbc.gridy = 5;
gbc.gridwidth = GridBagConstraints.REMAINDER;
+ pnl.add(chkAllowRunSqlInAllSessions, gbc);
+
+ gbc.gridx = 0;
+ gbc.gridy = 6;
+ gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.fill = GridBagConstraints.NONE;
pnl.add(createCurrentSqlMarkPanel(), gbc);
gbc.gridx = 0;
- gbc.gridy = 6;
+ gbc.gridy = 7;
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.fill = GridBagConstraints.NONE;
pnl.add(chkUseStatementSeparatorAsSqlToExecuteBounds, gbc);
gbc.gridx = 0;
- gbc.gridy = 7;
+ gbc.gridy = 8;
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.fill = GridBagConstraints.HORIZONTAL;
pnl.add(resultTabHeaderPrefsPanel , gbc);
gbc.gridx = 0;
- gbc.gridy = 8;
+ gbc.gridy = 9;
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.fill = GridBagConstraints.HORIZONTAL;
pnl.add(createReloadSQLContentsPanel(), gbc);
gbc.gridx = 0;
- gbc.gridy = 9;
+ gbc.gridy = 10;
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.fill = GridBagConstraints.NONE;
pnl.add(createMaxTextOutputColumnWidthPanel(), gbc);
gbc.gridx = 0;
- gbc.gridy = 10;
+ gbc.gridy = 11;
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.fill = GridBagConstraints.NONE;
pnl.add(chkNotifyExternalFileChanges, gbc);
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/SquirrelPreferences.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/SquirrelPreferences.java
index ff537a2aef..bf19877be7 100755
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/SquirrelPreferences.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/SquirrelPreferences.java
@@ -20,6 +20,15 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+import java.awt.Color;
+import java.beans.PropertyChangeListener;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.Serializable;
+import java.sql.DriverManager;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
import net.sourceforge.squirrel_sql.client.action.ActionKeys;
import net.sourceforge.squirrel_sql.client.gui.db.mainframetitle.PositionInMainFrameTitle;
import net.sourceforge.squirrel_sql.client.gui.mainframe.MainFrameWindowState;
@@ -36,16 +45,6 @@
import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
import net.sourceforge.squirrel_sql.fw.xml.XMLBeanReader;
import net.sourceforge.squirrel_sql.fw.xml.XMLBeanWriter;
-
-import java.awt.Color;
-import java.beans.PropertyChangeListener;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.Serializable;
-import java.sql.DriverManager;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
/**
* This class represents the application preferences.
*
@@ -63,6 +62,7 @@ public interface IPropertyNames
String LARGE_SCRIPT_STMT_COUNT = "largeScriptStmtCount";
String COPY_QUOTED_SQLS_TO_CLIP = "copyQuotedSqlsToClip";
String ALLOW_RUN_ALL_SQLS_IN_EDITOR = "allowRunAllSQLsInEditor";
+ String ALLOW_RUN_SQLS_IN_ALL_OPEN_SESSIONS = "allowRunSqlInAllSessions";
String MARK_CURRENT_SQL = "markCurrentSql";
String CURRENT_SQL_MARK_COLOR_RGB = "currentSqlMarkColorRGB";
@@ -213,9 +213,11 @@ public interface IJdbcDebugTypes
private boolean _copyQuotedSqlsToClip;
- private boolean _allowRunAllSQLsInEditor = true;
+ private boolean _allowRunAllSQLsInEditor = false;
+
+ private boolean _allowRunSqlInAllSessions = false;
- /** Show tooltips for controls. */
+ /** Show tooltips for controls. */
private boolean _showToolTips = true;
/** Use scrollable tabbed panes. JDK 1.4 and above only. */
@@ -1331,7 +1333,7 @@ public void setCopyQuotedSqlsToClip(boolean copyQuotedSqlsToClip)
public boolean getAllowRunAllSQLsInEditor()
{
- return _allowRunAllSQLsInEditor;
+ return isAllowRunAllSQLsInEditor();
}
public boolean isAllowRunAllSQLsInEditor()
@@ -1344,7 +1346,23 @@ public void setAllowRunAllSQLsInEditor(boolean allowRunAllSQLsInEditor)
_allowRunAllSQLsInEditor = allowRunAllSQLsInEditor;
}
- public boolean isMarkCurrentSql()
+ public boolean getAllowRunSqlInAllSessions()
+ {
+ return isAllowRunSqlInAllSessions();
+ }
+
+ public boolean isAllowRunSqlInAllSessions()
+ {
+ return _allowRunSqlInAllSessions;
+ }
+
+ public void setAllowRunSqlInAllSessions(boolean allowRunSqlInAllSessions)
+ {
+ _allowRunSqlInAllSessions = allowRunSqlInAllSessions;
+ }
+
+
+ public boolean isMarkCurrentSql()
{
return _markCurrentSql;
}
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/SquirrelPreferencesBeanInfo.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/SquirrelPreferencesBeanInfo.java
index 135a7412c6..5f5db1ab2d 100755
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/SquirrelPreferencesBeanInfo.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/SquirrelPreferencesBeanInfo.java
@@ -19,12 +19,11 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-import net.sourceforge.squirrel_sql.fw.util.Utilities;
-
import java.beans.IndexedPropertyDescriptor;
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.beans.SimpleBeanInfo;
+import net.sourceforge.squirrel_sql.fw.util.Utilities;
/**
* This is the BeanInfo class for SquirrelPreferences.
@@ -57,6 +56,7 @@ public PropertyDescriptor[] getPropertyDescriptors()
prop(LARGE_SCRIPT_STMT_COUNT, SquirrelPreferences.class, "getLargeScriptStmtCount", "setLargeScriptStmtCount"),
prop(ALLOW_RUN_ALL_SQLS_IN_EDITOR, SquirrelPreferences.class, "isAllowRunAllSQLsInEditor", "setAllowRunAllSQLsInEditor"),
+ prop(ALLOW_RUN_SQLS_IN_ALL_OPEN_SESSIONS, SquirrelPreferences.class, "isAllowRunSqlInAllSessions", "setAllowRunSqlInAllSessions"),
prop(MARK_CURRENT_SQL, SquirrelPreferences.class, "isMarkCurrentSql", "setMarkCurrentSql"),
prop(CURRENT_SQL_MARK_COLOR_RGB, SquirrelPreferences.class, "getCurrentSqlMarkColorRGB", "setCurrentSqlMarkColorRGB"),
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/shortcut/I18NStrings.properties b/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/shortcut/I18NStrings.properties
index 49b8a4476c..1ce8842791 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/shortcut/I18NStrings.properties
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/shortcut/I18NStrings.properties
@@ -1,12 +1,13 @@
keystroke.prefs.title=Keyboard shortcuts
keystroke.prefs.hint=Configure keyboard shortcuts
-ShortcutPrefsCtrl.column.actionName=Action Name
+ShortcutPrefsCtrl.column.actionName=Action name
ShortcutPrefsCtrl.column.validKeyStroke=Valid shortcut
ShortcutPrefsCtrl.column.defaultKeyStroke=Default shortcut
+ShortcutPrefsCtrl.column.description=Action description
ShortcutPrefsPanel.lbl.edit.shortcut=Enter shortcut:
-ShortcutPrefsPanel.txt.shortcut.formated=Selected action: "{0}" (Default shortcut: {1})
+ShortcutPrefsPanel.txt.shortcut.formated_extended=Selected action: "{0}" / Default shortcut: {1} / Description: {2}
ShortcutPrefsPanel.btn.apply=Apply shortcut
ShortcutPrefsPanel.btn.remove=Remove shortcut
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/shortcut/ShortcutPrefsCtrl.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/shortcut/ShortcutPrefsCtrl.java
index 739eab771f..e906ae75a2 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/shortcut/ShortcutPrefsCtrl.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/shortcut/ShortcutPrefsCtrl.java
@@ -1,5 +1,14 @@
package net.sourceforge.squirrel_sql.client.preferences.shortcut;
+import java.awt.Color;
+import java.awt.event.KeyAdapter;
+import java.awt.event.KeyEvent;
+import java.util.List;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.KeyStroke;
+import javax.swing.ListSelectionModel;
+import javax.swing.SwingUtilities;
import net.sourceforge.squirrel_sql.client.Main;
import net.sourceforge.squirrel_sql.client.shortcut.Shortcut;
import net.sourceforge.squirrel_sql.client.shortcut.ShortcutUtil;
@@ -10,16 +19,7 @@
import net.sourceforge.squirrel_sql.fw.util.StringManager;
import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
import net.sourceforge.squirrel_sql.fw.util.Utilities;
-
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.KeyStroke;
-import javax.swing.ListSelectionModel;
-import javax.swing.SwingUtilities;
-import java.awt.Color;
-import java.awt.event.KeyAdapter;
-import java.awt.event.KeyEvent;
-import java.util.List;
+import org.apache.commons.lang3.StringUtils;
public class ShortcutPrefsCtrl
@@ -30,10 +30,12 @@ public class ShortcutPrefsCtrl
private static final String PREF_KEY_ACTION_NAME_COL_WIDTH = "ShortcutPrefsCtrl.column.actionName.width";
private static final String PREF_KEY_VALID_SHORTCUT_COL_WIDTH = "ShortcutPrefsCtrl.column.validShortcut.width";
private static final String PREF_KEY_DEFAULT_SHORTCUT_COL_WIDTH = "ShortcutPrefsCtrl.column.defaultShortcut.width";
+ private static final String PREF_KEY_ACTION_DESCRIPTION_COL_WIDTH = "ShortcutPrefsCtrl.column.actionDescription.width";
public static final String COL_HEADER_ACTION_NAME = s_stringMgr.getString("ShortcutPrefsCtrl.column.actionName");
public static final String COL_HEADER_VALID_SHORTCUT = s_stringMgr.getString("ShortcutPrefsCtrl.column.validKeyStroke");
public static final String COL_HEADER_DEFAULT_SHORTCUT = s_stringMgr.getString("ShortcutPrefsCtrl.column.defaultKeyStroke");
+ public static final String COL_HEADER_ACTION_DESCRIPTION = s_stringMgr.getString("ShortcutPrefsCtrl.column.description");
private ShortcutPrefsPanel _shortcutPrefsPanel = new ShortcutPrefsPanel();
private KeyStroke _currentKeyStroke;
@@ -46,7 +48,7 @@ public void applyChanges()
Props.putInt(PREF_KEY_ACTION_NAME_COL_WIDTH, _shortcutPrefsPanel.tblShortcuts.getColumnWidthForHeader(COL_HEADER_ACTION_NAME));
Props.putInt(PREF_KEY_VALID_SHORTCUT_COL_WIDTH, _shortcutPrefsPanel.tblShortcuts.getColumnWidthForHeader(COL_HEADER_VALID_SHORTCUT));
Props.putInt(PREF_KEY_DEFAULT_SHORTCUT_COL_WIDTH, _shortcutPrefsPanel.tblShortcuts.getColumnWidthForHeader(COL_HEADER_DEFAULT_SHORTCUT));
-
+ Props.putInt(PREF_KEY_ACTION_DESCRIPTION_COL_WIDTH, _shortcutPrefsPanel.tblShortcuts.getColumnWidthForHeader(COL_HEADER_ACTION_DESCRIPTION));
Main.getApplication().getShortcutManager().save();
@@ -60,17 +62,22 @@ public JPanel getPanel()
_shortcutDataSet = new JavabeanArrayDataSet(Shortcut.class);
_shortcutDataSet.setColHeader("actionName", COL_HEADER_ACTION_NAME);
- _shortcutDataSet.setColPos("actionName", 1);
+ _shortcutDataSet.setColPos("actionName", 0);
_shortcutDataSet.setAbsoluteWidht("actionName", Props.getInt(PREF_KEY_ACTION_NAME_COL_WIDTH, 200));
_shortcutDataSet.setColHeader("validKeyStroke", COL_HEADER_VALID_SHORTCUT);
- _shortcutDataSet.setColPos("validKeyStroke", 2);
+ _shortcutDataSet.setColPos("validKeyStroke", 1);
_shortcutDataSet.setAbsoluteWidht("validKeyStroke", Props.getInt(PREF_KEY_VALID_SHORTCUT_COL_WIDTH, 200));
_shortcutDataSet.setColHeader("defaultKeyStroke", COL_HEADER_DEFAULT_SHORTCUT);
_shortcutDataSet.setColPos("defaultKeyStroke", 2);
_shortcutDataSet.setAbsoluteWidht("defaultKeyStroke", Props.getInt(PREF_KEY_DEFAULT_SHORTCUT_COL_WIDTH, 200));
+ _shortcutDataSet.setColHeader("actionDescription", COL_HEADER_ACTION_DESCRIPTION);
+ _shortcutDataSet.setColPos("actionDescription", 3);
+ _shortcutDataSet.setAbsoluteWidht("actionDescription", Props.getInt(PREF_KEY_ACTION_DESCRIPTION_COL_WIDTH, 200));
+
+
_shortcutDataSet.setIgnoreProperty("userKeyStroke");
displayShortcuts();
@@ -108,7 +115,7 @@ private Color onGetCellColor(int row, int column, boolean isSelected)
{
int modelColumn = _shortcutPrefsPanel.tblShortcuts.getTable().getColumnModel().getColumn(column).getModelIndex();
- if(2 != modelColumn)
+ if(1 != modelColumn)
{
return null;
}
@@ -156,15 +163,20 @@ private void onSelectedShortcutChanged()
if(0 == _shortcutPrefsPanel.tblShortcuts.getSelectedModelRows().length)
{
- _shortcutPrefsPanel.txtSelectedShortcut.setText(s_stringMgr.getString("ShortcutPrefsPanel.txt.shortcut.formated", "", "", "", ""));
return;
-
}
-
Shortcut selectedShortcut = getSelectedShortcut();
- _shortcutPrefsPanel.txtSelectedShortcut.setText(s_stringMgr.getString("ShortcutPrefsPanel.txt.shortcut.formated", selectedShortcut.getActionName(), selectedShortcut.getDefaultKeyStroke()));
+ _shortcutPrefsPanel.txtSelectedShortcut.setText(s_stringMgr.getString("ShortcutPrefsPanel.txt.shortcut.formated_extended", selectedShortcut.getActionName(), selectedShortcut.getDefaultKeyStroke(), getDescription(selectedShortcut)));
+
+ _shortcutPrefsPanel.txtSelectedShortcut.setCaretPosition(0);
+ }
+
+ private String getDescription(Shortcut selectedShortcut)
+ {
+ return StringUtils.isBlank(selectedShortcut.getActionDescription()) ? "" : selectedShortcut.getActionDescription();
}
private void displayShortcuts()
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/resources/SquirrelResources.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/resources/SquirrelResources.java
index dfc6c220fa..c759804f1f 100755
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/resources/SquirrelResources.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/resources/SquirrelResources.java
@@ -231,6 +231,9 @@ public interface IImageNames
String BOOKMARK_SINGLE = "bookmark_single";
String PASSWORD_12X12 = "password12x12";
+
+ String RUN_TIMER = "runTimer";
+ String RUN_TIMER_STOP = "runTimerStop";
}
public SquirrelResources(String rsrcBundleBaseName)
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/resources/images/multiSessionExec.png b/sql12/core/src/net/sourceforge/squirrel_sql/client/resources/images/multiSessionExec.png
new file mode 100644
index 0000000000..31ddc1e8f4
Binary files /dev/null and b/sql12/core/src/net/sourceforge/squirrel_sql/client/resources/images/multiSessionExec.png differ
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/resources/images/runTimer.png b/sql12/core/src/net/sourceforge/squirrel_sql/client/resources/images/runTimer.png
new file mode 100644
index 0000000000..5f36b5520a
Binary files /dev/null and b/sql12/core/src/net/sourceforge/squirrel_sql/client/resources/images/runTimer.png differ
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/resources/images/runTimerStop.png b/sql12/core/src/net/sourceforge/squirrel_sql/client/resources/images/runTimerStop.png
new file mode 100644
index 0000000000..6ffaaf3ca9
Binary files /dev/null and b/sql12/core/src/net/sourceforge/squirrel_sql/client/resources/images/runTimerStop.png differ
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/resources/squirrel.properties b/sql12/core/src/net/sourceforge/squirrel_sql/client/resources/squirrel.properties
index ba57eeeb7b..8341057bc5 100755
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/resources/squirrel.properties
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/resources/squirrel.properties
@@ -224,6 +224,9 @@ bookmark_single.image=bookmark_single.png
password12x12.image=password12x12.png
+runTimer.image=runTimer.png
+runTimerStop.image=runTimerStop.png
+
########
# Configuration information for ObjectTreeInternalFrame.
########
@@ -582,6 +585,10 @@ action.net.sourceforge.squirrel_sql.client.session.action.ExecuteAllSqlsAction.i
action.net.sourceforge.squirrel_sql.client.session.action.ExecuteAllSqlsAction.name=Run all SQLs
action.net.sourceforge.squirrel_sql.client.session.action.ExecuteAllSqlsAction.tooltip=Run all SQLs in editor
+action.net.sourceforge.squirrel_sql.client.session.action.ExecuteSqlInAllSessionsAction.image=multiSessionExec.png
+action.net.sourceforge.squirrel_sql.client.session.action.ExecuteSqlInAllSessionsAction.name=Run SQL in all open Sessions
+action.net.sourceforge.squirrel_sql.client.session.action.ExecuteSqlInAllSessionsAction.tooltip=Run SQL in all open Sessions
+
action.net.sourceforge.squirrel_sql.client.session.action.DropSelectedTablesAction.image=
action.net.sourceforge.squirrel_sql.client.session.action.DropSelectedTablesAction.name=Drop
action.net.sourceforge.squirrel_sql.client.session.action.DropSelectedTablesAction.tooltip=Drop the selected table(s)
@@ -1423,6 +1430,9 @@ menuitem.net.sourceforge.squirrel_sql.client.session.action.ExecuteSqlAction.mne
menuitem.net.sourceforge.squirrel_sql.client.session.action.ExecuteAllSqlsAction.accelerator=alt shift ENTER
menuitem.net.sourceforge.squirrel_sql.client.session.action.ExecuteAllSqlsAction.mnemonic=
+menuitem.net.sourceforge.squirrel_sql.client.session.action.ExecuteSqlInAllSessionsAction.accelerator=control alt shift ENTER
+menuitem.net.sourceforge.squirrel_sql.client.session.action.ExecuteSqlInAllSessionsAction.mnemonic=
+
menuitem.net.sourceforge.squirrel_sql.client.session.action.file.FileOpenAction.accelerator=
menuitem.net.sourceforge.squirrel_sql.client.session.action.file.FileOpenAction.mnemonic=O
@@ -1471,7 +1481,7 @@ menuitem.net.sourceforge.squirrel_sql.client.session.action.PreviousSessionActio
# Conflicts with 'close all result tabs'. Does this really need a short cut ?
#menuitem.net.sourceforge.squirrel_sql.client.session.action.reconnect.ReconnectAction.accelerator=control shift T
menuitem.net.sourceforge.squirrel_sql.client.session.action.reconnect.ReconnectAction.accelerator=control alt T
-menuitem.net.sourceforge.squirrel_sql.client.session.action.reconnect.ReconnectAction.mnemonic=T
+menuitem.net.sourceforge.squirrel_sql.client.session.action.reconnect.ReconnectAction.mnemonic=t
menuitem.net.sourceforge.squirrel_sql.client.session.action.RedoAction.accelerator= control R
menuitem.net.sourceforge.squirrel_sql.client.session.action.RedoAction.mnemonic=R
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/DataSetUpdateableTableModelImpl.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/DataSetUpdateableTableModelImpl.java
index fc2701f77c..d39e35a1c6 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/DataSetUpdateableTableModelImpl.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/DataSetUpdateableTableModelImpl.java
@@ -1,5 +1,14 @@
package net.sourceforge.squirrel_sql.client.session;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Vector;
+import javax.swing.JOptionPane;
+
import net.sourceforge.squirrel_sql.client.session.mainpanel.sqltypecheck.ReadOnlySessionCheck;
import net.sourceforge.squirrel_sql.client.session.properties.EditWhereCols;
import net.sourceforge.squirrel_sql.fw.datasetviewer.ColumnDisplayDefinition;
@@ -22,15 +31,6 @@
import net.sourceforge.squirrel_sql.fw.util.log.ILogger;
import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
-import javax.swing.JOptionPane;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Vector;
-
public class DataSetUpdateableTableModelImpl implements IDataSetUpdateableTableModel
{
@@ -646,29 +646,37 @@ private List getWhereClause(
// the user has restricted the set of columns to use.
// If this name is NOT in the list, then skip it; otherwise we fall through
// and use the column in the WHERE clause
- if (colNames.get(colDefs[i].getColumnName()) == null)
+ if( colNames.get(colDefs[i].getColumnName()) == null )
+ {
continue; // go on to the next item
+ }
}
// for the column that is being changed, use the value
// passed in by the caller (which may be either the
// current value or the new replacement value)
Object value = values[i];
- if (i == col)
+ if( i == col )
+ {
value = colValue;
+ }
- // convert user representation of null into an actual null
- if (value != null && value.toString().equals(StringUtilities.NULL_AS_STRING))
+ if( value != null && value.toString().equals(StringUtilities.NULL_AS_STRING) )
+ {
+ // convert user representation of null into an actual null
value = null;
+ }
// do different things depending on data type
ISQLDatabaseMetaData md = _session.getMetaData();
IWhereClausePart clausePart = CellComponentFactory.getWhereClauseValue(colDefs[i], value, md);
- if (clausePart.shouldBeUsed())
- // Now we know that the part should not we ignoredshould
+ if( null != clausePart && clausePart.shouldBeUsed() )
+ {
+ // Now we know that the part should not be ignored
clauseParts.add(clausePart);
+ }
}
return clauseParts;
@@ -676,7 +684,7 @@ private List getWhereClause(
}
catch (Exception e)
{
- throw new RuntimeException(e);
+ throw Utilities.wrapRuntime(e);
}
}
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/ISQLPanelAPI.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/ISQLPanelAPI.java
index fc090eb707..07ba1a597a 100755
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/ISQLPanelAPI.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/ISQLPanelAPI.java
@@ -19,6 +19,10 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+import java.util.ArrayList;
+import javax.swing.Action;
+import javax.swing.JMenu;
+import javax.swing.JMenuItem;
import net.sourceforge.squirrel_sql.client.session.action.UndoRedoActionContext;
import net.sourceforge.squirrel_sql.client.session.event.ISQLExecutionListener;
import net.sourceforge.squirrel_sql.client.session.event.ISQLPanelListener;
@@ -30,11 +34,6 @@
import net.sourceforge.squirrel_sql.client.session.mainpanel.changetrack.ChangeTracker;
import net.sourceforge.squirrel_sql.client.session.mainpanel.sqltab.SQLPanelSplitter;
-import javax.swing.Action;
-import javax.swing.JMenu;
-import javax.swing.JMenuItem;
-import java.util.ArrayList;
-
/**
* This interface defines the API through which plugins can work with the SQL
* panel.
@@ -198,8 +197,9 @@ public interface ISQLPanelAPI extends IFileEditorAPI
void executeAllSQLs();
+ void executeSQL(String sqlScriptToBeExecuted);
- /**
+ /**
* Close all the SQL result tabs.
*/
void closeAllSQLResultTabs();
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/SQLPanelAPI.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/SQLPanelAPI.java
index cf1b833e3e..67fed227fc 100755
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/SQLPanelAPI.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/SQLPanelAPI.java
@@ -21,6 +21,12 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+import java.awt.Frame;
+import java.util.ArrayList;
+import javax.swing.Action;
+import javax.swing.JMenu;
+import javax.swing.JMenuItem;
+import javax.swing.JTextArea;
import net.sourceforge.squirrel_sql.client.Main;
import net.sourceforge.squirrel_sql.client.action.ActionCollection;
import net.sourceforge.squirrel_sql.client.gui.session.ToolsPopupController;
@@ -61,13 +67,6 @@
import net.sourceforge.squirrel_sql.fw.util.StringManager;
import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
-import javax.swing.Action;
-import javax.swing.JMenu;
-import javax.swing.JMenuItem;
-import javax.swing.JTextArea;
-import java.awt.Frame;
-import java.util.ArrayList;
-
/**
* This class is the API through which plugins can work with the SQL Panel.
*
@@ -520,6 +519,12 @@ public void executeAllSQLs()
_panel.runAllSqlsExecuter();
}
+ @Override
+ public void executeSQL(String sqlToBeExecuted)
+ {
+ _panel.getSQLExecPanel().executeSQL(sqlToBeExecuted);
+ }
+
/**
* Close all the SQL result tabs.
*/
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/action/ExecuteSqlInAllSessionsAction.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/action/ExecuteSqlInAllSessionsAction.java
new file mode 100644
index 0000000000..210e6ee5a6
--- /dev/null
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/action/ExecuteSqlInAllSessionsAction.java
@@ -0,0 +1,45 @@
+package net.sourceforge.squirrel_sql.client.session.action;
+
+import java.awt.event.ActionEvent;
+import net.sourceforge.squirrel_sql.client.Main;
+import net.sourceforge.squirrel_sql.client.action.SquirrelAction;
+import net.sourceforge.squirrel_sql.client.session.ISQLPanelAPI;
+import net.sourceforge.squirrel_sql.client.session.ISession;
+
+public class ExecuteSqlInAllSessionsAction extends SquirrelAction implements ISQLPanelAction
+{
+ private ISQLPanelAPI _panel;
+
+ public ExecuteSqlInAllSessionsAction()
+ {
+ super(Main.getApplication());
+ setEnabled(false);
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent evt)
+ {
+ String sqlToBeExecuted = _panel.getSQLScriptToBeExecuted();
+
+ _panel.executeSQL(sqlToBeExecuted);
+
+ for(ISession openSession : Main.getApplication().getSessionManager().getOpenSessions())
+ {
+ if(openSession == _panel.getSession())
+ {
+ continue;
+ }
+
+ openSession.getSessionInternalFrame().getMainSQLPanelAPI().executeSQL(sqlToBeExecuted);
+ }
+
+ System.out.println("ExecuteSqlInAllSessionsAction.actionPerformed END");
+ }
+
+ @Override
+ public void setSQLPanel(ISQLPanelAPI panel)
+ {
+ _panel = panel;
+ setEnabled(null != _panel && getApplication().getSquirrelPreferences().isAllowRunSqlInAllSessions());
+ }
+}
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/action/syntax/rsyntax/SquirreLRSyntaxTextAreaUI.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/action/syntax/rsyntax/SquirreLRSyntaxTextAreaUI.java
index 3fd23c93f2..5304b0fc11 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/action/syntax/rsyntax/SquirreLRSyntaxTextAreaUI.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/action/syntax/rsyntax/SquirreLRSyntaxTextAreaUI.java
@@ -1,7 +1,19 @@
package net.sourceforge.squirrel_sql.client.session.action.syntax.rsyntax;
+import java.awt.event.ActionEvent;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import javax.swing.Action;
+import javax.swing.InputMap;
+import javax.swing.KeyStroke;
+import javax.swing.UIManager;
+import javax.swing.plaf.InputMapUIResource;
+import javax.swing.text.EditorKit;
+import javax.swing.text.JTextComponent;
+import javax.swing.text.TextAction;
import net.sourceforge.squirrel_sql.client.Main;
import net.sourceforge.squirrel_sql.client.session.mainpanel.IUndoHandler;
+import net.sourceforge.squirrel_sql.client.shortcut.ShortCutDescriptionReader;
import net.sourceforge.squirrel_sql.fw.gui.stdtextpopup.TextActionUtil;
import net.sourceforge.squirrel_sql.fw.gui.stdtextpopup.TextBeginAction;
import net.sourceforge.squirrel_sql.fw.gui.stdtextpopup.TextBeginLineAction;
@@ -17,18 +29,6 @@
import org.fife.ui.rtextarea.RTextArea;
import org.fife.ui.rtextarea.RTextAreaEditorKit;
-import javax.swing.Action;
-import javax.swing.InputMap;
-import javax.swing.KeyStroke;
-import javax.swing.UIManager;
-import javax.swing.plaf.InputMapUIResource;
-import javax.swing.text.EditorKit;
-import javax.swing.text.JTextComponent;
-import javax.swing.text.TextAction;
-import java.awt.event.ActionEvent;
-import java.awt.event.InputEvent;
-import java.awt.event.KeyEvent;
-
public class SquirreLRSyntaxTextAreaUI extends RSyntaxTextAreaUI
{
private static final KeyStroke RS_KEY_STROKE_TO_UPPER_CASE = KeyStroke.getKeyStroke(KeyEvent.VK_U, InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK);
@@ -192,26 +192,37 @@ public static Action getActionForName(SquirrelRSyntaxTextArea squirrelRSyntaxTex
public static KeyStroke getToUpperCaseKeyStroke()
{
- return KeyStroke.getKeyStroke(Main.getApplication().getShortcutManager().registerAccelerator(RTextAreaEditorKit.rtaUpperSelectionCaseAction, SquirreLRSyntaxTextAreaUI.RS_KEY_STROKE_TO_UPPER_CASE));
+ return KeyStroke.getKeyStroke(Main.getApplication().getShortcutManager().registerAccelerator(RTextAreaEditorKit.rtaUpperSelectionCaseAction,
+ SquirreLRSyntaxTextAreaUI.RS_KEY_STROKE_TO_UPPER_CASE,
+ ShortCutDescriptionReader.of()));
}
public static KeyStroke getToLowerCaseKeyStroke()
{
- return KeyStroke.getKeyStroke(Main.getApplication().getShortcutManager().registerAccelerator(RTextAreaEditorKit.rtaLowerSelectionCaseAction, SquirreLRSyntaxTextAreaUI.RS_KEY_STROKE_TO_LOWER_CASE));
+ return KeyStroke.getKeyStroke(Main.getApplication().getShortcutManager().registerAccelerator(RTextAreaEditorKit.rtaLowerSelectionCaseAction,
+ SquirreLRSyntaxTextAreaUI.RS_KEY_STROKE_TO_LOWER_CASE,
+ ShortCutDescriptionReader.of()));
}
public static KeyStroke getLineUpKeyStroke()
{
- return KeyStroke.getKeyStroke(Main.getApplication().getShortcutManager().registerAccelerator(RTextAreaEditorKit.rtaLineUpAction, SquirreLRSyntaxTextAreaUI.RS_KEY_STROKE_LINE_UP));
+ return KeyStroke.getKeyStroke(Main.getApplication().getShortcutManager().registerAccelerator(RTextAreaEditorKit.rtaLineUpAction,
+ SquirreLRSyntaxTextAreaUI.RS_KEY_STROKE_LINE_UP,
+ ShortCutDescriptionReader.of()));
+
}
public static KeyStroke getLineDownKeyStroke()
{
- return KeyStroke.getKeyStroke(Main.getApplication().getShortcutManager().registerAccelerator(RTextAreaEditorKit.rtaLineDownAction, SquirreLRSyntaxTextAreaUI.RS_KEY_STROKE_LINE_DOWN));
+ return KeyStroke.getKeyStroke(Main.getApplication().getShortcutManager().registerAccelerator(RTextAreaEditorKit.rtaLineDownAction,
+ SquirreLRSyntaxTextAreaUI.RS_KEY_STROKE_LINE_DOWN,
+ ShortCutDescriptionReader.of()));
}
public static KeyStroke getSelectWordStroke()
{
- return KeyStroke.getKeyStroke(Main.getApplication().getShortcutManager().registerAccelerator(RTextAreaEditorKit.selectWordAction, SquirreLRSyntaxTextAreaUI.RS_KEY_STROKE_SELECT_WORD));
+ return KeyStroke.getKeyStroke(Main.getApplication().getShortcutManager().registerAccelerator(RTextAreaEditorKit.selectWordAction,
+ SquirreLRSyntaxTextAreaUI.RS_KEY_STROKE_SELECT_WORD,
+ ShortCutDescriptionReader.of()));
}
@Override
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/IResultTab.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/IResultTab.java
index 3f751d1ce3..046cc25d07 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/IResultTab.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/IResultTab.java
@@ -18,6 +18,11 @@
*/
package net.sourceforge.squirrel_sql.client.session.mainpanel;
+import java.awt.Window;
+import java.awt.event.ActionEvent;
+import javax.swing.JComponent;
+import javax.swing.JTabbedPane;
+import net.sourceforge.squirrel_sql.client.session.mainpanel.resulttabactions.ReRunChooserCtrl;
import net.sourceforge.squirrel_sql.fw.datasetviewer.IDataSetViewer;
import net.sourceforge.squirrel_sql.fw.datasetviewer.TableState;
import net.sourceforge.squirrel_sql.fw.datasetviewer.coloring.markduplicates.MarkDuplicatesChooserController;
@@ -25,11 +30,6 @@
import net.sourceforge.squirrel_sql.fw.datasetviewer.tablefind.GlobalFindRemoteControl;
import net.sourceforge.squirrel_sql.fw.id.IntegerIdentifier;
-import javax.swing.JComponent;
-import javax.swing.JTabbedPane;
-import java.awt.Window;
-import java.awt.event.ActionEvent;
-
public interface IResultTab
{
/**
@@ -51,6 +51,8 @@ public interface IResultTab
void disposeTab();
void addResultTabCloseListener(ResultTabCloseListener l);
+ void removeResultTabCloseListener(ResultTabCloseListener l);
+
void returnToTabbedPane();
@@ -70,8 +72,10 @@ public interface IResultTab
void reRunSQL();
+ void reRunSqlWithTimerRepeats(int repeatSeconds);
TableState getResultSortableTableState();
+ void applyResultSortableTableState(TableState tableState);
void toggleShowFindPanel();
@@ -106,4 +110,21 @@ public interface IResultTab
void setSQLResultTabSelected();
GlobalFindRemoteControl getDataSetViewerFindRemoteControlOfSQLQueryResultTabOrNull();
+
+ /**
+ * Is called before the {@link ResultTabCloseListener] of the previous {@link ResultTab} is fired.
+ */
+ void aboutToBeReplacedBy(ResultTab tab);
+
+ /**
+ * Is called before the {@link ResultTabCloseListener] of the previous {@link ResultTab} is fired.
+ */
+ void aboutToBeReplacedBy(ResultTab newResultTab, ReRunChooserCtrl reRunChooserCtrl);
+
+ void prepareBeingMovedToResultFrame();
+
+ /**
+ * @return The previous {@link ResultTabListener}
+ */
+ ResultTabListener replaceResultTabListener(ResultTabListener resultTabListener);
}
\ No newline at end of file
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/RerunWithTimerRepeatsManager.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/RerunWithTimerRepeatsManager.java
new file mode 100644
index 0000000000..afdfaedb97
--- /dev/null
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/RerunWithTimerRepeatsManager.java
@@ -0,0 +1,77 @@
+package net.sourceforge.squirrel_sql.client.session.mainpanel;
+
+import java.util.List;
+import javax.swing.Timer;
+import net.sourceforge.squirrel_sql.client.session.mainpanel.resulttabactions.ReRunChooserCtrl;
+
+public class RerunWithTimerRepeatsManager
+{
+ private Timer _timer;
+ private ResultTabCloseListener _resultTabCloseListener = () -> disposeTimer();
+
+ private record ResultTabData(ResultTab resultTab, ReRunChooserCtrl reRunChooserCtrl){}
+
+ private boolean _newResultTabData;
+ private ResultTabData _currentResultTabData;
+
+ void startTimerRepeats(int repeatSeconds, ResultTab resultTab, ReRunChooserCtrl reRunChooserCtrl)
+ {
+ initNewResultTabData(resultTab, reRunChooserCtrl);
+
+ disposeTimer();
+ _timer = new Timer(1000 * repeatSeconds, e -> onTimerTriggered());
+ _timer.setRepeats(true);
+ _timer.start();
+ onTimerTriggered();
+ }
+
+ private void onTimerTriggered()
+ {
+ // If the ResultTabData aren't new the rerun previously triggered is still running.
+ if(_newResultTabData)
+ {
+ _newResultTabData = false;
+ _currentResultTabData.resultTab.reRunSQLIntern();
+ }
+ }
+
+ void aboutToBeReplacedBy(ResultTab newResultTab, ReRunChooserCtrl newReRunChooserCtrl)
+ {
+ if(null == _timer || false == _timer.isRunning())
+ {
+ return;
+ }
+
+ initNewResultTabData(newResultTab, newReRunChooserCtrl);
+ }
+
+ public void disposeTimer()
+ {
+ if(null == _timer)
+ {
+ return;
+ }
+ _timer.stop();
+ List.of(_timer.getActionListeners()).forEach(l -> _timer.removeActionListener(l));
+ }
+
+
+ private void initNewResultTabData(ResultTab resultTab, ReRunChooserCtrl reRunChooserCtrl)
+ {
+ if(null != _currentResultTabData)
+ {
+ _currentResultTabData.reRunChooserCtrl.cleanUp();
+
+ // Note: When this method is called by aboutToBeReplacedBy() this method will be called before the ResultTabCloseListener is fired.
+ // The following command makes sure that disposeTimer() isn't called when the ResultTab is replaced
+ _currentResultTabData.resultTab.removeResultTabCloseListener(_resultTabCloseListener);
+ }
+
+ _currentResultTabData = new ResultTabData(resultTab, reRunChooserCtrl);
+ _currentResultTabData.reRunChooserCtrl.setResultTab(resultTab);
+ _currentResultTabData.reRunChooserCtrl.switchToStopButton(e -> disposeTimer());
+ _currentResultTabData.resultTab.addResultTabCloseListener(_resultTabCloseListener);
+ _newResultTabData = true;
+ }
+
+}
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/ResultFrame.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/ResultFrame.java
index 242d17a478..08161f764b 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/ResultFrame.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/ResultFrame.java
@@ -20,6 +20,20 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+import java.awt.BorderLayout;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.GridLayout;
+import java.awt.Insets;
+import java.util.ArrayList;
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JLayeredPane;
+import javax.swing.JPanel;
+import javax.swing.JTabbedPane;
+import javax.swing.SwingUtilities;
+import javax.swing.WindowConstants;
import net.sourceforge.squirrel_sql.client.IApplication;
import net.sourceforge.squirrel_sql.client.Main;
import net.sourceforge.squirrel_sql.client.gui.desktopcontainer.DialogWidget;
@@ -29,20 +43,19 @@
import net.sourceforge.squirrel_sql.client.session.SQLExecutionInfo;
import net.sourceforge.squirrel_sql.client.session.action.ReturnResultTabAction;
import net.sourceforge.squirrel_sql.client.session.event.ISQLExecutionListener;
+import net.sourceforge.squirrel_sql.client.session.mainpanel.resulttabactions.ReRunChooserCtrl;
import net.sourceforge.squirrel_sql.client.session.mainpanel.rowcolandsum.RowColAndSumController;
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.datasetviewer.TableState;
import net.sourceforge.squirrel_sql.fw.datasetviewer.coloring.markduplicates.MarkDuplicatesChooserController;
+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 net.sourceforge.squirrel_sql.fw.util.log.ILogger;
import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
-import javax.swing.*;
-import java.awt.*;
-import java.util.ArrayList;
-
/**
* JASON: Rename to ResultInternalFrame
* Torn off frame that contains SQL results.
@@ -65,33 +78,21 @@ public class ResultFrame extends SessionDialogWidget
private TabButton _btnFindColumn;
private MarkDuplicatesChooserController _markDuplicatesChooserController;
private JCheckBox _chkOnTop;
- private TabButton _btnReRun;
private JPanel _centerPanel;
private RowColAndSumController _rowColAndSumController = new RowColAndSumController();
+ private final ResultTabListener _originalResultTabListener;
+
+ private ReRunChooserCtrl _reRunChooserCtrl;
- /**
- * Ctor.
- *
- *
- *
- *
- *
- * @param session Current session.
- * @param resultTab SQL results tab.
- *
- * @param resultTabFactory
- * @param resultFrameListener
- *@param isOnRerun @throws IllegalArgumentException
- * If a null ISession or
- * ResultTab passed.
- */
public ResultFrame(final ISession session, IResultTab resultTab, ResultTabFactory resultTabFactory, ResultFrameListener resultFrameListener, boolean checkStayOnTop, boolean isOnRerun)
{
super(getFrameTitle(session, resultTab), true, true, true, true, session);
_session = session;
_resultTab = resultTab;
+ _originalResultTabListener = _resultTab.replaceResultTabListener((sql, resultTabToReplace) -> onRerun());
_resultTabFactory = resultTabFactory;
_resultFrameListener = resultFrameListener;
+ _reRunChooserCtrl = new ReRunChooserCtrl(_resultTab);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
@@ -107,8 +108,6 @@ public ResultFrame(final ISession session, IResultTab resultTab, ResultTabFactor
_chkOnTop.addActionListener(e -> onStayOnTopChanged());
- _btnReRun.addActionListener(e -> onRerun());
-
_btnToggleFind.addActionListener(e -> onFind());
_btnFindColumn.addActionListener(e -> onFindColumn());
@@ -132,7 +131,7 @@ private void onFindColumn()
private void onRerun()
{
_btnReturnToTab.setEnabled(false);
- _btnReRun.setEnabled(false);
+ //_reRunChooserCtrl.setEnabled(false);
_centerPanel.removeAll();
new SQLExecutionHandler(_resultTab, _session, _resultTab.getSqlString(), createSQLExecutionHandlerListener(), new ISQLExecutionListener[0]);
}
@@ -177,7 +176,7 @@ public void run()
ErrorPanel errorPanel = _resultTabFactory.createErrorPanel(sqlExecErrorMsgs, lastExecutedStatement);
errorPanel.hideCloseButton();
_centerPanel.add(errorPanel);
- _btnReRun.setEnabled(true);
+ //_reRunChooserCtrl.setEnabled(true);
}
});
}
@@ -189,7 +188,7 @@ private void onSetCancelPanel(final CancelPanelCtrl cancelPanelCtrl)
public void run()
{
_centerPanel.removeAll();
- _centerPanel.add(cancelPanelCtrl.getPanel(), BorderLayout.CENTER);
+ _centerPanel.add(cancelPanelCtrl.getPanel());
}
});
}
@@ -203,31 +202,50 @@ private void onRemoveCancelPanel(final CancelPanelCtrl cancelPanelCtrl, IResultT
private void onAddResultsTab(final SQLExecutionInfo info, final ResultSetDataSet rsds, final ResultSetMetaDataDataSet rsmdds, final IDataSetUpdateableTableModel creator, IResultTab resultTabToReplace)
{
// We start a new frame here because reusing the current one for the new result led to repaint problems
- SwingUtilities.invokeLater(() -> showRerunResultsInNewFrame(info, creator, rsds, rsmdds));
+ SwingUtilities.invokeLater(() -> showRerunResult(info, creator, rsds, rsmdds));
}
- private void showRerunResultsInNewFrame(SQLExecutionInfo info, IDataSetUpdateableTableModel creator, ResultSetDataSet rsds, ResultSetMetaDataDataSet rsmdds)
+ private void showRerunResult(SQLExecutionInfo info, IDataSetUpdateableTableModel creator, ResultSetDataSet rsds, ResultSetMetaDataDataSet rsmdds)
{
try
{
_centerPanel.removeAll();
- ResultTab tab = _resultTabFactory.createResultTab(info, creator, rsds, rsmdds);
- ResultFrame frame = new ResultFrame(_session, tab, _resultTabFactory, _resultFrameListener, _chkOnTop.isSelected(), true);
- showFrame(frame, true);
- setVisible(false);
- dispose();
- _resultFrameListener.frameReplaced(ResultFrame.this, frame);
+ TableState tableState = null;
+
+ if(null != _resultTab)
+ {
+ tableState = _resultTab.getResultSortableTableState();
+ }
+
+ ResultTab newResultTab = _resultTabFactory.createResultTab(info, creator, rsds, rsmdds);
+ _resultTab.aboutToBeReplacedBy(newResultTab, _reRunChooserCtrl);
+
+ _resultTab = newResultTab;
+ _resultTab.replaceResultTabListener((sql, resultTabToReplace) -> onRerun());
+
+ JTabbedPane tabbedPaneOfResultTabs = _resultTab.getTabbedPaneOfResultTabs();
+ GUIUtils.unconventionallyAddToParentWithRepaint(_centerPanel, tabbedPaneOfResultTabs);
+ _markDuplicatesChooserController.init(_resultTab);
+ _reRunChooserCtrl.setResultTab((ResultTab) _resultTab);
+
+ if(null != tableState)
+ {
+ _resultTab.applyResultSortableTableState(tableState);
+ }
+
+ _btnReturnToTab.setEnabled(true);
+ //_reRunChooserCtrl.setEnabled(true);
}
catch (Throwable t)
{
- _session.showErrorMessage(t);
+ Main.getApplication().getMessageHandler().showErrorMessage(t);
}
}
private void showFrame(ResultFrame frame, boolean isOnRerun)
{
- _session.getApplication().getMainFrame().addWidget(frame);
+ Main.getApplication().getMainFrame().addWidget(frame);
if (isOnRerun)
{
frame.setBounds(getBounds());
@@ -265,7 +283,6 @@ private JPanel createLeftButtonsPanel(ISession session, IApplication app, boolea
gbc = new GridBagConstraints(0,0,1,1,0,0,GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(0,5,0,5), 0,0);
pnlButtons.add(_btnReturnToTab, gbc);
- // i18n[resultFrame.stayOnTop=Stay on top]
_chkOnTop = new JCheckBox(s_stringMgr.getString("resultFrame.stayOnTop"));
gbc = new GridBagConstraints(1,0,1,1,0,0,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0,5,0,5), 0,0);
pnlButtons.add(_chkOnTop, gbc);
@@ -293,44 +310,29 @@ private JPanel createRightUpperPanel()
public void updateRightUpperPanelLayout(JPanel panel)
{
- //_panel.invalidate();
- //SwingUtilities.invokeLater( () -> {_panel.revalidate(); _panel.getParent().revalidate(); _panel.getParent().getParent().revalidate();});
- //SwingUtilities.invokeLater( () -> _panel.repaint());
panel.revalidate();
- //panel.getParent().revalidate();
if (null != panel.getParent())
{
panel.getParent().revalidate();
}
-
- //_panel.setBorder(BorderFactory.createLineBorder(Color.RED));
}
private JPanel createRightButtonsPanel()
{
JPanel ret = new JPanel(new GridLayout(1,4));
-
- ImageIcon iconReRun = Main.getApplication().getResources().getIcon(SquirrelResources.IImageNames.RERUN);
- _btnReRun = new TabButton(iconReRun);
- _btnReRun.setToolTipText(s_stringMgr.getString("ResultFrame.rerun"));
- //gbc = new GridBagConstraints(3,0,1,1,0,0,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0,0,0,0), 0,0);
- ret.add(_btnReRun);
-
+ ret.add(_reRunChooserCtrl.getComponent());
_markDuplicatesChooserController = new MarkDuplicatesChooserController(_resultTab);
_markDuplicatesChooserController.copyStateFrom(_resultTab.getMarkDuplicatesChooserController());
- //gbc = new GridBagConstraints(4,0,1,1,0,0,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0,0,0,0), 0,0);
ret.add(_markDuplicatesChooserController.getComponent());
ImageIcon iconFindColumn = Main.getApplication().getResources().getIcon(SquirrelResources.IImageNames.FIND_COLUMN);
_btnFindColumn = new TabButton(iconFindColumn);
- //gbc = new GridBagConstraints(5,0,1,1,0,0,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0,0,0,0), 0,0);
ret.add(_btnFindColumn);
ImageIcon iconFind = Main.getApplication().getResources().getIcon(SquirrelResources.IImageNames.FIND);
_btnToggleFind = new TabButton(iconFind);
- //gbc = new GridBagConstraints(6,0,1,1,0,0,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0,0,0,5), 0,0);
ret.add(_btnToggleFind);
return ret;
@@ -371,6 +373,7 @@ public void returnToTabbedPane()
{
s_log.debug("ResultFrame.returnToTabbedPane()");
getContentPane().remove(_resultTab.getTabbedPaneOfResultTabs());
+ _resultTab.replaceResultTabListener(_originalResultTabListener);
_resultTab.returnToTabbedPane();
_resultTab = null;
dispose();
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/ResultTab.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/ResultTab.java
index 1ab21186aa..9cccf86371 100755
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/ResultTab.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/ResultTab.java
@@ -23,6 +23,21 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+import java.awt.BorderLayout;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Insets;
+import java.awt.Window;
+import java.awt.event.ActionEvent;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.ArrayList;
+import java.util.List;
+import javax.swing.JComponent;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JTabbedPane;
+import javax.swing.SwingUtilities;
import net.sourceforge.squirrel_sql.client.Main;
import net.sourceforge.squirrel_sql.client.gui.builders.UIFactory;
import net.sourceforge.squirrel_sql.client.session.DataModelImplementationDetails;
@@ -35,7 +50,7 @@
import net.sourceforge.squirrel_sql.client.session.mainpanel.resulttabactions.CreateResultTabFrameAction;
import net.sourceforge.squirrel_sql.client.session.mainpanel.resulttabactions.FindInResultAction;
import net.sourceforge.squirrel_sql.client.session.mainpanel.resulttabactions.FindResultColumnAction;
-import net.sourceforge.squirrel_sql.client.session.mainpanel.resulttabactions.RerunCurrentSQLResultTabAction;
+import net.sourceforge.squirrel_sql.client.session.mainpanel.resulttabactions.ReRunChooserCtrl;
import net.sourceforge.squirrel_sql.client.session.mainpanel.rowcolandsum.RowColAndSumController;
import net.sourceforge.squirrel_sql.client.session.properties.SessionProperties;
import net.sourceforge.squirrel_sql.fw.datasetviewer.BaseDataSetViewerDestination;
@@ -65,22 +80,6 @@
import net.sourceforge.squirrel_sql.fw.util.log.ILogger;
import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
-import javax.swing.JComponent;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JTabbedPane;
-import javax.swing.SwingUtilities;
-import java.awt.BorderLayout;
-import java.awt.GridBagConstraints;
-import java.awt.GridBagLayout;
-import java.awt.Insets;
-import java.awt.Window;
-import java.awt.event.ActionEvent;
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import java.util.ArrayList;
-import java.util.List;
-
public class ResultTab extends JPanel implements IHasIdentifier, IResultTab
{
private static final StringManager s_stringMgr = StringManagerFactory.getStringManager(ResultTab.class);
@@ -139,6 +138,9 @@ public class ResultTab extends JPanel implements IHasIdentifier, IResultTab
private List _resultTabCloseListenerList = new ArrayList<>();
+ private ReRunChooserCtrl _reRunChooserCtrl;
+ private RerunWithTimerRepeatsManager _rerunWithTimerRepeatsManager = new RerunWithTimerRepeatsManager();
+
/**
* Ctor.
*
@@ -158,6 +160,7 @@ public ResultTab(ISession session, SQLResultExecuterPanelFacade sqlResultExecute
{
_resultTabListener = resultTabListener;
_session = session;
+ _reRunChooserCtrl = new ReRunChooserCtrl(this);
_queryInfoPanel = new QueryInfoPanel(_session);
_sqlResultExecuterPanelFacade = sqlResultExecuterPanelFacade;
@@ -381,6 +384,12 @@ public void addResultTabCloseListener(ResultTabCloseListener l)
_resultTabCloseListenerList.add(l);
}
+ @Override
+ public void removeResultTabCloseListener(ResultTabCloseListener l)
+ {
+ _resultTabCloseListenerList.remove(l);
+ }
+
public void disposeTab()
{
if (_metaDataDataSetViewerFindHandler != null)
@@ -438,10 +447,22 @@ public JComponent getCompleteResultTab()
*/
public void reRunSQL()
{
- _resultTabListener.rerunSQL(_exInfo.getQueryHolder().getOriginalQuery(), ResultTab.this);
+ reRunSQLIntern();
}
-
- /**
+
+ @Override
+ public void reRunSqlWithTimerRepeats(int repeatSeconds)
+ {
+ _rerunWithTimerRepeatsManager.startTimerRepeats(repeatSeconds, this, _reRunChooserCtrl);
+ }
+
+ void reRunSQLIntern()
+ {
+ _resultTabListener.rerunSQL(_exInfo.getQueryHolder().getOriginalQuery(), this);
+ }
+
+
+ /**
* Session properties have changed so update GUI if required.
*
* @param propertyName Name of property that has changed.
@@ -600,7 +621,7 @@ private JPanel createTopRightButtonsPanel()
ret.add(_readMoreResultsHandler.getLoadingLabel(),gbc);
gbc = new GridBagConstraints(1,0,1,1,0,0,GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH, new Insets(2,10,0,0), 0,0);
- ret.add(new TabButton(getRerunCurrentSQLResultTabAction()), gbc);
+ ret.add(_reRunChooserCtrl.getComponent(), gbc);
_showCellDetailCtrl = new ShowCellDetailCtrl(this);
gbc = new GridBagConstraints(2,0,1,1,0,0,GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH, new Insets(2,2,0,0), 0,0);
@@ -632,16 +653,6 @@ private JPanel createTopRightButtonsPanel()
return ret;
}
- private RerunCurrentSQLResultTabAction getRerunCurrentSQLResultTabAction()
- {
- RerunCurrentSQLResultTabAction rtn = new RerunCurrentSQLResultTabAction(this);
-
- rtn.setSQLPanel( _session.getSQLPanelAPIOfActiveSessionWindow() );
-
- return rtn;
- }
-
-
@Override
public void toggleShowFindPanel()
{
@@ -667,8 +678,6 @@ public GlobalFindRemoteControl getDataSetViewerFindRemoteControlOfSQLQueryResult
return _resultDataSetViewerFindHandler.getDataSetViewerFindRemoteControlOrNull();
}
-
-
@Override
public void findColumn()
{
@@ -722,6 +731,7 @@ public TableState getResultSortableTableState()
return _resultDataSetViewerFindHandler.getDataSetViewer().getResultSortableTableState();
}
+ @Override
public void applyResultSortableTableState(TableState sortableTableState)
{
_resultDataSetViewerFindHandler.getDataSetViewer().applyResultSortableTableState(sortableTableState);
@@ -812,4 +822,40 @@ protected void finalize()
}
}
+
+ /**
+ * Is called before the {@link ResultTabCloseListener] of the previous {@link ResultTab} is fired.
+ */
+ @Override
+ public void aboutToBeReplacedBy(ResultTab newResultTab)
+ {
+ aboutToBeReplacedBy(newResultTab, newResultTab._reRunChooserCtrl);
+ }
+
+ /**
+ * Is called before the {@link ResultTabCloseListener] of the previous {@link ResultTab} is fired.
+ */
+ @Override
+ public void aboutToBeReplacedBy(ResultTab newResultTab, ReRunChooserCtrl reRunChooserCtrl)
+ {
+ newResultTab._rerunWithTimerRepeatsManager = _rerunWithTimerRepeatsManager;
+ _rerunWithTimerRepeatsManager.aboutToBeReplacedBy(newResultTab, reRunChooserCtrl);
+ }
+
+ @Override
+ public void prepareBeingMovedToResultFrame()
+ {
+ _rerunWithTimerRepeatsManager.disposeTimer();
+ }
+
+ /**
+ * @return The previous {@link ResultTabListener}
+ */
+ @Override
+ public ResultTabListener replaceResultTabListener(ResultTabListener resultTabListener)
+ {
+ ResultTabListener previous = _resultTabListener;
+ _resultTabListener = resultTabListener;
+ return previous;
+ }
}
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/ResultTabFactory.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/ResultTabFactory.java
index 95b1ef62fc..a8bf1861f5 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/ResultTabFactory.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/ResultTabFactory.java
@@ -1,5 +1,6 @@
package net.sourceforge.squirrel_sql.client.session.mainpanel;
+import java.util.ArrayList;
import net.sourceforge.squirrel_sql.client.session.ISession;
import net.sourceforge.squirrel_sql.client.session.SQLExecutionInfo;
import net.sourceforge.squirrel_sql.fw.datasetviewer.DataSetException;
@@ -8,8 +9,6 @@
import net.sourceforge.squirrel_sql.fw.datasetviewer.ResultSetMetaDataDataSet;
import net.sourceforge.squirrel_sql.fw.id.IntegerIdentifierFactory;
-import java.util.ArrayList;
-
public class ResultTabFactory
{
private IntegerIdentifierFactory _idFactory = new IntegerIdentifierFactory();
@@ -24,8 +23,7 @@ public ResultTabFactory(ISession session, SQLResultExecuterPanelFacade sqlResult
public ResultTab createResultTab(SQLExecutionInfo exInfo, IDataSetUpdateableTableModel dataSetUpdateableTableModel, ResultSetDataSet rsds, ResultSetMetaDataDataSet mdds) throws DataSetException
{
- final ResultTabListener resultTabListener = (sql, resultTab) -> _sqlResultExecuterPanelFacade.rerunSQL(sql, resultTab);
-
+ final ResultTabListener resultTabListener = (sql, resultTabToReplace) -> _sqlResultExecuterPanelFacade.rerunSQL(sql, resultTabToReplace);
ResultTab tab = new ResultTab(_session, _sqlResultExecuterPanelFacade, _idFactory.createIdentifier(), exInfo, dataSetUpdateableTableModel, resultTabListener);
tab.showResults(rsds, mdds);
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/ResultTabListener.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/ResultTabListener.java
index f32d5f05e1..330bb08c2e 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/ResultTabListener.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/ResultTabListener.java
@@ -2,5 +2,5 @@
public interface ResultTabListener
{
- void rerunSQL(String sql, IResultTab resultTab);
+ void rerunSQL(String sql, IResultTab resultTabToReplace);
}
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/SQLExecutionHandler.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/SQLExecutionHandler.java
index 30acdc86c0..fb4ac0c1cf 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/SQLExecutionHandler.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/SQLExecutionHandler.java
@@ -1,5 +1,10 @@
package net.sourceforge.squirrel_sql.client.session.mainpanel;
+import java.sql.SQLWarning;
+import java.text.NumberFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+
import net.sourceforge.squirrel_sql.client.preferences.SquirrelPreferences;
import net.sourceforge.squirrel_sql.client.session.ISQLExecuterHandler;
import net.sourceforge.squirrel_sql.client.session.ISession;
@@ -25,11 +30,6 @@
import net.sourceforge.squirrel_sql.fw.util.log.ILogger;
import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
-import java.sql.SQLWarning;
-import java.text.NumberFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-
/**
* This class is the handler for the execution of sql against the SQLExecuterPanel
*/
@@ -396,7 +396,7 @@ public void sqlResultSetAvailable(ResultSetWrapper rs, SQLExecutionInfo info, ID
// rsds.setContentsTabResultSet() reads the result set. So results processing on the DB is over
// and this time is measured. None is interested in the time that it takes us to render Swing tables ...
- info.resultsProcessingComplete(_rsds.setSqlExecutionTabResultSet(rs, null, dialectType));
+ info.resultsProcessingComplete(_rsds.readDataFromJdbcResultSetForSqlExecution(rs, null, dialectType));
_executionHandlerListener.addResultsTab(info, _rsds, rsmdds, model, _resultTabToReplace);
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/SQLPanel.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/SQLPanel.java
index 771847dc6c..3b51f1ec55 100755
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/SQLPanel.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/SQLPanel.java
@@ -23,6 +23,28 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.GridLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import javax.swing.Action;
+import javax.swing.Box;
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JMenu;
+import javax.swing.JMenuItem;
+import javax.swing.JPanel;
+import javax.swing.JSplitPane;
+import javax.swing.JTabbedPane;
+import javax.swing.SwingUtilities;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
import net.sourceforge.squirrel_sql.client.IApplication;
import net.sourceforge.squirrel_sql.client.Main;
import net.sourceforge.squirrel_sql.client.gui.builders.UIFactory;
@@ -49,29 +71,6 @@
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 javax.swing.Action;
-import javax.swing.Box;
-import javax.swing.ImageIcon;
-import javax.swing.JButton;
-import javax.swing.JMenu;
-import javax.swing.JMenuItem;
-import javax.swing.JPanel;
-import javax.swing.JSplitPane;
-import javax.swing.JTabbedPane;
-import javax.swing.SwingUtilities;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-import java.awt.BorderLayout;
-import java.awt.Dimension;
-import java.awt.GridLayout;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
/**
* This is the panel where SQL scripts can be entered and executed.
*
@@ -397,6 +396,8 @@ public void sessionWorksheetOrTabClosing()
_resultTabMatchingCurrentSqlHandler.close();
_sqlPanelListenerManager.fireSQLPanelParentClosing();
+
+ _panelAPI.closeAllSQLResultTabs();
}
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/SQLResultExecuterPanelFacade.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/SQLResultExecuterPanelFacade.java
index d239eb1b62..759b19c03c 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/SQLResultExecuterPanelFacade.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/SQLResultExecuterPanelFacade.java
@@ -8,7 +8,7 @@ public interface SQLResultExecuterPanelFacade
void createSQLResultFrame(IResultTab resultTab);
- void rerunSQL(String sql, IResultTab resultTab);
+ void rerunSQL(String sql, IResultTab resultTabToReplace);
void removeErrorPanel(ErrorPanel errorPanel);
}
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/SQLResultExecutorPanel.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/SQLResultExecutorPanel.java
index ddc1bfe2e6..bafa4db851 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/SQLResultExecutorPanel.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/SQLResultExecutorPanel.java
@@ -18,6 +18,22 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+import javax.swing.Action;
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+import javax.swing.JComponent;
+import javax.swing.JMenuItem;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
+import javax.swing.JTabbedPane;
+import javax.swing.KeyStroke;
+import javax.swing.SwingUtilities;
import net.sourceforge.squirrel_sql.client.Main;
import net.sourceforge.squirrel_sql.client.gui.builders.UIFactory;
import net.sourceforge.squirrel_sql.client.session.ISQLEntryPanel;
@@ -35,6 +51,7 @@
import net.sourceforge.squirrel_sql.client.session.mainpanel.resulttabheader.ResultTabAdder;
import net.sourceforge.squirrel_sql.client.session.mainpanel.resulttabheader.ResultTabComponent;
import net.sourceforge.squirrel_sql.client.session.properties.SessionProperties;
+import net.sourceforge.squirrel_sql.client.shortcut.ShortCutDescriptionReader;
import net.sourceforge.squirrel_sql.fw.datasetviewer.IDataSetUpdateableTableModel;
import net.sourceforge.squirrel_sql.fw.datasetviewer.ResultSetDataSet;
import net.sourceforge.squirrel_sql.fw.datasetviewer.ResultSetMetaDataDataSet;
@@ -49,23 +66,6 @@
import net.sourceforge.squirrel_sql.fw.util.log.ILogger;
import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
-import javax.swing.Action;
-import javax.swing.Icon;
-import javax.swing.ImageIcon;
-import javax.swing.JComponent;
-import javax.swing.JMenuItem;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JPopupMenu;
-import javax.swing.JTabbedPane;
-import javax.swing.KeyStroke;
-import javax.swing.SwingUtilities;
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.stream.Collectors;
-
/**
* This is the panel where SQL scripts are executed and results presented.
*
@@ -144,9 +144,9 @@ public void createSQLResultFrame(IResultTab resultTab)
}
@Override
- public void rerunSQL(String sql, IResultTab resultTab)
+ public void rerunSQL(String sql, IResultTab resultTabToReplace)
{
- SQLResultExecutorPanel.this.rerunSQL(sql, resultTab);
+ SQLResultExecutorPanel.this.rerunSQL(sql, resultTabToReplace);
}
@Override
@@ -783,16 +783,11 @@ else if (null != resultTabToReplace)
}
else
{
+ // We need to make sure this is fired before the ResultTabCloseListener of resultTabToReplace is fired.
+ resultTabToReplace.aboutToBeReplacedBy(tab);
_resultTabClosing.closeTabAt(indexToReplace);
_tabAdder.insert(getTabHeaderTitle(tab), tabIcon, tab, tab.getViewableSqlString(), indexToReplace);
-
- //final JLabel tabComponent = new JLabel(getTabHeaderTitle(tab));
- //_tabbedExecutionsPanel.setTabComponentAt(_tabbedExecutionsPanel.indexOfComponent(tab), tabComponent);
- //if(null != tabIcon)
- //{
- // _tabAdder.setIconAt(indexToReplace, tabIcon);
- //}
}
}
@@ -939,7 +934,7 @@ private void initAccelerator(Class extends Action> actionClass, JMenuItem mnuI
Action action = _session.getApplication().getActionCollection().get(actionClass);
String accel = (String) action.getValue(Resources.ACCELERATOR_STRING);
- Main.getApplication().getShortcutManager().setAccelerator(mnuItem, KeyStroke.getKeyStroke(accel), action);
+ Main.getApplication().getShortcutManager().setAccelerator(mnuItem, KeyStroke.getKeyStroke(accel), action, ShortCutDescriptionReader.of(action, mnuItem));
}
public JTabbedPane getTabbedPane()
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/TabButton.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/TabButton.java
index 39660aa1ca..d6a3d72ee7 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/TabButton.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/TabButton.java
@@ -1,18 +1,19 @@
package net.sourceforge.squirrel_sql.client.session.mainpanel;
+import javax.swing.Action;
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
import net.sourceforge.squirrel_sql.fw.gui.GUIUtils;
-import javax.swing.*;
-
public class TabButton extends JButton
{
- TabButton(Action action)
+ public TabButton(Action action)
{
super(action);
GUIUtils.styleAsTabButton(this);
}
- TabButton()
+ public TabButton()
{
this((Action) null);
}
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/TimerHolder.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/TimerHolder.java
index 152661db4b..d94135c0d9 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/TimerHolder.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/TimerHolder.java
@@ -1,12 +1,11 @@
package net.sourceforge.squirrel_sql.client.session.mainpanel;
+import javax.swing.JCheckBox;
+import javax.swing.JTextField;
+import javax.swing.Timer;
import net.sourceforge.squirrel_sql.client.session.mainpanel.notificationsound.FinishedNotificationSoundHandler;
import net.sourceforge.squirrel_sql.fw.datasetviewer.ResultSetDataSet;
-import javax.swing.*;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-
/**
* This timer treatment seems to give better Session GCing behaviour.
@@ -32,14 +31,7 @@ public TimerHolder(JTextField txtExecTimeCounter, JTextField txtNumberOfRowsRead
_txtExecTimeCounter = txtExecTimeCounter;
_txtNumberOfRowsRead = txtNumberOfRowsRead;
- _timer = new Timer(300, new ActionListener()
- {
- @Override
- public void actionPerformed(ActionEvent e)
- {
- onUpdateExecutionTime();
- }
- });
+ _timer = new Timer(300, e -> onUpdateExecutionTime());
_timer.setRepeats(true);
_timer.start();
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/objecttree/tabs/BasePreparedStatementTab.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/objecttree/tabs/BasePreparedStatementTab.java
index 2109744be5..468c569c3a 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/objecttree/tabs/BasePreparedStatementTab.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/objecttree/tabs/BasePreparedStatementTab.java
@@ -19,6 +19,13 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+import java.awt.Component;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.HashMap;
+import java.util.Map;
+
import net.sourceforge.squirrel_sql.client.session.DataModelImplementationDetails;
import net.sourceforge.squirrel_sql.client.session.ISession;
import net.sourceforge.squirrel_sql.client.session.properties.SessionProperties;
@@ -32,13 +39,6 @@
import net.sourceforge.squirrel_sql.fw.util.log.ILogger;
import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
-import java.awt.Component;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.HashMap;
-import java.util.Map;
-
public abstract class BasePreparedStatementTab extends BaseObjectTab
{
/** Title to display for tab. */
@@ -168,7 +168,7 @@ protected void refreshComponent() throws DataSetException
protected IDataSet createDataSetFromResultSet(ResultSet rs) throws DataSetException
{
final ResultSetDataSet rsds = new ResultSetDataSet();
- rsds.setResultSet(rs, getDialectType());
+ rsds.readDataFromJdbcResultSetForGeneralPurpose(rs, getDialectType());
if (!_firstRowOnly)
{
return rsds;
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/objecttree/tabs/table/ContentsTab.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/objecttree/tabs/table/ContentsTab.java
index d690a46603..429a27f5c0 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/objecttree/tabs/table/ContentsTab.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/objecttree/tabs/table/ContentsTab.java
@@ -24,6 +24,7 @@
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.JTable;
+
import net.sourceforge.squirrel_sql.client.Main;
import net.sourceforge.squirrel_sql.client.gui.session.SessionPanel;
import net.sourceforge.squirrel_sql.client.session.DataSetUpdateableTableModelImpl;
@@ -287,7 +288,7 @@ protected IDataSet createDataSet() throws DataSetException
// distinguish this table from other tables in the DB.
// We also include the URL used to connect to the DB so that
// the same table/DB on different machines is treated differently.
- rsds.setContentsTabResultSet(rs, _dataSetUpdateableTableModel.getFullTableName(), DialectFactory.getDialectType(md));
+ rsds.readDataFromJdbcResultSetForObjectTreeContentTabs(rs, _dataSetUpdateableTableModel.getFullTableName(), DialectFactory.getDialectType(md));
SQLUtilities.closeResultSet(rs);
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/objecttree/tabs/table/RowCountTab.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/objecttree/tabs/table/RowCountTab.java
index de1330a5ff..a9fc8e38ce 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/objecttree/tabs/table/RowCountTab.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/objecttree/tabs/table/RowCountTab.java
@@ -77,7 +77,7 @@ protected IDataSet createDataSet() throws DataSetException
try
{
final ResultSetDataSet rsds = new ResultSetDataSet();
- rsds.setResultSet(rs, getDialectType());
+ rsds.readDataFromJdbcResultSetForGeneralPurpose(rs, getDialectType());
return rsds;
}
finally
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/resulttabactions/CreateResultTabFrameAction.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/resulttabactions/CreateResultTabFrameAction.java
index 02a7a14714..08529d19d1 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/resulttabactions/CreateResultTabFrameAction.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/resulttabactions/CreateResultTabFrameAction.java
@@ -1,13 +1,12 @@
package net.sourceforge.squirrel_sql.client.session.mainpanel.resulttabactions;
+import java.awt.event.ActionEvent;
import net.sourceforge.squirrel_sql.client.Main;
import net.sourceforge.squirrel_sql.client.action.SquirrelAction;
import net.sourceforge.squirrel_sql.client.session.ISQLPanelAPI;
import net.sourceforge.squirrel_sql.client.session.action.ISQLPanelAction;
import net.sourceforge.squirrel_sql.client.session.mainpanel.ResultTab;
-import java.awt.event.ActionEvent;
-
public class CreateResultTabFrameAction extends SquirrelAction implements ISQLPanelAction
{
private ResultTabProvider _resultTabProvider;
@@ -36,6 +35,7 @@ public void actionPerformed(ActionEvent evt)
{
if(_resultTabProvider.hasResultTab())
{
+ _resultTabProvider.getResultTab().prepareBeingMovedToResultFrame();
_resultTabProvider.getResultTab().getSQLResultExecuterPanelFacade().createSQLResultFrame(_resultTabProvider.getResultTab());
}
}
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/resulttabactions/I18NStrings.properties b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/resulttabactions/I18NStrings.properties
new file mode 100644
index 0000000000..0c87740bc5
--- /dev/null
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/resulttabactions/I18NStrings.properties
@@ -0,0 +1,9 @@
+
+ReRunChooserCtrl.rerun.timered=Rerun the current tab''s SQL Query with timer ({0})
+
+ReRunChooserCtrl.rerun.timered.stop=Stop rerunning the current tab''s SQL Query
+
+RerunWithTimerRepeatsDlg.title=Rerun interval
+RerunWithTimerRepeatsDlg.enter.repeat.interval.in.seconds=Enter rerun interval in seconds (0 means don't repeat)
+RerunWithTimerRepeatsDlg.ok=Ok
+RerunWithTimerRepeatsDlg.cancel=Cancel
\ No newline at end of file
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/resulttabactions/MarkDuplicatesToggleAction.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/resulttabactions/MarkDuplicatesToggleAction.java
index cf2efbfba3..ec13fea5f5 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/resulttabactions/MarkDuplicatesToggleAction.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/resulttabactions/MarkDuplicatesToggleAction.java
@@ -1,13 +1,12 @@
package net.sourceforge.squirrel_sql.client.session.mainpanel.resulttabactions;
+import java.awt.event.ActionEvent;
import net.sourceforge.squirrel_sql.client.Main;
import net.sourceforge.squirrel_sql.client.action.SquirrelAction;
import net.sourceforge.squirrel_sql.client.session.ISQLPanelAPI;
import net.sourceforge.squirrel_sql.client.session.action.ISQLPanelAction;
import net.sourceforge.squirrel_sql.client.session.mainpanel.IResultTab;
-import java.awt.event.ActionEvent;
-
public class MarkDuplicatesToggleAction extends SquirrelAction implements ISQLPanelAction
{
private ResultTabProvider _resultTabProvider;
@@ -31,6 +30,18 @@ public MarkDuplicatesToggleAction()
public void setSQLPanel(ISQLPanelAPI panel)
{
_resultTabProvider.setSQLPanelAPI(panel);
+ doEnable();
+ }
+
+ public void setResultTab(IResultTab resultTab)
+ {
+ _resultTabProvider.setResultTab(resultTab);
+ doEnable();
+ }
+
+ private void doEnable()
+ {
+ setEnabled(_resultTabProvider.hasResultTab());
}
public void actionPerformed(ActionEvent evt)
@@ -39,6 +50,5 @@ public void actionPerformed(ActionEvent evt)
{
_resultTabProvider.getResultTab().markDuplicates(evt);
}
-
}
}
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/resulttabactions/ReRunChooserCtrl.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/resulttabactions/ReRunChooserCtrl.java
new file mode 100644
index 0000000000..7d2318934a
--- /dev/null
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/resulttabactions/ReRunChooserCtrl.java
@@ -0,0 +1,106 @@
+package net.sourceforge.squirrel_sql.client.session.mainpanel.resulttabactions;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.List;
+import java.util.stream.Stream;
+import javax.swing.Action;
+import javax.swing.JComponent;
+import net.sourceforge.squirrel_sql.client.Main;
+import net.sourceforge.squirrel_sql.client.resources.SquirrelResources;
+import net.sourceforge.squirrel_sql.client.session.mainpanel.IResultTab;
+import net.sourceforge.squirrel_sql.client.session.mainpanel.ResultTab;
+import net.sourceforge.squirrel_sql.client.session.mainpanel.TabButton;
+import net.sourceforge.squirrel_sql.client.shortcut.ShortcutUtil;
+import net.sourceforge.squirrel_sql.fw.gui.buttonchooser.ButtonChooser;
+import net.sourceforge.squirrel_sql.fw.util.StringManager;
+import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
+
+public class ReRunChooserCtrl
+{
+ private static final StringManager s_stringMgr = StringManagerFactory.getStringManager(ReRunChooserCtrl.class);
+
+ private final RerunCurrentSQLResultTabAction _actionDefault;
+ private final RerunCurrentSQLResultTabAction _actionTimerRepeats;
+ private final TabButton _btnReRunDefault;
+ private final TabButton _btnReRunTimerRepeats;
+ private final TabButton _btnReRunTimerRepeatsStop;
+ private ButtonChooser _btnChooser;
+
+
+ public ReRunChooserCtrl(IResultTab resultTab)
+ {
+ _btnChooser = new ButtonChooser();
+ _actionDefault = createDefaultReRunAction(resultTab);
+ _actionTimerRepeats = createTimerRepeatsReRunAction(resultTab);
+
+ _btnReRunDefault = new TabButton(_actionDefault);
+ _btnReRunTimerRepeats = new TabButton(_actionTimerRepeats);
+ _btnReRunTimerRepeatsStop = new TabButton(Main.getApplication().getResources().getIcon(SquirrelResources.IImageNames.RUN_TIMER_STOP));
+
+ _btnChooser.addButton(_btnReRunDefault);
+ _btnChooser.addButton(_btnReRunTimerRepeats);
+
+ if(RerunResultTabMode.getCurrentMode() == RerunResultTabMode.DEFAULT)
+ {
+ _btnChooser.setSelectedButton(_btnReRunDefault);
+ }
+ else
+ {
+ _btnChooser.setSelectedButton(_btnReRunTimerRepeats);
+ }
+
+ _btnChooser.setButtonSelectedListener(
+ (btnNew, btnOld) -> RerunResultTabMode.setCurrentMode(btnNew == _btnReRunDefault ? RerunResultTabMode.DEFAULT : RerunResultTabMode.TIMER_REPEATS));
+ }
+
+ private static RerunCurrentSQLResultTabAction createTimerRepeatsReRunAction(IResultTab resultTab)
+ {
+ RerunCurrentSQLResultTabAction ret = createDefaultReRunAction(resultTab);
+
+ ret.putValue(Action.SMALL_ICON, Main.getApplication().getResources().getIcon(SquirrelResources.IImageNames.RUN_TIMER));
+ String description = s_stringMgr.getString("ReRunChooserCtrl.rerun.timered", ShortcutUtil.getKeystrokeString(ret.getKeyStroke()));
+ ret.putValue(Action.SHORT_DESCRIPTION, description);
+ ret.putValue(Action.LONG_DESCRIPTION, description);
+
+ return ret;
+ }
+
+ private static RerunCurrentSQLResultTabAction createDefaultReRunAction(IResultTab resultTab)
+ {
+ RerunCurrentSQLResultTabAction ret = new RerunCurrentSQLResultTabAction();
+ ret.setResultTab((ResultTab) resultTab);
+ return ret;
+ }
+
+ public JComponent getComponent()
+ {
+ return _btnChooser.getComponent();
+ }
+
+ public void setResultTab(ResultTab resultTab)
+ {
+ _actionDefault.setResultTab(resultTab);
+ _actionTimerRepeats.setResultTab(resultTab);
+ }
+
+ public void switchToStopButton(ActionListener stopListener)
+ {
+ cleanUp();
+ _btnReRunTimerRepeatsStop.addActionListener(e -> onStopRepeats(stopListener, e));
+ _btnReRunTimerRepeatsStop.setToolTipText(s_stringMgr.getString("ReRunChooserCtrl.rerun.timered.stop"));
+ _btnChooser.replaceButtonsBy(List.of(_btnReRunTimerRepeatsStop));
+ }
+
+ private void onStopRepeats(ActionListener stopListener, ActionEvent e)
+ {
+ stopListener.actionPerformed(e);
+ cleanUp();
+ _btnChooser.replaceButtonsBy(List.of(_btnReRunDefault, _btnReRunTimerRepeats));
+ }
+
+ public void cleanUp()
+ {
+ Stream.of(_btnReRunTimerRepeatsStop.getActionListeners()).forEach(al -> _btnReRunTimerRepeatsStop.removeActionListener(al));
+ }
+}
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/resulttabactions/RerunCurrentSQLResultTabAction.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/resulttabactions/RerunCurrentSQLResultTabAction.java
index 0869ebacd8..01c09ff108 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/resulttabactions/RerunCurrentSQLResultTabAction.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/resulttabactions/RerunCurrentSQLResultTabAction.java
@@ -1,18 +1,19 @@
package net.sourceforge.squirrel_sql.client.session.mainpanel.resulttabactions;
+import java.awt.Frame;
+import java.awt.event.ActionEvent;
import net.sourceforge.squirrel_sql.client.Main;
import net.sourceforge.squirrel_sql.client.action.SquirrelAction;
import net.sourceforge.squirrel_sql.client.session.ISQLPanelAPI;
import net.sourceforge.squirrel_sql.client.session.action.ISQLPanelAction;
+import net.sourceforge.squirrel_sql.client.session.mainpanel.IResultTab;
import net.sourceforge.squirrel_sql.client.session.mainpanel.ResultTab;
-import java.awt.event.ActionEvent;
-
public class RerunCurrentSQLResultTabAction extends SquirrelAction implements ISQLPanelAction
{
private ResultTabProvider _resultTabProvider;
- public RerunCurrentSQLResultTabAction(ResultTab resultTab)
+ public RerunCurrentSQLResultTabAction(ResultTab resultTab)
{
super(Main.getApplication());
_resultTabProvider = new ResultTabProvider(resultTab);
@@ -25,15 +26,72 @@ public RerunCurrentSQLResultTabAction()
public void setSQLPanel(ISQLPanelAPI panel)
{
- setEnabled(_resultTabProvider.setSQLPanelAPI(panel));
+ _resultTabProvider.setSQLPanelAPI(panel);
+ doEnable();
}
- public synchronized void actionPerformed(ActionEvent evt)
+ private void doEnable()
{
- if (_resultTabProvider.hasResultTab())
+ setEnabled(_resultTabProvider.hasResultTab());
+ }
+
+ public void actionPerformed(ActionEvent evt)
+ {
+ if (false == _resultTabProvider.hasResultTab())
+ {
+ return;
+ }
+
+ switch(RerunResultTabMode.getCurrentMode())
{
- _resultTabProvider.getResultTab().reRunSQL();
+ case DEFAULT -> _resultTabProvider.getResultTab().reRunSQL();
+ case TIMER_REPEATS -> rerunWithTimerRepeats();
}
}
+
+ private void rerunWithTimerRepeats()
+ {
+ IResultTab resultTab = _resultTabProvider.getResultTab();
+ if(null == resultTab)
+ {
+ return;
+ }
+
+ Frame parentWindow;
+
+ ISQLPanelAPI sqlPanelApi = _resultTabProvider.getSqlPanelApiOrNull();
+ if(null == sqlPanelApi)
+ {
+ parentWindow = Main.getApplication().getMainFrame();
+ }
+ else
+ {
+ parentWindow = sqlPanelApi.getOwningFrame();
+ }
+
+ RerunWithTimerRepeatsCtrl rerunWithTimerRepeatsCtrl = new RerunWithTimerRepeatsCtrl(parentWindow);
+
+ if(false == rerunWithTimerRepeatsCtrl.isOk())
+ {
+ return;
+ }
+
+ int repeatSeconds = rerunWithTimerRepeatsCtrl.getRepeatSeconds();
+
+ if(0 == repeatSeconds)
+ {
+ resultTab.reRunSQL();
+ }
+ else
+ {
+ resultTab.reRunSqlWithTimerRepeats(repeatSeconds);
+ }
+ }
+
+ public void setResultTab(ResultTab resultTab)
+ {
+ _resultTabProvider.setResultTab(resultTab);
+ doEnable();
+ }
}
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/resulttabactions/RerunResultTabMode.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/resulttabactions/RerunResultTabMode.java
new file mode 100644
index 0000000000..0bf2c6f9eb
--- /dev/null
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/resulttabactions/RerunResultTabMode.java
@@ -0,0 +1,21 @@
+package net.sourceforge.squirrel_sql.client.session.mainpanel.resulttabactions;
+
+import net.sourceforge.squirrel_sql.fw.props.Props;
+
+public enum RerunResultTabMode
+{
+ DEFAULT,
+ TIMER_REPEATS;
+
+ private static final String PREF_RERUN_RESULT_TAB_MODE = "RerunResultTabMode.rerun.result.tab.mode";
+
+ static RerunResultTabMode getCurrentMode()
+ {
+ return RerunResultTabMode.valueOf(Props.getString(PREF_RERUN_RESULT_TAB_MODE, RerunResultTabMode.DEFAULT.name()));
+ }
+
+ static void setCurrentMode(RerunResultTabMode mode)
+ {
+ Props.putString(PREF_RERUN_RESULT_TAB_MODE, mode.name());
+ }
+}
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/resulttabactions/RerunWithTimerRepeatsCtrl.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/resulttabactions/RerunWithTimerRepeatsCtrl.java
new file mode 100644
index 0000000000..17d5ff8e82
--- /dev/null
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/resulttabactions/RerunWithTimerRepeatsCtrl.java
@@ -0,0 +1,52 @@
+package net.sourceforge.squirrel_sql.client.session.mainpanel.resulttabactions;
+
+import java.awt.Frame;
+import net.sourceforge.squirrel_sql.fw.gui.GUIUtils;
+import net.sourceforge.squirrel_sql.fw.props.Props;
+
+public class RerunWithTimerRepeatsCtrl
+{
+ private static final String PREFS_KEY_REPEAT_INTERVAL = "RerunWithTimerRepeatsCtrl.repeat.interval";
+
+ private final RerunWithTimerRepeatsDlg _dlg;
+ private boolean _ok;
+
+ public RerunWithTimerRepeatsCtrl(Frame parentWindow)
+ {
+ _dlg = new RerunWithTimerRepeatsDlg(parentWindow);
+
+ _dlg.txtSeconds.setInt(Props.getInt(PREFS_KEY_REPEAT_INTERVAL, 5));
+
+ _dlg.btnOK.addActionListener(e -> onOk());
+ _dlg.btnCancel.addActionListener(e -> close());
+
+ GUIUtils.initLocation(_dlg, 400, 130);
+ GUIUtils.enableCloseByEscape(_dlg);
+
+ GUIUtils.forceFocus(_dlg.txtSeconds);
+ _dlg.setVisible(true);
+ }
+
+ private void onOk()
+ {
+ _ok = true;
+ close();
+ }
+
+ private void close()
+ {
+ Props.putInt(PREFS_KEY_REPEAT_INTERVAL, _dlg.txtSeconds.getInt());
+ _dlg.setVisible(true);
+ _dlg.dispose();
+ }
+
+ public boolean isOk()
+ {
+ return _ok;
+ }
+
+ public int getRepeatSeconds()
+ {
+ return _dlg.txtSeconds.getInt();
+ }
+}
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/resulttabactions/RerunWithTimerRepeatsDlg.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/resulttabactions/RerunWithTimerRepeatsDlg.java
new file mode 100644
index 0000000000..a0ca24e9b6
--- /dev/null
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/resulttabactions/RerunWithTimerRepeatsDlg.java
@@ -0,0 +1,65 @@
+package net.sourceforge.squirrel_sql.client.session.mainpanel.resulttabactions;
+
+import java.awt.Frame;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Insets;
+import javax.swing.JButton;
+import javax.swing.JDialog;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import net.sourceforge.squirrel_sql.fw.gui.GUIUtils;
+import net.sourceforge.squirrel_sql.fw.gui.IntegerField;
+import net.sourceforge.squirrel_sql.fw.util.StringManager;
+import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
+
+public class RerunWithTimerRepeatsDlg extends JDialog
+{
+ private static final StringManager s_stringMgr = StringManagerFactory.getStringManager(RerunWithTimerRepeatsDlg.class);
+
+ IntegerField txtSeconds;
+ JButton btnOK;
+ JButton btnCancel;
+
+ public RerunWithTimerRepeatsDlg(Frame parentWindow)
+ {
+ super(parentWindow, s_stringMgr.getString("RerunWithTimerRepeatsDlg.title"), true);
+ getContentPane().setLayout(new GridBagLayout());
+
+ GridBagConstraints gbc;
+
+ gbc = new GridBagConstraints(0,0,1,1,0,0,GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(5,5,0,5), 0,0);
+ getContentPane().add(new JLabel(s_stringMgr.getString("RerunWithTimerRepeatsDlg.enter.repeat.interval.in.seconds")), gbc);
+
+ gbc = new GridBagConstraints(1,0,1,1,0,0,GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(5,5,0,5), 0,0);
+ txtSeconds = new IntegerField(5, 0);
+ GUIUtils.setPreferredWidth(txtSeconds, 100);
+ GUIUtils.setMinimumWidth(txtSeconds, 100);
+ getContentPane().add(txtSeconds, gbc);
+
+ gbc = new GridBagConstraints(0,2,2,1,0,0,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(10,5,0,5), 0,0);
+ getContentPane().add(createButtonPanel(), gbc);
+
+ gbc = new GridBagConstraints(0,3,2,1,1,1,GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH, new Insets(0,0,0,0), 0,0);
+ getContentPane().add(new JPanel(), gbc);
+
+ getRootPane().setDefaultButton(btnOK);
+ }
+
+ private JPanel createButtonPanel()
+ {
+ JPanel ret = new JPanel(new GridBagLayout());
+
+ GridBagConstraints gbc;
+
+ gbc = new GridBagConstraints(0,0,1,1,0,0,GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(0,0,0,0), 0,0);
+ btnOK = new JButton(s_stringMgr.getString("RerunWithTimerRepeatsDlg.ok"));
+ ret.add(btnOK, gbc);
+
+ gbc = new GridBagConstraints(1,0,1,1,0,0,GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(0,5,0,0), 0,0);
+ btnCancel = new JButton(s_stringMgr.getString("RerunWithTimerRepeatsDlg.cancel"));
+ ret.add(btnCancel, gbc);
+
+ return ret;
+ }
+}
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/resulttabactions/ResultTabProvider.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/resulttabactions/ResultTabProvider.java
index 25068ecb3a..68f79e5d27 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/resulttabactions/ResultTabProvider.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/resulttabactions/ResultTabProvider.java
@@ -3,20 +3,18 @@
import net.sourceforge.squirrel_sql.client.session.ISQLPanelAPI;
import net.sourceforge.squirrel_sql.client.session.mainpanel.IResultTab;
import net.sourceforge.squirrel_sql.client.session.mainpanel.ISQLResultExecutor;
+import net.sourceforge.squirrel_sql.client.session.mainpanel.ResultTabCloseListener;
public class ResultTabProvider
{
+ private final ResultTabCloseListener _resultTabCloseListener = () -> _resultTab = null;
+
private ISQLPanelAPI _panel;
private IResultTab _resultTab;
public ResultTabProvider(IResultTab resultTab)
{
- _resultTab = resultTab;
-
- if(null != _resultTab)
- {
- _resultTab.addResultTabCloseListener(() -> _resultTab = null);
- }
+ setResultTab(resultTab);
}
public boolean setSQLPanelAPI(ISQLPanelAPI panel)
@@ -57,4 +55,20 @@ public ISQLPanelAPI getSqlPanelApiOrNull()
{
return _panel;
}
+
+ public void setResultTab(IResultTab resultTab)
+ {
+ if(null != _resultTab)
+ {
+ _resultTab.removeResultTabCloseListener(_resultTabCloseListener);
+ }
+
+ _resultTab = resultTab;
+
+ if(null != _resultTab)
+ {
+ _resultTab.addResultTabCloseListener(_resultTabCloseListener);
+ }
+
+ }
}
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/shortcut/ShortCutDescriptionReader.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/shortcut/ShortCutDescriptionReader.java
new file mode 100644
index 0000000000..4bc765dbb2
--- /dev/null
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/shortcut/ShortCutDescriptionReader.java
@@ -0,0 +1,126 @@
+package net.sourceforge.squirrel_sql.client.shortcut;
+
+import java.util.MissingResourceException;
+import javax.swing.Action;
+import javax.swing.JMenuItem;
+import net.sourceforge.squirrel_sql.client.Main;
+import net.sourceforge.squirrel_sql.fw.resources.IResources;
+import net.sourceforge.squirrel_sql.fw.resources.ResourceBundleHandler;
+import net.sourceforge.squirrel_sql.fw.resources.Resources;
+import org.apache.commons.lang3.StringUtils;
+
+public record ShortCutDescriptionReader(Action action,
+ Class extends Action> actionClass,
+ JMenuItem mnuItem,
+ Resources resources,
+ ResourceBundleHandler bundleHandler,
+ String fullResourceKey)
+{
+ public static ShortCutDescriptionReader of(Action action)
+ {
+ return new ShortCutDescriptionReader(action, null, null, null, null, null);
+ }
+
+ public static ShortCutDescriptionReader of(Action action, JMenuItem mnuItem)
+ {
+ return new ShortCutDescriptionReader(action, null, mnuItem, null, null, null);
+ }
+
+ public static ShortCutDescriptionReader of(JMenuItem menuItem)
+ {
+ return new ShortCutDescriptionReader(null, null, menuItem, null, null, null);
+ }
+
+ public static ShortCutDescriptionReader of(Resources resources, Class extends Action> actionClass)
+ {
+ return new ShortCutDescriptionReader(null, actionClass, null, resources, null, null);
+ }
+
+ public static ShortCutDescriptionReader of(Action action, String fullResourceKey, ResourceBundleHandler bundleHandler)
+ {
+ return new ShortCutDescriptionReader(action, null, null, null, bundleHandler, fullResourceKey);
+ }
+
+ public static ShortCutDescriptionReader of()
+ {
+ return new ShortCutDescriptionReader(null, null, null, null, null, null);
+ }
+
+ public String getDescription()
+ {
+ String description = null;
+
+ Class extends Action> actCls = actionClass;
+
+ if(null == actCls && null != action)
+ {
+ actCls = action.getClass();
+ }
+
+
+ if(null != resources && null != actCls)
+ {
+ description = resources.getTooltipFromResource(actCls);
+ }
+
+ if(StringUtils.isBlank(description))
+ {
+ Action act = action;
+
+ if(null == act && null != actionClass)
+ {
+ act = Main.getApplication().getActionCollection().get(actionClass);
+ }
+
+ if(null != act)
+ {
+ description = (null == act.getValue(Action.SHORT_DESCRIPTION) ? null : "" + act.getValue(Action.SHORT_DESCRIPTION));
+
+ if(StringUtils.isBlank(description))
+ {
+ description = (null == act.getValue(Action.SHORT_DESCRIPTION) ? null : "" + act.getValue(Action.LONG_DESCRIPTION));
+ }
+ }
+ }
+
+ if(StringUtils.isBlank(description) && !StringUtils.isBlank(fullResourceKey))
+ {
+ String resKey = fullResourceKey;
+
+ if(fullResourceKey.startsWith(IResources.Keys.MENU_ITEM))
+ {
+ resKey = StringUtils.replace(fullResourceKey, IResources.Keys.MENU_ITEM, IResources.Keys.ACTION, 1);
+ }
+
+ if(null != resources)
+ {
+ try
+ {
+ description = resources.getTooltipFromResource(resKey);
+ }
+ catch(MissingResourceException e)
+ {
+ }
+ }
+
+ if(StringUtils.isBlank(description) && null != bundleHandler)
+ {
+ try
+ {
+ description = bundleHandler.getResourceString(resKey, IResources.ActionProperties.TOOLTIP);
+ }
+ catch(MissingResourceException e)
+ {
+ }
+ }
+ }
+
+ if(StringUtils.isBlank(description))
+ {
+ description = null;
+ }
+
+ return description;
+ }
+
+}
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/shortcut/ShortCutReader.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/shortcut/ShortCutReader.java
index 9b502abc35..9b4356924e 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/shortcut/ShortCutReader.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/shortcut/ShortCutReader.java
@@ -1,14 +1,13 @@
package net.sourceforge.squirrel_sql.client.shortcut;
+import java.util.MissingResourceException;
+import javax.swing.Action;
+import javax.swing.KeyStroke;
import net.sourceforge.squirrel_sql.client.Main;
import net.sourceforge.squirrel_sql.fw.resources.IResources;
import net.sourceforge.squirrel_sql.fw.resources.ResourceBundleHandler;
import net.sourceforge.squirrel_sql.fw.util.StringUtilities;
-import javax.swing.Action;
-import javax.swing.KeyStroke;
-import java.util.MissingResourceException;
-
public class ShortCutReader
{
private ResourceBundleHandler _bundleHandler;
@@ -63,7 +62,7 @@ private String _getShortcutAsString(String fullResourceKey, String actionName, A
if (false == defaultShortCut && false == StringUtilities.isEmpty(actionName, true))
{
// Possibly replace the standard shortcut with the user defined one.
- ret = Main.getApplication().getShortcutManager().registerAccelerator(actionName, KeyStroke.getKeyStroke(ret));
+ ret = Main.getApplication().getShortcutManager().registerAccelerator(actionName, KeyStroke.getKeyStroke(ret), ShortCutDescriptionReader.of(action, fullResourceKey, _bundleHandler));
}
return ret;
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/shortcut/Shortcut.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/shortcut/Shortcut.java
index e0f3bc4ee1..d45cf0fcf0 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/shortcut/Shortcut.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/shortcut/Shortcut.java
@@ -1,20 +1,21 @@
package net.sourceforge.squirrel_sql.client.shortcut;
-import org.jfree.chart.util.ObjectUtils;
-
import javax.swing.KeyStroke;
+import org.jfree.chart.util.ObjectUtils;
public class Shortcut
{
private final String _actionName;
+ private final String _actionDescription;
private final KeyStroke _defaultKeyStroke;
private KeyStroke _userKeyStroke;
private boolean _userKeyStrokeEmpty;
- public Shortcut(String actionName, KeyStroke defaultKeyStroke)
+ public Shortcut(String actionName, KeyStroke defaultKeyStroke, String actionDescription)
{
_actionName = actionName;
_defaultKeyStroke = defaultKeyStroke;
+ _actionDescription = actionDescription;
}
/**
@@ -57,6 +58,13 @@ public KeyStroke validKeyStroke()
return _defaultKeyStroke;
}
+ /**
+ * Used via reflection by JavabeanArrayDataSet
+ */
+ public String getActionDescription()
+ {
+ return _actionDescription;
+ }
public void setUserKeyStroke(KeyStroke userKeyStroke)
{
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/shortcut/ShortcutManager.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/shortcut/ShortcutManager.java
index f49b51744e..6eee09d98a 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/client/shortcut/ShortcutManager.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/shortcut/ShortcutManager.java
@@ -5,15 +5,6 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;
import com.fasterxml.jackson.databind.type.SimpleType;
-import net.sourceforge.squirrel_sql.client.Main;
-import net.sourceforge.squirrel_sql.client.util.ApplicationFiles;
-import net.sourceforge.squirrel_sql.fw.resources.Resources;
-import net.sourceforge.squirrel_sql.fw.util.StringUtilities;
-import net.sourceforge.squirrel_sql.fw.util.Utilities;
-
-import javax.swing.Action;
-import javax.swing.JMenuItem;
-import javax.swing.KeyStroke;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
@@ -22,6 +13,13 @@
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
+import javax.swing.Action;
+import javax.swing.JMenuItem;
+import javax.swing.KeyStroke;
+import net.sourceforge.squirrel_sql.client.util.ApplicationFiles;
+import net.sourceforge.squirrel_sql.fw.resources.Resources;
+import net.sourceforge.squirrel_sql.fw.util.StringUtilities;
+import net.sourceforge.squirrel_sql.fw.util.Utilities;
public class ShortcutManager
{
@@ -71,14 +69,14 @@ public List getShortcuts()
return new ArrayList<>(_shortcuts);
}
- public KeyStroke setAccelerator(JMenuItem item, KeyStroke defaultKeyStroke, Action action)
+ public KeyStroke setAccelerator(JMenuItem item, KeyStroke defaultKeyStroke, Action action, ShortCutDescriptionReader descReader)
{
- return setAccelerator(item, defaultKeyStroke, (String) action.getValue(Action.NAME));
+ return setAccelerator(item, defaultKeyStroke, (String) action.getValue(Action.NAME), descReader);
}
- public KeyStroke setAccelerator(JMenuItem item, KeyStroke defaultKeyStroke, String actionName)
+ public KeyStroke setAccelerator(JMenuItem item, KeyStroke defaultKeyStroke, String actionName, ShortCutDescriptionReader descReader)
{
- Shortcut shortcut = _registerAccelerator(actionName, defaultKeyStroke);
+ Shortcut shortcut = _registerAccelerator(actionName, defaultKeyStroke, descReader);
item.setAccelerator(shortcut.validKeyStroke());
@@ -86,33 +84,28 @@ public KeyStroke setAccelerator(JMenuItem item, KeyStroke defaultKeyStroke, Stri
}
- public void registerAccelerator(Class extends Action> actionClass)
- {
- registerAccelerator(actionClass, Main.getApplication().getResources());
- }
-
- public String registerAccelerator(Class extends Action> actionClass, Resources resources)
+ public String registerAccelerator(Class extends Action> actionClass, Resources resources, ShortCutDescriptionReader descReader)
{
String actionName = resources.getActionName(actionClass);
KeyStroke defaultKeyStroke = resources.getShortCutReader().getDefaultShortcutAsKeyStroke(resources.getFullMenuItemKey(actionClass), actionName);
- return _registerAccelerator(actionName, defaultKeyStroke).getValidKeyStroke();
+ return _registerAccelerator(actionName, defaultKeyStroke, descReader).getValidKeyStroke();
}
- public String registerAccelerator(String actionName, KeyStroke defaultKeyStroke)
+ public String registerAccelerator(String actionName, KeyStroke defaultKeyStroke, ShortCutDescriptionReader descReader)
{
- return _registerAccelerator(actionName, defaultKeyStroke).getValidKeyStroke();
+ return _registerAccelerator(actionName, defaultKeyStroke, descReader).getValidKeyStroke();
}
- private Shortcut _registerAccelerator(String actionName, KeyStroke defaultKeyStroke)
+ private Shortcut _registerAccelerator(String actionName, KeyStroke defaultKeyStroke, ShortCutDescriptionReader descReader)
{
if(StringUtilities.isEmpty(actionName, true))
{
- return new Shortcut(actionName, defaultKeyStroke);
+ return new Shortcut(actionName, defaultKeyStroke, descReader.getDescription());
}
- Shortcut ret = new Shortcut(actionName, defaultKeyStroke);
+ Shortcut ret = new Shortcut(actionName, defaultKeyStroke, descReader.getDescription());
String userShortCutString = _shortcutsJsonBeanLoadedAtStartUp.getShortcutByKey().get(ret.generateKey());
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/DataSetViewerTable.java b/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/DataSetViewerTable.java
index ed46978b3b..20a28aa7be 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/DataSetViewerTable.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/DataSetViewerTable.java
@@ -1,5 +1,17 @@
package net.sourceforge.squirrel_sql.fw.datasetviewer;
+import java.awt.Graphics;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import javax.swing.DefaultCellEditor;
+import javax.swing.JOptionPane;
+import javax.swing.JTable;
+import javax.swing.table.DefaultTableColumnModel;
+import javax.swing.table.TableCellEditor;
+import javax.swing.table.TableColumnModel;
import net.sourceforge.squirrel_sql.client.session.ISession;
import net.sourceforge.squirrel_sql.fw.datasetviewer.cellcomponent.CellComponentFactory;
import net.sourceforge.squirrel_sql.fw.datasetviewer.cellcomponent.CellRenderer;
@@ -15,19 +27,6 @@
import net.sourceforge.squirrel_sql.fw.util.log.ILogger;
import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
-import javax.swing.DefaultCellEditor;
-import javax.swing.JOptionPane;
-import javax.swing.JTable;
-import javax.swing.table.DefaultTableColumnModel;
-import javax.swing.table.TableCellEditor;
-import javax.swing.table.TableColumnModel;
-import java.awt.Graphics;
-import java.awt.Point;
-import java.awt.Rectangle;
-import java.awt.event.KeyEvent;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-
/*
* The JTable used for displaying all DB ResultSet info.
*/
@@ -51,6 +50,7 @@ public final class DataSetViewerTable extends JTable
private ColoringService _coloringService;
+ private FontService _fontService;
DataSetViewerTable(DataSetViewerTablePanel dataSetViewerTablePanel, IDataSetViewAccess dataSetViewAccess, IDataSetUpdateableModel dataSetUpdateableModel, int listSelectionMode, ISession session)
@@ -80,6 +80,7 @@ public final class DataSetViewerTable extends JTable
// Do in the end of constructor as we pass this as parameter.
_coloringService = new ColoringService(this);
+ _fontService = new FontService(this);
}
@@ -283,6 +284,8 @@ else if (colWidth < IDataSetViewer.MIN_COLUMN_WIDTH * _multiplier)
CellRenderer tableCellRenderer = CellComponentFactory.getTableCellRenderer(colDefs[i]);
tableCellRenderer.setColoringService(_coloringService);
+ tableCellRenderer.setFontService(_fontService);
+
ExtTableColumn col = new ExtTableColumn(i, colWidth, tableCellRenderer, null);
@@ -411,6 +414,11 @@ public ColoringService getColoringService()
return _coloringService;
}
+ public FontService getFontService()
+ {
+ return _fontService;
+ }
+
public void scrollToVisible(int viewRow, int viewCol)
{
Rectangle cellRect = getCellRect(viewRow, viewCol, true);
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/FontService.java b/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/FontService.java
new file mode 100644
index 0000000000..299eb2e552
--- /dev/null
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/FontService.java
@@ -0,0 +1,69 @@
+package net.sourceforge.squirrel_sql.fw.datasetviewer;
+
+import java.awt.Component;
+import java.awt.Font;
+import java.util.HashSet;
+import java.util.Set;
+
+public class FontService
+{
+ public static final Font MONO_SPACED_FONT = new Font(Font.MONOSPACED, Font.PLAIN, 12);
+
+ private final DataSetViewerTable _dataSetViewerTable;
+ private Font _originalCellFont = null;
+ private Set _monospacedColumns = new HashSet<>();
+
+ public FontService(DataSetViewerTable dataSetViewerTable)
+ {
+ _dataSetViewerTable = dataSetViewerTable;
+ _dataSetViewerTable.getButtonTableHeader().addColumnDragListener(() -> onColumnDragged());
+ }
+
+ private void onColumnDragged()
+ {
+ _monospacedColumns.clear();
+ _dataSetViewerTable.repaint();
+ }
+
+ public void initCellFont(Component tableCellRendererComponent, int columnIx)
+ {
+ if (RowNumberTableColumn.ROW_NUMBER_MODEL_INDEX == _dataSetViewerTable.getColumnModel().getColumn(columnIx).getModelIndex())
+ {
+ return;
+ }
+
+ if(null == _originalCellFont)
+ {
+ _originalCellFont = tableCellRendererComponent.getFont();
+ }
+
+ if(_monospacedColumns.contains(columnIx))
+ {
+ tableCellRendererComponent.setFont(MONO_SPACED_FONT);
+ }
+ else
+ {
+ tableCellRendererComponent.setFont(_originalCellFont);
+ }
+ }
+
+ public void toggleMonoSpaced(int[] selectedColumnIndexes)
+ {
+ //List buf = List.of(Arrays.stream(selectedColumnIndexes).boxed().toArray(Integer[]::new));
+ //_monospacedColumns.removeIf(ix -> false == buf.contains(ix));
+
+ for(int selectedColumn : selectedColumnIndexes)
+ {
+ if(_monospacedColumns.contains(selectedColumn))
+ {
+ _monospacedColumns.remove(selectedColumn);
+ }
+ else
+ {
+ _monospacedColumns.add(selectedColumn);
+ }
+ }
+
+ _dataSetViewerTable.repaint();
+ }
+}
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/JavabeanArrayDataSet.java b/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/JavabeanArrayDataSet.java
index 69d5ebfa15..affeadfca7 100644
--- a/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/JavabeanArrayDataSet.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/JavabeanArrayDataSet.java
@@ -18,10 +18,6 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-import net.sourceforge.squirrel_sql.fw.util.EmptyIterator;
-import net.sourceforge.squirrel_sql.fw.util.IMessageHandler;
-import net.sourceforge.squirrel_sql.fw.util.Utilities;
-
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
@@ -35,6 +31,9 @@
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
+import net.sourceforge.squirrel_sql.fw.util.EmptyIterator;
+import net.sourceforge.squirrel_sql.fw.util.IMessageHandler;
+import net.sourceforge.squirrel_sql.fw.util.Utilities;
public class JavabeanArrayDataSet implements IDataSet
{
@@ -48,10 +47,10 @@ public class JavabeanArrayDataSet implements IDataSet
private Class _beanClass;
private BeanPorpertyColumnDisplayDefinition[] _beanPorpertyColumnDisplayDefinitions;
- private HashMap _headers = new HashMap();
- private HashMap _positions = new HashMap();
- private HashMap _absoluteWidths = new HashMap();
- private HashSet _ignoreProperties = new HashSet();
+ private HashMap _headers = new HashMap<>();
+ private HashMap _positions = new HashMap<>();
+ private HashMap _absoluteWidths = new HashMap<>();
+ private HashSet _ignoreProperties = new HashSet<>();
/**
diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/ResultSetDataSet.java b/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/ResultSetDataSet.java
index 9b977c62ae..7d462a61df 100755
--- a/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/ResultSetDataSet.java
+++ b/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/ResultSetDataSet.java
@@ -21,6 +21,14 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+import java.sql.DatabaseMetaData;
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.ArrayList;
+import java.util.List;
+
import net.sourceforge.squirrel_sql.fw.dialects.DialectType;
import net.sourceforge.squirrel_sql.fw.sql.JDBCTypeMapper;
import net.sourceforge.squirrel_sql.fw.sql.ResultSetReader;
@@ -30,10 +38,6 @@
import net.sourceforge.squirrel_sql.fw.util.log.ILogger;
import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
-import java.sql.*;
-import java.util.ArrayList;
-import java.util.List;
-
public class ResultSetDataSet implements IDataSet
{
private final static ILogger s_log = LoggerController.createLogger(ResultSetDataSet.class);
@@ -47,7 +51,7 @@ public class ResultSetDataSet implements IDataSet
private DataSetDefinition _dataSetDefinition;
- private List