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 f72c2d5352..b195c6c7fa 100755 --- a/sql12/core/doc/changes.txt +++ b/sql12/core/doc/changes.txt @@ -6,6 +6,39 @@ Not yet released, available in our GIT repository, snapshots and future releases Enhancements: +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. @@ -15,7 +48,7 @@ https://github.com/squirrel-sql-client/squirrel-sql-code/issues/80 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 + 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" @@ -74,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/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/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 aliases() + public Iterator aliases() { return _aliasListHolder.getAll().iterator(); } - public List getAliasList() + public List getAliasList() { return _aliasListHolder.getAll(); } 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/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/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/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/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/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/SQLResultExecutorPanel.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/SQLResultExecutorPanel.java index f5f84b73eb..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 @@ -51,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; @@ -933,7 +934,7 @@ private void initAccelerator(Class 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/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/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 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 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 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 actionClass) - { - registerAccelerator(actionClass, Main.getApplication().getResources()); - } - - public String registerAccelerator(Class actionClass, Resources resources) + public String registerAccelerator(Class 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 _alData; + private List _allData; /** * If true cancel has been requested. @@ -87,19 +91,6 @@ public ResultSetDataSet() this.tableColumnInfos = new TableColumnInfo[]{}; } - /** - * Form used by Tabs other than ContentsTab - * - * @param rs the ResultSet to set. - * @param dialectType the type of dialect in use. - * @throws DataSetException - */ - public int setResultSet(ResultSet rs, DialectType dialectType) throws DataSetException - { - return _setResultSet(new ResultSetWrapper(rs), null, null, false, false, dialectType); - } - - /** * Content Tab may wish to limit data read for big columns. * @@ -110,47 +101,39 @@ public void setLimitDataRead(boolean limitDataRead) this._limitDataRead = limitDataRead; } - /** - * Form used by ContentsTab, and for SQL results - * - * @param rs the ResultSet to set. - * @param fullTableName the fully-qualified table name - * @param dialectType the type of dialect in use. - * @throws DataSetException - */ - public int setContentsTabResultSet(ResultSet rs, String fullTableName, DialectType dialectType) throws DataSetException + public int readDataFromJdbcResultSetForObjectTreeContentTabs(ResultSet rs, String fullTableName, DialectType dialectType) throws DataSetException { - return _setResultSet(new ResultSetWrapper(rs), fullTableName, null, false, true, dialectType); + return _readDataFromJdbcResultSet(new ResultSetWrapper(rs), fullTableName, null, false, true, dialectType); } - public int setSqlExecutionTabResultSet(ResultSetWrapper rs, String fullTableName, DialectType dialectType) throws DataSetException + public int readDataFromJdbcResultSetForSqlExecution(ResultSetWrapper rs, String fullTableName, DialectType dialectType) throws DataSetException { - return _setResultSet(rs, fullTableName, null, false, true, dialectType); + return _readDataFromJdbcResultSet(rs, fullTableName, null, false, true, dialectType); } + public int readDataFromJdbcResultSetForDatabaseMetaData(ResultSet rs, int[] columnIndices, boolean computeWidths, DialectType dialectType) throws DataSetException + { + return _readDataFromJdbcResultSet(new ResultSetWrapper(rs), null, columnIndices, computeWidths, false, dialectType); + } - /** - * External method to read the contents of a ResultSet that is used by all - * Tab classes except ContentsTab. This tunrs all the data into strings for - * simplicity of operation. - */ - public int setResultSet(ResultSet rs, int[] columnIndices, boolean computeWidths, DialectType dialectType) throws DataSetException + public int readDataFromJdbcResultSetForGeneralPurpose(ResultSet rs, DialectType dialectType) throws DataSetException { - return _setResultSet(new ResultSetWrapper(rs), null, columnIndices, computeWidths, false, dialectType); + return _readDataFromJdbcResultSet(new ResultSetWrapper(rs), null, null, false, false, dialectType); } + /** * Internal method to read the contents of a ResultSet that is used by all * Tab classes * * @return The number of rows read from the ResultSet */ - private int _setResultSet(ResultSetWrapper rs, - String fullTableName, - int[] columnIndices, - boolean computeWidths, - boolean useColumnDefs, - DialectType dialectType) throws DataSetException + private int _readDataFromJdbcResultSet(ResultSetWrapper rs, + String fullTableName, + int[] columnIndices, + boolean computeWidths, + boolean useColumnDefs, + DialectType dialectType) throws DataSetException { reset(); _dialectType = dialectType; @@ -161,7 +144,7 @@ private int _setResultSet(ResultSetWrapper rs, } _iCurrent = -1; - _alData = new ArrayList<>(); + _allData = new ArrayList<>(); if (rs == null) { @@ -193,7 +176,7 @@ private int _setResultSet(ResultSetWrapper rs, { if (_cancel) { - return _alData.size(); + return _allData.size(); } Object[] row = createRow(columnIndices, useColumnDefs, colDefs, BlockMode.FIRST_BLOCK); @@ -204,11 +187,11 @@ private int _setResultSet(ResultSetWrapper rs, } else { - _alData.add(row); + _allData.add(row); } } - return _alData.size(); + return _allData.size(); // ColumnDisplayDefinition[] colDefs = createColumnDefinitions(md, // columnIndices, computeWidths); @@ -282,9 +265,9 @@ public synchronized boolean next(IMessageHandler msgHandler) throws DataSetException { // TODO: This should be handled with an Iterator - if (++_iCurrent < _alData.size()) + if (++_iCurrent < _allData.size()) { - _currentRow = _alData.get(_iCurrent); + _currentRow = _allData.get(_iCurrent); return true; } return false; @@ -327,9 +310,9 @@ private ColumnDisplayDefinition[] createColumnDefinitions( if (computeWidths) { colWidths = new int[_columnCount]; - for (int i = 0; i < _alData.size(); i++) + for (int i = 0; i < _allData.size(); i++) { - Object[] row = _alData.get(i); + Object[] row = _allData.get(i); for (int col = 0; i < _columnCount; i++) { if (row[col] != null) @@ -569,7 +552,7 @@ private void reset() _currentRow = null; _columnCount = 0; _dataSetDefinition = null; - _alData = null; + _allData = null; } public void resetCursor() @@ -587,9 +570,9 @@ public void resetCursor() */ public Object removeRow(int index) { - if (_alData.size() > index) + if (_allData.size() > index) { - return _alData.remove(index); + return _allData.remove(index); } else { @@ -617,7 +600,7 @@ public String toString() } - for (Object[] row : _alData) + for (Object[] row : _allData) { for (Object rowItem : row) { @@ -639,7 +622,7 @@ public String toString() public List getAllDataForReadOnly() { - return _alData; + return _allData; } public void readMoreResults() @@ -655,7 +638,7 @@ public void readMoreResults() } else { - _alData.add(row); + _allData.add(row); } } @@ -670,7 +653,7 @@ public void readMoreResults() public int currentRowCount() { - return _alData.size(); + return _allData.size(); } public boolean isAllResultsRead() @@ -696,6 +679,6 @@ public void closeStatementAndResultSet() public void replaceDataOnUserEdits(ArrayList updatedRows) { resetCursor(); - _alData = updatedRows; + _allData = updatedRows; } } diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/cellcomponent/CellRenderer.java b/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/cellcomponent/CellRenderer.java index e4775f9912..90b12788ef 100644 --- a/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/cellcomponent/CellRenderer.java +++ b/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/cellcomponent/CellRenderer.java @@ -1,11 +1,11 @@ package net.sourceforge.squirrel_sql.fw.datasetviewer.cellcomponent; -import net.sourceforge.squirrel_sql.fw.datasetviewer.coloring.ColoringService; - +import java.awt.Component; import javax.swing.JLabel; import javax.swing.JTable; import javax.swing.table.DefaultTableCellRenderer; -import java.awt.Component; +import net.sourceforge.squirrel_sql.fw.datasetviewer.FontService; +import net.sourceforge.squirrel_sql.fw.datasetviewer.coloring.ColoringService; /** * The base component of a DefaultTableCellRenderer is a JLabel. @@ -16,6 +16,7 @@ public final class CellRenderer extends DefaultTableCellRenderer implements Squi { private final IDataTypeComponent _dataTypeObject; private ColoringService _coloringService; + private FontService _fontService; CellRenderer(IDataTypeComponent dataTypeObject) { @@ -50,6 +51,13 @@ public Component getTableCellRendererComponent(JTable table, Object value, boole _coloringService.colorCell(this, _dataTypeObject, table, value, isSelected, hasFocus, row, column); } + if (null != _fontService) + { + + + _fontService.initCellFont(this, column); + } + BlobClobLoadCheck.check(_dataTypeObject, table, value, isSelected, hasFocus, row, column); return label; @@ -86,4 +94,9 @@ public void setColoringService(ColoringService coloringService) { _coloringService = coloringService; } + + public void setFontService(FontService fontService) + { + _fontService = fontService; + } } diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/cellcomponent/DataTypeString.java b/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/cellcomponent/DataTypeString.java index 3332a93b46..abec087ee2 100644 --- a/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/cellcomponent/DataTypeString.java +++ b/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/cellcomponent/DataTypeString.java @@ -18,32 +18,6 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -import net.sourceforge.squirrel_sql.fw.datasetviewer.ColumnDisplayDefinition; -import net.sourceforge.squirrel_sql.fw.datasetviewer.cellcomponent.whereClause.EmptyWhereClausePart; -import net.sourceforge.squirrel_sql.fw.datasetviewer.cellcomponent.whereClause.IWhereClausePart; -import net.sourceforge.squirrel_sql.fw.datasetviewer.cellcomponent.whereClause.IsNullWhereClausePart; -import net.sourceforge.squirrel_sql.fw.datasetviewer.cellcomponent.whereClause.ParameterWhereClausePart; -import net.sourceforge.squirrel_sql.fw.datasetviewer.celldatapopup.CellDataDialogHandler; -import net.sourceforge.squirrel_sql.fw.gui.IntegerField; -import net.sourceforge.squirrel_sql.fw.gui.MultipleLineLabel; -import net.sourceforge.squirrel_sql.fw.gui.OkJPanel; -import net.sourceforge.squirrel_sql.fw.sql.ISQLDatabaseMetaData; -import net.sourceforge.squirrel_sql.fw.util.StringManager; -import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory; -import net.sourceforge.squirrel_sql.fw.util.StringUtilities; -import net.sourceforge.squirrel_sql.fw.util.Utilities; - -import javax.swing.BorderFactory; -import javax.swing.JCheckBox; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTable; -import javax.swing.JTextArea; -import javax.swing.JTextField; -import javax.swing.SwingUtilities; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; -import javax.swing.text.JTextComponent; import java.awt.Color; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; @@ -60,6 +34,32 @@ import java.sql.ResultSet; import java.sql.Types; import java.util.Iterator; +import javax.swing.BorderFactory; +import javax.swing.JCheckBox; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.JTextArea; +import javax.swing.JTextField; +import javax.swing.SwingUtilities; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.text.JTextComponent; + +import net.sourceforge.squirrel_sql.fw.datasetviewer.ColumnDisplayDefinition; +import net.sourceforge.squirrel_sql.fw.datasetviewer.cellcomponent.whereClause.EmptyWhereClausePart; +import net.sourceforge.squirrel_sql.fw.datasetviewer.cellcomponent.whereClause.IWhereClausePart; +import net.sourceforge.squirrel_sql.fw.datasetviewer.cellcomponent.whereClause.IsNullWhereClausePart; +import net.sourceforge.squirrel_sql.fw.datasetviewer.cellcomponent.whereClause.ParameterWhereClausePart; +import net.sourceforge.squirrel_sql.fw.datasetviewer.celldatapopup.CellDataDialogHandler; +import net.sourceforge.squirrel_sql.fw.gui.IntegerField; +import net.sourceforge.squirrel_sql.fw.gui.MultipleLineLabel; +import net.sourceforge.squirrel_sql.fw.gui.OkJPanel; +import net.sourceforge.squirrel_sql.fw.sql.ISQLDatabaseMetaData; +import net.sourceforge.squirrel_sql.fw.util.StringManager; +import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory; +import net.sourceforge.squirrel_sql.fw.util.StringUtilities; +import net.sourceforge.squirrel_sql.fw.util.Utilities; /** @@ -123,7 +123,7 @@ public class DataTypeString extends BaseDataTypeComponent * otherwise do not include it. * Oracle does not allow that type to be used in a WHERE clause */ - private static boolean _useLongInWhere = true; + private static boolean _useLongVarcharInWhere = true; /** @@ -163,10 +163,10 @@ private static void loadProperties() { if (makeNewlinesVisibleString != null && makeNewlinesVisibleString.equals("false")) _makeNewlinesVisibleInCell = false; - _useLongInWhere = true; // set to the default + _useLongVarcharInWhere = true; // set to the default String useLongInWhereString = DataTypeProps.getProperty(DataTypeString.class.getName(), "useLongInWhere"); if (useLongInWhereString != null && useLongInWhereString.equals("false")) - _useLongInWhere = false; + _useLongVarcharInWhere = false; LimitReadLengthFeatureUnstable._limitRead = false; // set to default String limitReadString = DataTypeProps.getProperty(DataTypeString.class.getName(), "limitRead"); @@ -542,27 +542,32 @@ public Object readResultSet(ResultSet rs, int index, boolean limitDataRead) * or whatever is appropriate for this column in the database. */ @Override - public IWhereClausePart getWhereClauseValue(Object value, ISQLDatabaseMetaData md) { + public IWhereClausePart getWhereClauseValue(Object value, ISQLDatabaseMetaData md) + { // first do special check to see if we should use LONGVARCHAR // in the WHERE clause. // (Oracle does not allow this.) - if (_colDef.getSqlType() == Types.LONGVARCHAR && - _useLongInWhere == false) - return null; // this column cannot be used in a WHERE clause + if( _colDef.getSqlType() == Types.LONGVARCHAR && _useLongVarcharInWhere == false ) + { + return null; // this column cannot be used in a WHERE clause + } - if (value == null || value.toString() == null ) + if( value == null || value.toString() == null ) + { return new IsNullWhereClausePart(_colDef); - else { + } + else + { // We cannot use this data in the WHERE clause if it has been truncated. // Since being truncated is the same as needing to re-read, // only use this in the WHERE clause if we do not need to re-read - if ( ! needToReRead(value)) + if( !needToReRead(value) ) { return new ParameterWhereClausePart(_colDef, value, this); } - else - { - return new EmptyWhereClausePart(); // value is truncated, so do not use in WHERE clause + else + { + return new EmptyWhereClausePart(); // value is truncated, so do not use in WHERE clause } } } @@ -842,7 +847,7 @@ public DataTypeStringPanel() { _makeNewlinesVisibleInCellChk.setSelected(_makeNewlinesVisibleInCell); // checkbox for using LONG in WHERE clause - _useLongInWhereChk.setSelected(_useLongInWhere); + _useLongInWhereChk.setSelected(_useLongVarcharInWhere); // checkbox for limit/no-limit on data read during initial table load _limitReadChk.setSelected(LimitReadLengthFeatureUnstable._limitRead); @@ -979,8 +984,8 @@ public void ok() { _makeNewlinesVisibleInCell = _makeNewlinesVisibleInCellChk.isSelected(); DataTypeProps.putDataTypeProperty(DataTypeString.class.getName(), "makeNewlinesVisibleInCell", Boolean.valueOf(_makeNewlinesVisibleInCell).toString()); - _useLongInWhere = _useLongInWhereChk.isSelected(); - DataTypeProps.putDataTypeProperty(DataTypeString.class.getName(), "useLongInWhere", Boolean.valueOf(_useLongInWhere).toString()); + _useLongVarcharInWhere = _useLongInWhereChk.isSelected(); + DataTypeProps.putDataTypeProperty(DataTypeString.class.getName(), "useLongInWhere", Boolean.valueOf(_useLongVarcharInWhere).toString()); LimitReadLengthFeatureUnstable._limitRead = _limitReadChk.isSelected(); DataTypeProps.putDataTypeProperty(DataTypeString.class.getName(), "limitRead", Boolean.valueOf(LimitReadLengthFeatureUnstable._limitRead).toString()); diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/celldatapopup/CellDataDialog.java b/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/celldatapopup/CellDataDialog.java index 5c255150b3..49067b59d8 100644 --- a/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/celldatapopup/CellDataDialog.java +++ b/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/celldatapopup/CellDataDialog.java @@ -1,22 +1,17 @@ package net.sourceforge.squirrel_sql.fw.datasetviewer.celldatapopup; import java.awt.GridLayout; +import java.awt.Window; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JDialog; -import javax.swing.JTable; -import javax.swing.SwingUtilities; - import net.sourceforge.squirrel_sql.client.Main; -import net.sourceforge.squirrel_sql.fw.datasetviewer.ColumnDisplayDefinition; -import net.sourceforge.squirrel_sql.fw.datasetviewer.DataSetViewerTable; import net.sourceforge.squirrel_sql.fw.datasetviewer.columndisplaychoice.CellDisplayPanel; import net.sourceforge.squirrel_sql.fw.datasetviewer.columndisplaychoice.CellDisplayPanelContent; import net.sourceforge.squirrel_sql.fw.datasetviewer.columndisplaychoice.DisplayMode; import net.sourceforge.squirrel_sql.fw.datasetviewer.columndisplaychoice.DisplayPanelListener; import net.sourceforge.squirrel_sql.fw.datasetviewer.columndisplaychoice.ResultImageDisplayPanel; import net.sourceforge.squirrel_sql.fw.datasetviewer.tablefind.GlobalFindRemoteControl; -import net.sourceforge.squirrel_sql.fw.gui.CloseByEscapeListener; import net.sourceforge.squirrel_sql.fw.gui.GUIUtils; import net.sourceforge.squirrel_sql.fw.util.StringManager; import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory; @@ -27,27 +22,14 @@ public class CellDataDialog extends JDialog private CellDisplayPanel _cellDisplayPanel; - public CellDataDialog(JTable parentTable, - String columnName, - int rowIx, - int colIx, - ColumnDisplayDefinition colDef, - Object objectToDisplay, - boolean isModelEditable) + public CellDataDialog(CellDataDialogState cellDataDialogState, Window parentWindow) { - super(SwingUtilities.windowForComponent(parentTable)); + super(parentWindow); getContentPane().setLayout(new GridLayout(1,1)); - initCellDisplayPanel(parentTable, columnName, rowIx, colIx, colDef, objectToDisplay, isModelEditable,false); + initCellDisplayPanel(cellDataDialogState); - GUIUtils.enableCloseByEscape(this, new CloseByEscapeListener() - { - @Override - public void willCloseByEscape(JDialog dialog) - { - cleanUp(); - } - }); + GUIUtils.enableCloseByEscape(this, dialog -> cleanUp()); addWindowListener(new WindowAdapter() { @@ -70,15 +52,10 @@ private void cleanUp() _cellDisplayPanel.cleanUp(); } - public void initCellDisplayPanel(JTable table, - String columnName, - int rowIx, - int colIx, - ColumnDisplayDefinition colDef, - Object value, - boolean isModelEditable, - boolean pinned) + public void initCellDisplayPanel(CellDataDialogState cellDataDialogState) { + + if(null != _cellDisplayPanel) { getContentPane().remove(_cellDisplayPanel); @@ -86,14 +63,14 @@ public void initCellDisplayPanel(JTable table, _cellDisplayPanel = null; } - setTitle(s_stringMgr.getString("cellDataPopup.valueofColumn", columnName)); + setTitle(s_stringMgr.getString("cellDataPopup.valueofColumn", cellDataDialogState.getCellName())); DisplayPanelListener displayPanelListener = new DisplayPanelListener() { @Override public void displayModeChanged() { - onDisplayModeChanged(colDef, value, rowIx, colIx, isModelEditable, table); + onDisplayModeChanged(cellDataDialogState); } @Override @@ -103,12 +80,12 @@ public void scaleImageToPanelSize() } }; - _cellDisplayPanel =new CellDisplayPanel(displayPanelListener,sticky -> onToggleSticky(sticky), pinned); + _cellDisplayPanel =new CellDisplayPanel(displayPanelListener,sticky -> onToggleSticky(sticky), cellDataDialogState.isPinned()); - _cellDisplayPanel.setCurrentColumnDisplayDefinition(colDef); + _cellDisplayPanel.setCurrentColumnDisplayDefinition(cellDataDialogState.getColDispDef()); getContentPane().add(_cellDisplayPanel); - onDisplayModeChanged(colDef, value, rowIx, colIx, isModelEditable, table); + onDisplayModeChanged(cellDataDialogState); } private void onScaleImageToPanelSize() @@ -132,28 +109,24 @@ private void onToggleSticky(boolean sticky) } } - private void onDisplayModeChanged(ColumnDisplayDefinition colDef, Object value, int row, int col, boolean isModelEditable, JTable table) + private void onDisplayModeChanged(CellDataDialogState cellDataDialogState) { CellDisplayPanelContent pnlToDisplay; if(DisplayMode.IMAGE == _cellDisplayPanel.getDisplayMode()) { - pnlToDisplay = new ResultImageDisplayPanel(colDef, - value, - isModelEditable, - row, - col, - () -> _cellDisplayPanel.getContentComponent().castToComponent().getSize(), - (DataSetViewerTable) table); + pnlToDisplay = new ResultImageDisplayPanel(cellDataDialogState, + () -> _cellDisplayPanel.getContentComponent().castToComponent().getSize() + ); } else { - CellDataColumnDataPanel cellDataPanel = new CellDataColumnDataPanel(value, colDef, isModelEditable); - cellDataPanel.setCellDataUpdateInfo(new CellDataUpdateInfo(row, col, table, this)); + CellDataColumnDataPanel cellDataPanel = new CellDataColumnDataPanel(cellDataDialogState.getValueToDisplay(), cellDataDialogState.getColDispDef(), cellDataDialogState.isEditable()); + cellDataPanel.setCellDataUpdateInfo(new CellDataUpdateInfo(cellDataDialogState, this)); pnlToDisplay = cellDataPanel; } - _cellDisplayPanel.setCurrentColumnDisplayDefinition(colDef); + _cellDisplayPanel.setCurrentColumnDisplayDefinition(cellDataDialogState.getColDispDef()); _cellDisplayPanel.setContentComponent(pnlToDisplay); _cellDisplayPanel.revalidate(); diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/celldatapopup/CellDataDialogEditableState.java b/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/celldatapopup/CellDataDialogEditableState.java new file mode 100644 index 0000000000..5064c3f69d --- /dev/null +++ b/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/celldatapopup/CellDataDialogEditableState.java @@ -0,0 +1,34 @@ +package net.sourceforge.squirrel_sql.fw.datasetviewer.celldatapopup; + +import javax.swing.JTable; +import net.sourceforge.squirrel_sql.fw.datasetviewer.DataSetViewerTable; + +public class CellDataDialogEditableState +{ + private final JTable _table; + private final int _rowIx; + private final int _colIx; + + public CellDataDialogEditableState(JTable table, int rowIx, int colIx) + { + _table = table; + _rowIx = rowIx; + _colIx = colIx; + } + + + public int getRowIx() + { + return _rowIx; + } + + public int getColIx() + { + return _colIx; + } + + public DataSetViewerTable getDatasetViewerTable() + { + return (DataSetViewerTable) _table; + } +} diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/celldatapopup/CellDataDialogHandler.java b/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/celldatapopup/CellDataDialogHandler.java index d7817ca61e..22d8d66bb7 100644 --- a/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/celldatapopup/CellDataDialogHandler.java +++ b/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/celldatapopup/CellDataDialogHandler.java @@ -18,18 +18,6 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -import net.sourceforge.squirrel_sql.client.Main; -import net.sourceforge.squirrel_sql.fw.datasetviewer.ColumnDisplayDefinition; -import net.sourceforge.squirrel_sql.fw.datasetviewer.ExtTableColumn; -import net.sourceforge.squirrel_sql.fw.gui.GUIUtils; -import net.sourceforge.squirrel_sql.fw.props.Props; -import net.sourceforge.squirrel_sql.fw.util.StringManager; -import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory; - -import javax.swing.CellEditor; -import javax.swing.JTable; -import javax.swing.SwingUtilities; -import javax.swing.table.TableColumn; import java.awt.Component; import java.awt.Dimension; import java.awt.Point; @@ -38,6 +26,17 @@ import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; +import javax.swing.CellEditor; +import javax.swing.JTable; +import javax.swing.SwingUtilities; +import javax.swing.table.TableColumn; +import net.sourceforge.squirrel_sql.client.Main; +import net.sourceforge.squirrel_sql.fw.datasetviewer.ColumnDisplayDefinition; +import net.sourceforge.squirrel_sql.fw.datasetviewer.ExtTableColumn; +import net.sourceforge.squirrel_sql.fw.gui.GUIUtils; +import net.sourceforge.squirrel_sql.fw.props.Props; +import net.sourceforge.squirrel_sql.fw.util.StringManager; +import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory; /** * Generate a popup window to display and manipulate the @@ -116,7 +115,10 @@ public static void showSelectedValueInPinnedCellDataDialog(JTable table, boolean Object obj = table.getValueAt(selectedRow, selectedColumn); ColumnDisplayDefinition colDef = ((ExtTableColumn) column).getColumnDisplayDefinition(); - pinnedCellDataDialog.initCellDisplayPanel(table, table.getColumnName(selectedColumn), selectedRow, selectedColumn, colDef, obj, isModelEditable, true); + CellDataDialogState cellDataDialogState = + new CellDataDialogState(table.getColumnName(selectedColumn), colDef, obj, true, isModelEditable, table, selectedRow, selectedColumn); + + pinnedCellDataDialog.initCellDisplayPanel(cellDataDialogState); } @@ -130,7 +132,21 @@ private static void createAndShowCellDataDialog(JTable parentTable, boolean isModelEditable, MouseEvent evt) { - CellDataDialog cellDataDialog = new CellDataDialog(parentTable, columnName, rowIx, colIx, colDef, objectToDisplay, isModelEditable); + CellDataDialogState cellDataDialogState = + new CellDataDialogState(columnName, colDef, objectToDisplay, false, isModelEditable, parentTable, rowIx, colIx); + + createAndShowCellDataDialog(cellDataDialogState, SwingUtilities.windowForComponent(parentTable), evt); + } + + public static void createAndShowCellDataDialog(CellDataDialogState cellDataDialogState, Window parentWindow) + { + createAndShowCellDataDialog(cellDataDialogState, parentWindow, null); + } + + + public static void createAndShowCellDataDialog(CellDataDialogState cellDataDialogState, Window parentWindow, MouseEvent mouseEvent) + { + CellDataDialog cellDataDialog = new CellDataDialog(cellDataDialogState, parentWindow); cellDataDialog.pack(); @@ -162,16 +178,21 @@ private static void createAndShowCellDataDialog(JTable parentTable, } } - Window parentWindow = SwingUtilities.windowForComponent(parentTable); - Point dialogPos = parentWindow.getLocation(); - - dialogPos.x += SwingUtilities.convertPoint((Component) evt.getSource(), evt.getPoint(), parentWindow).x; - dialogPos.y += SwingUtilities.convertPoint((Component) evt.getSource(), evt.getPoint(), parentWindow).y; - - Rectangle dialogRect = GUIUtils.ensureBoundsOnOneScreen(new Rectangle(dialogPos.x, dialogPos.y, dim.width, dim.height)); + if(null != mouseEvent) + { + Point dialogPos = parentWindow.getLocation(); + dialogPos.x += SwingUtilities.convertPoint((Component) mouseEvent.getSource(), mouseEvent.getPoint(), parentWindow).x; + dialogPos.y += SwingUtilities.convertPoint((Component) mouseEvent.getSource(), mouseEvent.getPoint(), parentWindow).y; + Rectangle dialogRect = GUIUtils.ensureBoundsOnOneScreen(new Rectangle(dialogPos.x, dialogPos.y, dim.width, dim.height)); - cellDataDialog.setBounds(dialogRect); + cellDataDialog.setBounds(dialogRect); + } + else + { + cellDataDialog.setSize(dim); + GUIUtils.centerWithinParent(cellDataDialog); + } cellDataDialog.addWindowListener(new WindowAdapter() { diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/celldatapopup/CellDataDialogState.java b/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/celldatapopup/CellDataDialogState.java new file mode 100644 index 0000000000..f46c93743d --- /dev/null +++ b/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/celldatapopup/CellDataDialogState.java @@ -0,0 +1,75 @@ +package net.sourceforge.squirrel_sql.fw.datasetviewer.celldatapopup; + +import java.sql.Types; +import javax.swing.JTable; +import net.sourceforge.squirrel_sql.fw.datasetviewer.ColumnDisplayDefinition; + +public class CellDataDialogState +{ + private final String _columnName; + private final ColumnDisplayDefinition _colDef; + private final Object _valueToDisplay; + private final boolean _isModelEditable; + private final boolean _pinned; + private final CellDataDialogEditableState _cellDataDialogEditableState; + + public CellDataDialogState(String columnName, ColumnDisplayDefinition colDef, Object value, boolean pinned, boolean isModelEditable, JTable table, int rowIx, int colIx) + { + _columnName = columnName; + _colDef = colDef; + _valueToDisplay = value; + _isModelEditable = isModelEditable; + _pinned = pinned; + + _cellDataDialogEditableState = new CellDataDialogEditableState(table, rowIx, colIx); + } + + public CellDataDialogState(String dialogTitlePostfix, String value) + { + _columnName = dialogTitlePostfix; + _valueToDisplay = value; + + _colDef = new ColumnDisplayDefinition(100, dialogTitlePostfix); + _colDef.setSqlType(Types.VARCHAR); + _colDef.setSqlTypeName("VARCHAR"); + + _isModelEditable = false; + _pinned = false; + _cellDataDialogEditableState = null; + } + + public String getCellName() + { + return _columnName; + } + + public boolean isEditable() + { + return _isModelEditable; + } + + public ColumnDisplayDefinition getColDispDef() + { + return _colDef; + } + + public Object getValueToDisplay() + { + return _valueToDisplay; + } + + public boolean isPinned() + { + return _pinned; + } + + public CellDataDialogEditableState getEditableState() + { + if(false == isEditable()) + { + throw new IllegalStateException("Only to be called when updateable"); + } + + return _cellDataDialogEditableState; + } +} diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/celldatapopup/CellDataUpdateInfo.java b/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/celldatapopup/CellDataUpdateInfo.java index 31ac5fa779..a5ff3b245d 100644 --- a/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/celldatapopup/CellDataUpdateInfo.java +++ b/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/celldatapopup/CellDataUpdateInfo.java @@ -4,48 +4,44 @@ public class CellDataUpdateInfo { - private final int _row; - private final int _col; - private JTable _table; - private CellDataDialog _parentDialog; + private CellDataDialogState _cellDataDialogState; + private CellDataDialog _parentCellDataDialog; - public CellDataUpdateInfo(int row, int col, JTable table, CellDataDialog parentDialog) + public CellDataUpdateInfo(CellDataDialogState cellDataDialogState, CellDataDialog parentCellDataDialog) { - _row = row; - _col = col; - _table = table; - _parentDialog = parentDialog; + _cellDataDialogState = cellDataDialogState; + _parentCellDataDialog = parentCellDataDialog; } public int getRow() { - return _row; + return _cellDataDialogState.getEditableState().getRowIx(); } public int getCol() { - return _col; + return _cellDataDialogState.getEditableState().getColIx(); } public JTable getTable() { - return _table; + return _cellDataDialogState.getEditableState().getDatasetViewerTable(); } public void closeParentDialog() { - if(null == _parentDialog) + if(null == _parentCellDataDialog) { return; } - _parentDialog.setVisible(false); - _parentDialog.dispose(); + _parentCellDataDialog.setVisible(false); + _parentCellDataDialog.dispose(); } public void cleanUp() { - _parentDialog = null; - _table = null; + _parentCellDataDialog = null; + _cellDataDialogState = null; } } diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/coloring/markduplicates/MarkDuplicatesStateHandler.java b/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/coloring/markduplicates/MarkDuplicatesStateHandler.java index 6b319fc974..d28e70be3a 100644 --- a/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/coloring/markduplicates/MarkDuplicatesStateHandler.java +++ b/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/coloring/markduplicates/MarkDuplicatesStateHandler.java @@ -10,7 +10,7 @@ import net.sourceforge.squirrel_sql.fw.datasetviewer.DataSetViewerTablePanel; import net.sourceforge.squirrel_sql.fw.datasetviewer.IDataSetViewer; import net.sourceforge.squirrel_sql.fw.gui.GUIUtils; -import net.sourceforge.squirrel_sql.fw.gui.table.ButtonTableHeaderDraggedColumnListener; +import net.sourceforge.squirrel_sql.fw.gui.table.ButtonTableHeaderColumnDragListener; import net.sourceforge.squirrel_sql.fw.gui.table.SortableTableModel; import net.sourceforge.squirrel_sql.fw.gui.table.SortingListener; @@ -18,7 +18,7 @@ public class MarkDuplicatesStateHandler { private final ActionListener _noResultTabFallBackActionListener; private final SortingListener _tableSortingListener; - private final ButtonTableHeaderDraggedColumnListener _buttonTableHeaderDraggedColumnListener; + private final ButtonTableHeaderColumnDragListener _buttonTableHeaderColumnDragListener; private Action _actionProxy; private IDataSetViewer _sqlResultDataSetViewer; @@ -27,11 +27,11 @@ public class MarkDuplicatesStateHandler public MarkDuplicatesStateHandler(ActionListener noResultTabFallBackActionListener, SortingListener tableSortingListener, - ButtonTableHeaderDraggedColumnListener buttonTableHeaderDraggedColumnListener) + ButtonTableHeaderColumnDragListener buttonTableHeaderColumnDragListener) { _noResultTabFallBackActionListener = noResultTabFallBackActionListener; _tableSortingListener = tableSortingListener; - _buttonTableHeaderDraggedColumnListener = buttonTableHeaderDraggedColumnListener; + _buttonTableHeaderColumnDragListener = buttonTableHeaderColumnDragListener; _actionProxy = new AbstractAction() { @@ -81,7 +81,7 @@ public void init(IDataSetViewer dataSetViewer, IResultTab resultTab) if(_sqlResultDataSetViewer instanceof DataSetViewerTablePanel) { - ((DataSetViewerTablePanel) _sqlResultDataSetViewer).getTable().getButtonTableHeader().setDraggedColumnListener(_buttonTableHeaderDraggedColumnListener); + ((DataSetViewerTablePanel) _sqlResultDataSetViewer).getTable().getButtonTableHeader().addColumnDragListener(_buttonTableHeaderColumnDragListener); } } diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/columndisplaychoice/ResultDataSetAndCellDetailDisplayHandler.java b/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/columndisplaychoice/ResultDataSetAndCellDetailDisplayHandler.java index 0ce27352c4..a7df7d59f5 100644 --- a/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/columndisplaychoice/ResultDataSetAndCellDetailDisplayHandler.java +++ b/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/columndisplaychoice/ResultDataSetAndCellDetailDisplayHandler.java @@ -1,9 +1,16 @@ package net.sourceforge.squirrel_sql.fw.datasetviewer.columndisplaychoice; +import java.awt.event.ComponentAdapter; +import java.awt.event.ComponentEvent; +import java.beans.PropertyChangeEvent; +import javax.swing.BorderFactory; +import javax.swing.JScrollPane; +import javax.swing.JSplitPane; import net.sourceforge.squirrel_sql.fw.datasetviewer.DataSetViewerTablePanel; import net.sourceforge.squirrel_sql.fw.datasetviewer.ExtTableColumn; import net.sourceforge.squirrel_sql.fw.datasetviewer.IDataSetViewer; import net.sourceforge.squirrel_sql.fw.datasetviewer.celldatapopup.CellDataColumnDataPanel; +import net.sourceforge.squirrel_sql.fw.datasetviewer.celldatapopup.CellDataDialogState; import net.sourceforge.squirrel_sql.fw.datasetviewer.celldatapopup.CellDataUpdateInfo; import net.sourceforge.squirrel_sql.fw.datasetviewer.tablefind.GlobalFindRemoteControl; import net.sourceforge.squirrel_sql.fw.gui.GUIUtils; @@ -11,13 +18,6 @@ import net.sourceforge.squirrel_sql.fw.util.StringManager; import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory; -import javax.swing.BorderFactory; -import javax.swing.JScrollPane; -import javax.swing.JSplitPane; -import java.awt.event.ComponentAdapter; -import java.awt.event.ComponentEvent; -import java.beans.PropertyChangeEvent; - public class ResultDataSetAndCellDetailDisplayHandler { private static final StringManager s_stringMgr = StringManagerFactory.getStringManager(ResultDataSetAndCellDetailDisplayHandler.class); @@ -137,20 +137,19 @@ private void onRowColSelectionChanged(DataSetViewerTablePanel dataSetViewer, boo _rightCellDisplayPanel.setCurrentColumnDisplayDefinition(column.getColumnDisplayDefinition()); CellDisplayPanelContent pnlToDisplay; + + CellDataDialogState cellDataDialogState = new CellDataDialogState(column.getColumnDisplayDefinition().getColumnName(), column.getColumnDisplayDefinition(), value, false, dataSetViewer.isTableEditable(), dataSetViewer.getTable(), + rowLeadSelectionIndex, + colLeadSelectionIndex + ); if(DisplayMode.IMAGE == _rightCellDisplayPanel.getDisplayMode()) { - pnlToDisplay = new ResultImageDisplayPanel(column.getColumnDisplayDefinition(), - value, - dataSetViewer.isTableEditable(), - rowLeadSelectionIndex, - colLeadSelectionIndex, - () -> _rightCellDisplayPanel.getContentComponent().castToComponent().getSize(), - dataSetViewer.getTable()); + pnlToDisplay = new ResultImageDisplayPanel(cellDataDialogState, () -> _rightCellDisplayPanel.getContentComponent().castToComponent().getSize()); } else { CellDataColumnDataPanel panel = new CellDataColumnDataPanel(value, column.getColumnDisplayDefinition(), dataSetViewer.isTableEditable()); - panel.setCellDataUpdateInfo(new CellDataUpdateInfo(rowLeadSelectionIndex, colLeadSelectionIndex, dataSetViewer.getTable(), null)); + panel.setCellDataUpdateInfo(new CellDataUpdateInfo(cellDataDialogState, null)); pnlToDisplay = panel; } diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/columndisplaychoice/ResultImageDisplayPanel.java b/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/columndisplaychoice/ResultImageDisplayPanel.java index 81d7a53bb1..6251968aa3 100644 --- a/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/columndisplaychoice/ResultImageDisplayPanel.java +++ b/sql12/core/src/net/sourceforge/squirrel_sql/fw/datasetviewer/columndisplaychoice/ResultImageDisplayPanel.java @@ -23,7 +23,6 @@ import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.SwingConstants; - import net.sourceforge.squirrel_sql.client.Main; import net.sourceforge.squirrel_sql.client.gui.dnd.DropedFileExtractor; import net.sourceforge.squirrel_sql.client.resources.SquirrelResources; @@ -33,6 +32,7 @@ import net.sourceforge.squirrel_sql.fw.datasetviewer.cellcomponent.ClobDescriptor; import net.sourceforge.squirrel_sql.fw.datasetviewer.cellcomponent.DataTypeBlobProperties; import net.sourceforge.squirrel_sql.fw.datasetviewer.cellcomponent.DataTypeClobProperties; +import net.sourceforge.squirrel_sql.fw.datasetviewer.celldatapopup.CellDataDialogState; import net.sourceforge.squirrel_sql.fw.gui.GUIUtils; import net.sourceforge.squirrel_sql.fw.gui.MultipleLineLabel; import net.sourceforge.squirrel_sql.fw.util.StringManager; @@ -52,23 +52,17 @@ public class ResultImageDisplayPanel extends JPanel implements CellDisplayPanelC private BufferedImage _image; - public ResultImageDisplayPanel(ColumnDisplayDefinition cdd, - Object valueToDisplay, - boolean tableEditable, - int selRow, - int selCol, - ImageContainerSizeProvider imageContainerSizeProvider, - DataSetViewerTable table) + public ResultImageDisplayPanel(CellDataDialogState cellDataDialogState, ImageContainerSizeProvider imageContainerSizeProvider) { _imageContainerSizeProvider = imageContainerSizeProvider; setLayout(new BorderLayout(3,3)); add(_scrImage, BorderLayout.CENTER); - updateImageDisplay(cdd, valueToDisplay); + updateImageDisplay(cellDataDialogState.getColDispDef(), cellDataDialogState.getValueToDisplay()); - if(tableEditable) + if(cellDataDialogState.isEditable()) { - add(createUpdatePanel(selRow, selCol, table, cdd), BorderLayout.SOUTH); + add(createUpdatePanel(cellDataDialogState), BorderLayout.SOUTH); } } @@ -77,7 +71,7 @@ private void updateImageDisplay(ColumnDisplayDefinition cdd, Object valueToDispl _scrImage.setViewportView(getDisplayComponent(cdd, valueToDisplay)); } - private JPanel createUpdatePanel(int selRow, int selCol, DataSetViewerTable table, ColumnDisplayDefinition cdd) + private JPanel createUpdatePanel(CellDataDialogState state) { JPanel ret = new JPanel(new BorderLayout(0,3)); @@ -89,7 +83,11 @@ private JPanel createUpdatePanel(int selRow, int selCol, DataSetViewerTable tabl @Override public void drop(DropTargetDropEvent dtde) { - onDrop(dtde, selRow, selCol, table, cdd); + onDrop(dtde, + state.getEditableState().getRowIx(), + state.getEditableState().getColIx(), + state.getEditableState().getDatasetViewerTable(), + state.getColDispDef()); } }); @@ -103,7 +101,12 @@ public void drop(DropTargetDropEvent dtde) JButton btnDel = new JButton(Main.getApplication().getResources().getIcon(SquirrelResources.IImageNames.DELETE)); btnDel.setToolTipText(s_stringMgr.getString("ResultImageDisplayPanel.delete.image.from.database.tooltip")); - btnDel.addActionListener(e -> onDelete(selRow, selCol, table, cdd)); + + btnDel.addActionListener(e -> onDelete(state.getEditableState().getRowIx(), + state.getEditableState().getColIx(), + state.getEditableState().getDatasetViewerTable(), + state.getColDispDef())); + ret.add(GUIUtils.styleAsToolbarButton(btnDel), BorderLayout.EAST); return ret; } diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/ColumnsMonospacedCommand.java b/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/ColumnsMonospacedCommand.java new file mode 100644 index 0000000000..7fd278cd5e --- /dev/null +++ b/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/ColumnsMonospacedCommand.java @@ -0,0 +1,21 @@ +package net.sourceforge.squirrel_sql.fw.gui; + +import net.sourceforge.squirrel_sql.fw.datasetviewer.DataSetViewerTable; + +public class ColumnsMonospacedCommand +{ + private final DataSetViewerTable _table; + + public ColumnsMonospacedCommand(DataSetViewerTable table) + { + _table = table; + } + + public void execute() + { + int[] selectedColumns = _table.getSelectedColumns(); + + _table.getFontService().toggleMonoSpaced(selectedColumns); + + } +} diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/I18NStrings.properties b/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/I18NStrings.properties index afebf00130..5e7bbaa6f3 100644 --- a/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/I18NStrings.properties +++ b/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/I18NStrings.properties @@ -78,6 +78,7 @@ TablePopupMenu.ColorSelectedRows=Color selected rows TablePopupMenu.ColorSelectedCells=Color selected cells TablePopupMenu.GotoColor=Go to color TablePopupMenu.CopyColoredRowsToNewWindow=Copy colored rows to new window +TablePopupMenu.ToggleColumnsMonospaced=Toggle selected columns monospaced ChooserPreviewer.errorReadingFile=Error reading file {0}: {1} diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/TablePopupMenu.java b/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/TablePopupMenu.java index 8ae8233a8a..97f6256f0c 100755 --- a/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/TablePopupMenu.java +++ b/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/TablePopupMenu.java @@ -18,10 +18,22 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +import java.awt.Component; +import java.awt.event.ActionEvent; +import java.awt.event.MouseEvent; +import java.awt.print.PrinterJob; +import javax.swing.AbstractAction; +import javax.swing.Action; +import javax.swing.JCheckBoxMenuItem; +import javax.swing.JComponent; +import javax.swing.JFrame; +import javax.swing.JMenuItem; +import javax.swing.KeyStroke; import net.sourceforge.squirrel_sql.client.Main; import net.sourceforge.squirrel_sql.client.session.ISession; import net.sourceforge.squirrel_sql.client.session.SQLExecutionInfo; import net.sourceforge.squirrel_sql.client.session.action.dbdiff.tableselectiondiff.TableSelectionDiff; +import net.sourceforge.squirrel_sql.client.shortcut.ShortCutDescriptionReader; import net.sourceforge.squirrel_sql.fw.datasetviewer.DataSetViewerTable; import net.sourceforge.squirrel_sql.fw.datasetviewer.DataSetViewerTablePanel; import net.sourceforge.squirrel_sql.fw.datasetviewer.IDataSetUpdateableModel; @@ -60,18 +72,6 @@ import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory; import org.apache.commons.lang3.time.StopWatch; -import javax.swing.AbstractAction; -import javax.swing.Action; -import javax.swing.JCheckBoxMenuItem; -import javax.swing.JComponent; -import javax.swing.JFrame; -import javax.swing.JMenuItem; -import javax.swing.KeyStroke; -import java.awt.Component; -import java.awt.event.ActionEvent; -import java.awt.event.MouseEvent; -import java.awt.print.PrinterJob; - public class TablePopupMenu extends BasePopupMenu { @@ -106,6 +106,8 @@ public class TablePopupMenu extends BasePopupMenu private GotoColorMenuController _gotoColorMenuController = new GotoColorMenuController(); private CopyColoredRowsToNewWindowAction _copyColoredRowsToNewWindow = new CopyColoredRowsToNewWindowAction(); + private ToggleColumnsMonospacedAction _toggleColumnsMonospaced = new ToggleColumnsMonospacedAction(); + private ExportAction _export; private AdjustAllColWidthsAction _adjustAllColWidthsAction = new AdjustAllColWidthsAction(); private AlwaysAdjustAllColWidthsAction _alwaysAdjustAllColWidthsAction = new AlwaysAdjustAllColWidthsAction(); @@ -190,6 +192,8 @@ public TablePopupMenu(boolean allowEditing, add(_copyColoredRowsToNewWindow); addSeparator(); + add(_toggleColumnsMonospaced); + addSeparator(); _export = new ExportAction(DataSetViewerTablePanel.getDataModelImplementationDetails().getSQLExecutionInfo()); addAction(_export); @@ -245,7 +249,7 @@ public TablePopupMenu(boolean allowEditing, private void addMenuItem(JMenuItem menuItem) { String actionName = menuItem.getText(); - KeyStroke validKeyStroke = Main.getApplication().getShortcutManager().setAccelerator(menuItem, null, actionName); + KeyStroke validKeyStroke = Main.getApplication().getShortcutManager().setAccelerator(menuItem, null, actionName, ShortCutDescriptionReader.of(menuItem)); add(menuItem); if (null != validKeyStroke) @@ -272,7 +276,7 @@ private void addAction(Action action) private void addAction(Action action, KeyStroke defaultKeyStroke) { JMenuItem mnuAdded = add(action); - KeyStroke validKeyStroke = Main.getApplication().getShortcutManager().setAccelerator(mnuAdded, defaultKeyStroke, action); + KeyStroke validKeyStroke = Main.getApplication().getShortcutManager().setAccelerator(mnuAdded, defaultKeyStroke, action, ShortCutDescriptionReader.of(action)); ResourceUtil.trySetToolTip(mnuAdded, action); if (null != validKeyStroke) @@ -611,6 +615,19 @@ public void actionPerformed(ActionEvent evt) } } + private class ToggleColumnsMonospacedAction extends BaseAction + { + ToggleColumnsMonospacedAction() + { + super(s_stringMgr.getString("TablePopupMenu.ToggleColumnsMonospaced")); + } + + public void actionPerformed(ActionEvent evt) + { + new ColumnsMonospacedCommand(_dataSetViewerTablePanel.getTable()).execute(); + } + } + private class AdjustAllColWidthsAction extends BaseAction { diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/action/copyseparatedby/CopySeparatedByCtrl.java b/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/action/copyseparatedby/CopySeparatedByCtrl.java index 5dbe57abdb..861758cb3c 100644 --- a/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/action/copyseparatedby/CopySeparatedByCtrl.java +++ b/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/action/copyseparatedby/CopySeparatedByCtrl.java @@ -1,126 +1,150 @@ package net.sourceforge.squirrel_sql.fw.gui.action.copyseparatedby; +import javax.swing.JOptionPane; import net.sourceforge.squirrel_sql.fw.datasetviewer.DataSetViewerTable; import net.sourceforge.squirrel_sql.fw.gui.GUIUtils; import net.sourceforge.squirrel_sql.fw.props.Props; import net.sourceforge.squirrel_sql.fw.util.StringManager; import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory; - -import javax.swing.JOptionPane; +import org.apache.commons.lang3.StringUtils; public class CopySeparatedByCtrl { private static final StringManager s_stringMgr = StringManagerFactory.getStringManager(CopySeparatedByCtrl.class); + public static final String DEFAULT_CELL_SEPARATOR = ","; + private static final String PREF_KEY_COPYSEPARATEDBYCTRL_CELL_SEPARATOR = "Squirrel.copyseparatedbyctrl.cell.separator"; + private static final String PREF_KEY_JUST_CONCAT_CELLS = "Squirrel.copyseparatedbyctrl.just.concat.cells"; private static final String PREF_KEY_COPYSEPARATEDBYCTRL_CELL_DELIMITER = "Squirrel.copyseparatedbyctrl.cell.delimiter"; private static final String PREF_KEY_COPYSEPARATEDBYCTRL_INCLUDE_HEADERS = "Squirrel.copyseparatedbyctrl.include.headers"; private static final String PREF_KEY_COPYSEPARATEDBYCTRL_ROW_SEPARATOR = "Squirrel.copyseparatedbyctrl.row.separator"; private static final String PREF_KEY_COPYSEPARATEDBYCTRL_ROW_PREFERED_LINE_LEN = "Squirrel.copyseparatedbyctrl.prefered.line.len"; - private CopySeparatedByDlg _copySeparatedByDlg; + private CopySeparatedByDlg _dlg; private boolean _enableRowSeparator; private String _cellSeparator = ""; + private boolean _justConcatCells; private String _cellDelimiter = ""; private boolean _includeHeaders; private String _rowSeparator = ""; private int _preferredLineLength; private boolean _isOk; + private boolean _inCellDataPopup; public CopySeparatedByCtrl(DataSetViewerTable table, boolean enableRowSeparator) { - _copySeparatedByDlg = new CopySeparatedByDlg(GUIUtils.getOwningFrame(table)); + _dlg = new CopySeparatedByDlg(GUIUtils.getOwningFrame(table)); _enableRowSeparator = enableRowSeparator; - _copySeparatedByDlg.txtCellSeparator.setText(Props.getString(PREF_KEY_COPYSEPARATEDBYCTRL_CELL_SEPARATOR, ",")); - _copySeparatedByDlg.txtCellDelimiter.setText(Props.getString(PREF_KEY_COPYSEPARATEDBYCTRL_CELL_DELIMITER, "")); + _dlg.txtCellSeparator.setText(Props.getString(PREF_KEY_COPYSEPARATEDBYCTRL_CELL_SEPARATOR, DEFAULT_CELL_SEPARATOR)); + _dlg.txtCellDelimiter.setText(Props.getString(PREF_KEY_COPYSEPARATEDBYCTRL_CELL_DELIMITER, "")); + + _dlg.txtLineLength.setInt(Props.getInt(PREF_KEY_COPYSEPARATEDBYCTRL_ROW_PREFERED_LINE_LEN, 100)); + _dlg.txtRowSeparator.setText(Props.getString(PREF_KEY_COPYSEPARATEDBYCTRL_ROW_SEPARATOR, "\\n")); - _copySeparatedByDlg.txtLineLength.setInt(Props.getInt(PREF_KEY_COPYSEPARATEDBYCTRL_ROW_PREFERED_LINE_LEN, 100)); - _copySeparatedByDlg.txtRowSeparator.setText(Props.getString(PREF_KEY_COPYSEPARATEDBYCTRL_ROW_SEPARATOR, "\\n")); + _dlg.chkIncludeHeaders.setSelected(Props.getBoolean(PREF_KEY_COPYSEPARATEDBYCTRL_INCLUDE_HEADERS, false)); + _dlg.chkIncludeHeaders.addActionListener(e -> updateEnabled()); - _copySeparatedByDlg.chkIncludeHeaders.setSelected(Props.getBoolean(PREF_KEY_COPYSEPARATEDBYCTRL_INCLUDE_HEADERS, false)); + _dlg.chkJustConcatCells.setSelected(Props.getBoolean(PREF_KEY_JUST_CONCAT_CELLS, false)); + _dlg.chkJustConcatCells.addActionListener(e -> updateEnabled()); - _copySeparatedByDlg.chkIncludeHeaders.addActionListener(e -> updateEnabled()); updateEnabled(); - _copySeparatedByDlg.btnOk.addActionListener(e -> onOk()); - _copySeparatedByDlg.btnCancel.addActionListener(e -> onCancel()); + _dlg.btnOk.addActionListener(e -> onOk()); + _dlg.btnCancel.addActionListener(e -> onCancel()); + _dlg.btnInCellDataPopup.addActionListener(e -> onInCellDataPopup()); - GUIUtils.forceFocus(_copySeparatedByDlg.txtCellSeparator); + GUIUtils.forceFocus(_dlg.txtCellSeparator); - _copySeparatedByDlg.setVisible(true); + _dlg.setVisible(true); } private void updateEnabled() { - _copySeparatedByDlg.txtRowSeparator.setEnabled(true); - _copySeparatedByDlg._lblRowSeparator.setEnabled(true); + _dlg.txtCellSeparator.setEnabled(!_dlg.chkJustConcatCells.isSelected()); + _dlg.lblCellSeparator.setEnabled(!_dlg.chkJustConcatCells.isSelected()); + + _dlg.txtRowSeparator.setEnabled(true); + _dlg.lblRowSeparator.setEnabled(true); - _copySeparatedByDlg.txtLineLength.setEnabled(true); - _copySeparatedByDlg.lblPreferredLineLength.setEnabled(true); + _dlg.txtLineLength.setEnabled(true); + _dlg.lblPreferredLineLength.setEnabled(true); - if(false == _enableRowSeparator || _copySeparatedByDlg.chkIncludeHeaders.isSelected()) + if(false == _enableRowSeparator || _dlg.chkIncludeHeaders.isSelected()) { - _copySeparatedByDlg.txtRowSeparator.setEnabled(false); - _copySeparatedByDlg._lblRowSeparator.setEnabled(false); + _dlg.txtRowSeparator.setEnabled(false); + _dlg.lblRowSeparator.setEnabled(false); //_copySeparatedByDlg.txtRowSeparator.setText(null); } - if(_copySeparatedByDlg.chkIncludeHeaders.isSelected()) + if( _dlg.chkIncludeHeaders.isSelected()) { - _copySeparatedByDlg.txtLineLength.setEnabled(false); - _copySeparatedByDlg.lblPreferredLineLength.setEnabled(false); + _dlg.txtLineLength.setEnabled(false); + _dlg.lblPreferredLineLength.setEnabled(false); } } private void onCancel() { - _copySeparatedByDlg.setVisible(false); - _copySeparatedByDlg.dispose(); + _dlg.setVisible(false); + _dlg.dispose(); } + private void onInCellDataPopup() + { + onOk(); + + if(_isOk) + { + _inCellDataPopup = true; + } + } + + + private void onOk() { - if(0 >= _copySeparatedByDlg.txtLineLength.getInt()) + if( 0 > _dlg.txtLineLength.getInt()) { - JOptionPane.showConfirmDialog(_copySeparatedByDlg, s_stringMgr.getString("CopySeparatedByCtrl.invalid.line.length")); + JOptionPane.showConfirmDialog(_dlg, s_stringMgr.getString("CopySeparatedByCtrl.invalid.line.length")); return; } - - String text = ""; - if (null != _copySeparatedByDlg.txtCellSeparator.getText()) + String text = DEFAULT_CELL_SEPARATOR; + if ( null != _dlg.txtCellSeparator.getText()) { - text = _copySeparatedByDlg.txtCellSeparator.getText(); + text = _dlg.txtCellSeparator.getText(); } Props.putString(PREF_KEY_COPYSEPARATEDBYCTRL_CELL_SEPARATOR, text); _cellSeparator = doReplacements(text); + Props.putBoolean(PREF_KEY_JUST_CONCAT_CELLS, _dlg.chkJustConcatCells.isSelected()); + _justConcatCells = _dlg.chkJustConcatCells.isSelected(); String cellDelim = ""; - if (null != _copySeparatedByDlg.txtCellDelimiter.getText()) + if(false == StringUtils.isBlank(_dlg.txtCellDelimiter.getText())) { - cellDelim = _copySeparatedByDlg.txtCellDelimiter.getText(); + cellDelim = _dlg.txtCellDelimiter.getText(); } Props.putString(PREF_KEY_COPYSEPARATEDBYCTRL_CELL_DELIMITER, cellDelim); _cellDelimiter = cellDelim; + Props.putBoolean(PREF_KEY_COPYSEPARATEDBYCTRL_INCLUDE_HEADERS, _dlg.chkIncludeHeaders.isSelected()); + _includeHeaders = _dlg.chkIncludeHeaders.isSelected(); - Props.putBoolean(PREF_KEY_COPYSEPARATEDBYCTRL_INCLUDE_HEADERS, _copySeparatedByDlg.chkIncludeHeaders.isSelected()); - _includeHeaders = _copySeparatedByDlg.chkIncludeHeaders.isSelected(); - - Props.putInt(PREF_KEY_COPYSEPARATEDBYCTRL_ROW_PREFERED_LINE_LEN, _copySeparatedByDlg.txtLineLength.getInt()); - _preferredLineLength = _copySeparatedByDlg.txtLineLength.getInt(); + Props.putInt(PREF_KEY_COPYSEPARATEDBYCTRL_ROW_PREFERED_LINE_LEN, _dlg.txtLineLength.getInt()); + _preferredLineLength = _dlg.txtLineLength.getInt(); - if(_enableRowSeparator && null != _copySeparatedByDlg.txtRowSeparator.getText()) + if(_enableRowSeparator && null != _dlg.txtRowSeparator.getText()) { text = "\\n"; - if (null != _copySeparatedByDlg.txtRowSeparator.getText()) + if ( null != _dlg.txtRowSeparator.getText()) { - text = _copySeparatedByDlg.txtRowSeparator.getText(); + text = _dlg.txtRowSeparator.getText(); } Props.putString(PREF_KEY_COPYSEPARATEDBYCTRL_ROW_SEPARATOR, text); @@ -130,8 +154,8 @@ private void onOk() _isOk = true; - _copySeparatedByDlg.setVisible(false); - _copySeparatedByDlg.dispose(); + _dlg.setVisible(false); + _dlg.dispose(); } private String doReplacements(String text) @@ -145,6 +169,10 @@ public String getCellSeparator() return _cellSeparator; } + public boolean isJustConcatCells() + { + return _justConcatCells; + } public String getRowSeparator() { @@ -170,4 +198,9 @@ public boolean isOk() { return _isOk; } + + public boolean isInCellDataPopup() + { + return _inCellDataPopup; + } } diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/action/copyseparatedby/CopySeparatedByDlg.java b/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/action/copyseparatedby/CopySeparatedByDlg.java index 2b586fe1bb..57cea64e0a 100644 --- a/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/action/copyseparatedby/CopySeparatedByDlg.java +++ b/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/action/copyseparatedby/CopySeparatedByDlg.java @@ -1,42 +1,44 @@ package net.sourceforge.squirrel_sql.fw.gui.action.copyseparatedby; -import net.sourceforge.squirrel_sql.fw.gui.GUIUtils; -import net.sourceforge.squirrel_sql.fw.gui.IntegerField; -import net.sourceforge.squirrel_sql.fw.gui.MultipleLineLabel; -import net.sourceforge.squirrel_sql.fw.gui.buttontabcomponent.SmallToolTipInfoButton; -import net.sourceforge.squirrel_sql.fw.util.StringManager; -import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory; - +import java.awt.BorderLayout; +import java.awt.Frame; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.Frame; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; +import net.sourceforge.squirrel_sql.fw.gui.GUIUtils; +import net.sourceforge.squirrel_sql.fw.gui.IntegerField; +import net.sourceforge.squirrel_sql.fw.gui.MultipleLineLabel; +import net.sourceforge.squirrel_sql.fw.gui.buttontabcomponent.SmallToolTipInfoButton; +import net.sourceforge.squirrel_sql.fw.util.StringManager; +import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory; public class CopySeparatedByDlg extends JDialog { private static final StringManager s_stringMgr = StringManagerFactory.getStringManager(CopySeparatedByDlg.class); + JLabel lblCellSeparator = new JLabel(s_stringMgr.getString("CopySeparatedByDlg.cell.separator")); JTextField txtCellSeparator = new JTextField(); + JCheckBox chkJustConcatCells = new JCheckBox(s_stringMgr.getString("CopySeparatedByDlg.justConcat.cells")); + JTextField txtCellDelimiter = new JTextField(); JCheckBox chkIncludeHeaders = new JCheckBox(s_stringMgr.getString("CopySeparatedByDlg.include.column.headers")); - JLabel _lblRowSeparator = new JLabel(s_stringMgr.getString("CopySeparatedByDlg.row.separator")); + JLabel lblRowSeparator = new JLabel(s_stringMgr.getString("CopySeparatedByDlg.row.separator")); JTextField txtRowSeparator = new JTextField(); JLabel lblPreferredLineLength = new JLabel(s_stringMgr.getString("CopySeparatedByDlg.prefered.line.length")); - IntegerField txtLineLength = new IntegerField(6); + IntegerField txtLineLength = new IntegerField(8); JButton btnOk = new JButton(s_stringMgr.getString("CopySeparatedByDlg.cell.ok")); JButton btnCancel = new JButton(s_stringMgr.getString("CopySeparatedByDlg.cell.cancel")); + JButton btnInCellDataPopup = new JButton(s_stringMgr.getString("CopySeparatedByDlg.cell.show.in.cell.data.popup")); public CopySeparatedByDlg(Frame owningFrame) @@ -53,8 +55,8 @@ public CopySeparatedByDlg(Frame owningFrame) gbc = new GridBagConstraints(0, 1 , 1, 1, 0,0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(0,5,5,5), 0,0); getContentPane().add(createControlsPanel(), gbc); - gbc = new GridBagConstraints(0, 2 , 1, 1, 0,1, GridBagConstraints.SOUTHWEST, GridBagConstraints.NONE, new Insets(0,5,5,5), 0,0); - getContentPane().add(createButtoPanel(), gbc); + gbc = new GridBagConstraints(0, 2 , 1, 1, 0,1, GridBagConstraints.SOUTHWEST, GridBagConstraints.HORIZONTAL, new Insets(0,5,5,5), 0,0); + getContentPane().add(createButtonPanel(), gbc); setSize(350, 350); @@ -65,7 +67,7 @@ public CopySeparatedByDlg(Frame owningFrame) getRootPane().setDefaultButton(btnOk); } - private JPanel createButtoPanel() + private JPanel createButtonPanel() { JPanel ret = new JPanel(new GridBagLayout()); @@ -77,6 +79,11 @@ private JPanel createButtoPanel() gbc = new GridBagConstraints(1, 0 , 1, 1, 0,0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(5,5,5,5), 0,0); ret.add(btnCancel, gbc); + gbc = new GridBagConstraints(2, 0 , 1, 1, 1,0, GridBagConstraints.NORTHEAST, GridBagConstraints.HORIZONTAL, new Insets(5,0,5,5), 0,0); + ret.add(new JPanel(), gbc); + + gbc = new GridBagConstraints(3, 0 , 1, 1, 0,0, GridBagConstraints.NORTHEAST, GridBagConstraints.NONE, new Insets(5,0,5,5), 0,0); + ret.add(btnInCellDataPopup, gbc); return ret; } @@ -87,40 +94,45 @@ private JPanel createControlsPanel() GridBagConstraints gbc; - gbc = new GridBagConstraints(0, 0 , 1, 1, 0,0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(5,5,5,5), 0,0); - ret.add(new JLabel(s_stringMgr.getString("CopySeparatedByDlg.cell.separator")), gbc); + gbc = new GridBagConstraints(0, 0 , 1, 1, 0,0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(5,5,0,0), 0,0); + ret.add(lblCellSeparator, gbc); - gbc = new GridBagConstraints(1, 0 , 1, 1, 1,0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(5,5,5,5), 0,0); - //txtCellSeparator.setPreferredSize(new Dimension(70, txtCellSeparator.getPreferredSize().height)); + gbc = new GridBagConstraints(1, 0 , 1, 1, 1,0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(5,5,0,5), 0,0); ret.add(txtCellSeparator, gbc); - gbc = new GridBagConstraints(0, 1 , 1, 1, 0,0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5,5,5,5), 0,0); + gbc = new GridBagConstraints(0, 1 , 2, 1, 0,0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(0,20,0,0), 0,0); + ret.add(chkJustConcatCells, gbc); + + + gbc = new GridBagConstraints(0, 2 , 1, 1, 0,0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(15,5,0,5), 0,0); ret.add(createCellDelimiterLabelPanel(), gbc); - gbc = new GridBagConstraints(1, 1 , 1, 1, 1,0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5,5,5,5), 0,0); + gbc = new GridBagConstraints(1, 2 , 1, 1, 1,0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(15,5,0,5), 0,0); ret.add(txtCellDelimiter, gbc); - gbc = new GridBagConstraints(0, 2 , 2, 1, 1,0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(15,5,0,5), 0,0); + + gbc = new GridBagConstraints(0, 3 , 2, 1, 1,0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(15,5,0,5), 0,0); ret.add(GUIUtils.createHorizontalSeparatorPanel(), gbc); - gbc = new GridBagConstraints(0, 3 , 2, 1, 1,0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(5,5,5,5), 0,0); + gbc = new GridBagConstraints(0, 4 , 2, 1, 1,0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(5,5,0,5), 0,0); ret.add(chkIncludeHeaders, gbc); - gbc = new GridBagConstraints(0, 4 , 1, 1, 0,0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(5,5,5,5), 0,0); - ret.add(_lblRowSeparator, gbc); + gbc = new GridBagConstraints(0, 5 , 1, 1, 0,0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(5,5,0,0), 0,0); + ret.add(lblRowSeparator, gbc); - gbc = new GridBagConstraints(1, 4 , 1, 1, 1,0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(5,5,5,5), 0,0); + gbc = new GridBagConstraints(1, 5 , 1, 1, 1,0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(5,5,0,5), 0,0); //txtRowSeparator.setPreferredSize(new Dimension(70, txtRowSeparator.getPreferredSize().height)); ret.add(txtRowSeparator, gbc); - gbc = new GridBagConstraints(0, 5 , 1, 1, 0,0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(5,5,5,5), 0,0); - ret.add(lblPreferredLineLength, gbc); + gbc = new GridBagConstraints(0, 6 , 1, 1, 0,0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(5,5,0,0), 0,0); + ret.add(createPreferredLineLengthLabelPanel(), gbc); - gbc = new GridBagConstraints(1, 5 , 1, 1, 0,0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(5,5,5,5), 0,0); - txtLineLength.setPreferredSize(new Dimension(70, txtLineLength.getPreferredSize().height)); + gbc = new GridBagConstraints(1, 6 , 1, 1, 0,0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(5,5,0,5), 0,0); + GUIUtils.setPreferredWidth(txtLineLength, 100); + GUIUtils.setMinimumWidth(txtLineLength, 100); ret.add(txtLineLength, gbc); @@ -141,4 +153,12 @@ private JPanel createCellDelimiterLabelPanel() return ret; } + + private JPanel createPreferredLineLengthLabelPanel() + { + JPanel ret = new JPanel(new BorderLayout()); + ret.add(lblPreferredLineLength, BorderLayout.CENTER); + ret.add(new SmallToolTipInfoButton(s_stringMgr.getString("CopySeparatedByDlg.preferred.line.length.info")).getButton(), BorderLayout.EAST); + return ret; + } } diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/action/copyseparatedby/I18NStrings.properties b/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/action/copyseparatedby/I18NStrings.properties index ba75cdacb6..c1f96c7702 100644 --- a/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/action/copyseparatedby/I18NStrings.properties +++ b/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/action/copyseparatedby/I18NStrings.properties @@ -18,4 +18,11 @@ CopySeparatedByDlg.description=Configure separators for cells and rows. If the s CopySeparatedByDlg.prefered.line.length=Preferred line length -CopySeparatedByCtrl.invalid.line.length=Please enter a valid line length. \ No newline at end of file +CopySeparatedByCtrl.invalid.line.length=Please enter a valid line length. +CopySeparatedByDlg.preferred.line.length.info=0 means no line length limit. + +CopySeparatedByDlg.justConcat.cells=Just concatenate cell values + +CopySeparatedByDlg.cell.show.in.cell.data.popup=To cell data popup + +TableCopySeparatedByCommand.cell.data.dialog.title="Copy result" \ No newline at end of file diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/action/copyseparatedby/TableCopySeparatedByCommand.java b/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/action/copyseparatedby/TableCopySeparatedByCommand.java index 6ad71e117f..20abd9b532 100644 --- a/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/action/copyseparatedby/TableCopySeparatedByCommand.java +++ b/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/action/copyseparatedby/TableCopySeparatedByCommand.java @@ -2,7 +2,10 @@ import net.sourceforge.squirrel_sql.fw.datasetviewer.DataSetViewerTable; import net.sourceforge.squirrel_sql.fw.datasetviewer.cellcomponent.BaseDataTypeComponent; +import net.sourceforge.squirrel_sql.fw.datasetviewer.celldatapopup.CellDataDialogHandler; +import net.sourceforge.squirrel_sql.fw.datasetviewer.celldatapopup.CellDataDialogState; import net.sourceforge.squirrel_sql.fw.gui.ClipboardUtil; +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.StringUtilities; @@ -32,6 +35,11 @@ public void execute() String cellSeparator = copySeparatedByCtrl.getCellSeparator(); + if(copySeparatedByCtrl.isJustConcatCells()) + { + cellSeparator = ""; + } + String rowSeparator = "\n"; if(false == copySeparatedByCtrl.isIncludeHeaders()) @@ -47,8 +55,6 @@ public void execute() int preferredLineLength = copySeparatedByCtrl.getPreferredLineLength(); - - int nbrSelRows = _table.getSelectedRowCount(); int[] selRows = _table.getSelectedRows(); int[] selCols = _table.getSelectedColumns(); @@ -93,7 +99,9 @@ public void execute() { sb.append(cellSeparator); - if(false == copySeparatedByCtrl.isIncludeHeaders() && preferredLineLength < getDistToLastNewLine(sb)) + if( false == copySeparatedByCtrl.isIncludeHeaders() + && 0 < preferredLineLength + && preferredLineLength < getDistToLastNewLine(sb)) { sb.append("\n"); } @@ -107,10 +115,13 @@ public void execute() } } - if(cellObj instanceof String && -1 < ((String)cellObj).indexOf('\n')) + if( false == copySeparatedByCtrl.isJustConcatCells() + && cellObj instanceof String cellStr + && -1 < indexOfFirstLineBreakChar(cellStr) ) { - int lineBreakPos = ((String)cellObj).indexOf('\n'); - sb.append(wrapCellDelimiter(cellObj, copySeparatedByCtrl.getCellDelimiter()), 0, lineBreakPos); + int lineBreakPos = indexOfFirstLineBreakChar(cellStr); + cellStr = cellStr.substring(0, lineBreakPos); + sb.append(wrapCellDelimiter(cellStr, copySeparatedByCtrl.getCellDelimiter())); } else if(null == cellObj) { @@ -123,7 +134,38 @@ else if(null == cellObj) } } - ClipboardUtil.copyToClip(sb); + if(copySeparatedByCtrl.isInCellDataPopup()) + { + CellDataDialogState cellDataDialogState = + new CellDataDialogState(s_stringMgr.getString("TableCopySeparatedByCommand.cell.data.dialog.title"), sb.toString()); + + CellDataDialogHandler.createAndShowCellDataDialog(cellDataDialogState, GUIUtils.getOwningWindow(_table)); + } + else + { + ClipboardUtil.copyToClip(sb); + } + } + + private static int indexOfFirstLineBreakChar(String cellStr) + { + int indexOfNewLine = cellStr.indexOf('\n'); + int indexOfCarriageReturn = cellStr.indexOf('\r'); + + if(-1 == indexOfNewLine && -1 == indexOfCarriageReturn) + { + return -1; + } + else if(-1 == indexOfNewLine) + { + return indexOfCarriageReturn; + } + else if(-1 == indexOfCarriageReturn) + { + return indexOfNewLine; + } + + return Math.min(indexOfCarriageReturn, indexOfNewLine); } private String wrapCellDelimiter(Object cellContent, String cellDelimiter) diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/stdtextpopup/TextActionHelper.java b/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/stdtextpopup/TextActionHelper.java index 64837fc8be..3b83fb73e2 100644 --- a/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/stdtextpopup/TextActionHelper.java +++ b/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/stdtextpopup/TextActionHelper.java @@ -1,10 +1,10 @@ package net.sourceforge.squirrel_sql.fw.gui.stdtextpopup; -import net.sourceforge.squirrel_sql.client.Main; - import javax.swing.Action; import javax.swing.KeyStroke; import javax.swing.text.JTextComponent; +import net.sourceforge.squirrel_sql.client.Main; +import net.sourceforge.squirrel_sql.client.shortcut.ShortCutDescriptionReader; public class TextActionHelper { @@ -36,6 +36,6 @@ public void initKeyStroke(JTextComponent comp) public static KeyStroke getKeyStroke(String defaultEditorKitActionName, KeyStroke defaultKeyStroke) { - return KeyStroke.getKeyStroke(Main.getApplication().getShortcutManager().registerAccelerator(defaultEditorKitActionName, defaultKeyStroke)); + return KeyStroke.getKeyStroke(Main.getApplication().getShortcutManager().registerAccelerator(defaultEditorKitActionName, defaultKeyStroke, ShortCutDescriptionReader.of())); } } diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/table/ButtonTableHeader.java b/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/table/ButtonTableHeader.java index 509d2c1a2f..d988cefca1 100644 --- a/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/table/ButtonTableHeader.java +++ b/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/table/ButtonTableHeader.java @@ -18,6 +18,22 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +import java.awt.Component; +import java.awt.Cursor; +import java.awt.FontMetrics; +import java.awt.Rectangle; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseMotionListener; +import java.awt.geom.Rectangle2D; +import java.util.ArrayList; +import javax.swing.JTable; +import javax.swing.SwingUtilities; +import javax.swing.event.TableModelListener; +import javax.swing.table.JTableHeader; +import javax.swing.table.TableCellRenderer; +import javax.swing.table.TableColumn; +import javax.swing.table.TableModel; import net.sourceforge.squirrel_sql.client.Main; import net.sourceforge.squirrel_sql.fw.datasetviewer.RowNumberTableColumn; import net.sourceforge.squirrel_sql.fw.datasetviewer.cellcomponent.SquirrelTableCellRenderer; @@ -26,18 +42,6 @@ import net.sourceforge.squirrel_sql.fw.util.StringManager; import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory; -import javax.swing.*; -import javax.swing.event.TableModelListener; -import javax.swing.table.JTableHeader; -import javax.swing.table.TableCellRenderer; -import javax.swing.table.TableColumn; -import javax.swing.table.TableModel; -import java.awt.*; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.event.MouseMotionListener; -import java.awt.geom.Rectangle2D; - public class ButtonTableHeader extends JTableHeader { private static final StringManager s_stringMgr = StringManagerFactory.getStringManager(ButtonTableHeader.class); @@ -54,7 +58,7 @@ public class ButtonTableHeader extends JTableHeader private TableAccessForHeader _tableAccess; - private ButtonTableHeaderDraggedColumnListener _buttonTableHeaderDraggedColumnListener; + private java.util.List _buttonTableHeaderDragListeners = new ArrayList<>(); /** * Constructor for ButtonTableHeader. @@ -284,9 +288,15 @@ private void adjustColWidth(int colIx, boolean includeColHeaders) } - public void setDraggedColumnListener(ButtonTableHeaderDraggedColumnListener buttonTableHeaderDraggedColumnListener) + public void addColumnDragListener(ButtonTableHeaderColumnDragListener buttonTableHeaderColumnDragListener) + { + _buttonTableHeaderDragListeners.remove(buttonTableHeaderColumnDragListener); + _buttonTableHeaderDragListeners.add(buttonTableHeaderColumnDragListener); + } + + public void removeColumnDragListener(ButtonTableHeaderColumnDragListener buttonTableHeaderColumnDragListener) { - _buttonTableHeaderDraggedColumnListener = buttonTableHeaderDraggedColumnListener; + _buttonTableHeaderDragListeners.remove(buttonTableHeaderColumnDragListener); } class HeaderListener extends MouseAdapter implements MouseMotionListener @@ -376,9 +386,9 @@ public void mouseReleased(MouseEvent e) } else { - if(null != _buttonTableHeaderDraggedColumnListener) + for(ButtonTableHeaderColumnDragListener l : _buttonTableHeaderDragListeners.toArray(new ButtonTableHeaderColumnDragListener[0])) { - _buttonTableHeaderDraggedColumnListener.columnDragged(); + l.columnDragged(); } } _mouseState.setDragged(false); diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/table/ButtonTableHeaderColumnDragListener.java b/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/table/ButtonTableHeaderColumnDragListener.java new file mode 100644 index 0000000000..b1a9c4f025 --- /dev/null +++ b/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/table/ButtonTableHeaderColumnDragListener.java @@ -0,0 +1,7 @@ +package net.sourceforge.squirrel_sql.fw.gui.table; + +@FunctionalInterface +public interface ButtonTableHeaderColumnDragListener +{ + void columnDragged(); +} diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/table/ButtonTableHeaderDraggedColumnListener.java b/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/table/ButtonTableHeaderDraggedColumnListener.java deleted file mode 100644 index 88183060c6..0000000000 --- a/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/table/ButtonTableHeaderDraggedColumnListener.java +++ /dev/null @@ -1,7 +0,0 @@ -package net.sourceforge.squirrel_sql.fw.gui.table; - -@FunctionalInterface -public interface ButtonTableHeaderDraggedColumnListener -{ - public void columnDragged(); -} diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/fw/resources/Resources.java b/sql12/core/src/net/sourceforge/squirrel_sql/fw/resources/Resources.java index ba4f9f5d5e..405ee3811c 100755 --- a/sql12/core/src/net/sourceforge/squirrel_sql/fw/resources/Resources.java +++ b/sql12/core/src/net/sourceforge/squirrel_sql/fw/resources/Resources.java @@ -19,6 +19,16 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +import java.net.URL; +import java.util.MissingResourceException; +import javax.swing.Action; +import javax.swing.Icon; +import javax.swing.ImageIcon; +import javax.swing.JCheckBoxMenuItem; +import javax.swing.JMenu; +import javax.swing.JMenuItem; +import javax.swing.JPopupMenu; +import javax.swing.KeyStroke; import net.sourceforge.squirrel_sql.client.Main; import net.sourceforge.squirrel_sql.client.shortcut.ShortCutReader; import net.sourceforge.squirrel_sql.fw.gui.GUIUtils; @@ -28,10 +38,7 @@ import net.sourceforge.squirrel_sql.fw.util.Utilities; import net.sourceforge.squirrel_sql.fw.util.log.ILogger; import net.sourceforge.squirrel_sql.fw.util.log.LoggerController; - -import javax.swing.*; -import java.net.URL; -import java.util.MissingResourceException; +import org.apache.commons.lang3.StringUtils; public abstract class Resources implements IResources { @@ -304,6 +311,30 @@ public String getActionName(Class actionClass) return getResourceString(getActionKey(actionClass), ActionProperties.NAME); } + public String getTooltipFromResource(Class actionClass) + { + String ret = getResourceString(getActionKey(actionClass), ActionProperties.TOOLTIP); + if(false == StringUtils.isBlank(ret)) + { + return ret; + } + + return null; + } + + public String getTooltipFromResource(String fullResourceString) + { + String ret = getResourceString(fullResourceString, ActionProperties.TOOLTIP); + + if(false == StringUtils.isBlank(ret)) + { + return ret; + } + + return null; + } + + private String getActionKey(Class actionClass) { final String actionClassName = actionClass.getName(); diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/fw/sql/databasemetadata/ProcedureAndFunctionMetaData.java b/sql12/core/src/net/sourceforge/squirrel_sql/fw/sql/databasemetadata/ProcedureAndFunctionMetaData.java index c9b1ff76f4..7a94d37db6 100644 --- a/sql12/core/src/net/sourceforge/squirrel_sql/fw/sql/databasemetadata/ProcedureAndFunctionMetaData.java +++ b/sql12/core/src/net/sourceforge/squirrel_sql/fw/sql/databasemetadata/ProcedureAndFunctionMetaData.java @@ -1,18 +1,21 @@ package net.sourceforge.squirrel_sql.fw.sql.databasemetadata; -import net.sourceforge.squirrel_sql.fw.datasetviewer.BlockMode; -import net.sourceforge.squirrel_sql.fw.dialects.DialectFactory; -import net.sourceforge.squirrel_sql.fw.dialects.DialectType; -import net.sourceforge.squirrel_sql.fw.sql.*; -import net.sourceforge.squirrel_sql.fw.util.log.ILogger; -import net.sourceforge.squirrel_sql.fw.util.log.LoggerController; - import java.sql.DatabaseMetaData; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import net.sourceforge.squirrel_sql.fw.datasetviewer.BlockMode; +import net.sourceforge.squirrel_sql.fw.dialects.DialectFactory; +import net.sourceforge.squirrel_sql.fw.dialects.DialectType; +import net.sourceforge.squirrel_sql.fw.sql.IProcedureInfo; +import net.sourceforge.squirrel_sql.fw.sql.ProcedureInfo; +import net.sourceforge.squirrel_sql.fw.sql.ProgressCallBack; +import net.sourceforge.squirrel_sql.fw.sql.ResultSetReader; +import net.sourceforge.squirrel_sql.fw.sql.SQLUtilities; +import net.sourceforge.squirrel_sql.fw.util.log.ILogger; +import net.sourceforge.squirrel_sql.fw.util.log.LoggerController; public class ProcedureAndFunctionMetaData { @@ -30,7 +33,7 @@ static List getProcedureInfos(String catalog, String schemaPatte int count = 0; try { - final int[] cols = new int[] + final int[] columnsToReadFomMetaDataResult = new int[] { 1, // PROCEDURE_CAT 2, // PROCEDURE_SCHEM @@ -40,7 +43,7 @@ static List getProcedureInfos(String catalog, String schemaPatte }; DialectType dialectType = DialectFactory.getDialectType(md); - final ResultSetReader rdr = new ResultSetReader(rs, cols, dialectType); + final ResultSetReader rdr = new ResultSetReader(rs, columnsToReadFomMetaDataResult, dialectType); Object[] row; while ((row = rdr.readRow(BlockMode.INDIFFERENT)) != null) { diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/fw/sql/databasemetadata/SQLDatabaseMetaData.java b/sql12/core/src/net/sourceforge/squirrel_sql/fw/sql/databasemetadata/SQLDatabaseMetaData.java index f07ede36e1..bb14a96705 100644 --- a/sql12/core/src/net/sourceforge/squirrel_sql/fw/sql/databasemetadata/SQLDatabaseMetaData.java +++ b/sql12/core/src/net/sourceforge/squirrel_sql/fw/sql/databasemetadata/SQLDatabaseMetaData.java @@ -33,6 +33,7 @@ import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; + import net.sourceforge.squirrel_sql.client.session.schemainfo.synonym.SynonymHandler; import net.sourceforge.squirrel_sql.fw.datasetviewer.BlockMode; import net.sourceforge.squirrel_sql.fw.datasetviewer.DataSetException; @@ -1232,7 +1233,7 @@ public synchronized IDataSet getColumnPrivilegesDataSet(ITableInfo ti, int[] col rs = md.getColumnPrivileges(ti.getCatalogName(), ti.getSchemaName(), ti.getSimpleName(), columns); ResultSetDataSet rsds = new ResultSetDataSet(); - rsds.setResultSet(rs, columnIndices, computeWidths, DialectFactory.getDialectType(this)); + rsds.readDataFromJdbcResultSetForDatabaseMetaData(rs, columnIndices, computeWidths, DialectFactory.getDialectType(this)); return rsds; } catch (SQLException e) @@ -1267,7 +1268,7 @@ public synchronized IDataSet getExportedKeysDataSet(ITableInfo ti) throws DataSe privateGetJDBCMetaData().getExportedKeys(ti.getCatalogName(), ti.getSchemaName(), ti.getSimpleName()); ResultSetDataSet rsds = new ResultSetDataSet(); - rsds.setResultSet(rs, null, true, DialectFactory.getDialectType(this)); + rsds.readDataFromJdbcResultSetForDatabaseMetaData(rs, null, true, DialectFactory.getDialectType(this)); return rsds; } catch (SQLException e) @@ -1326,7 +1327,7 @@ public synchronized IDataSet getImportedKeysDataSet(ITableInfo ti) throws DataSe { rs = privateGetJDBCMetaData().getImportedKeys(ti.getCatalogName(), ti.getSchemaName(), ti.getSimpleName()); ResultSetDataSet rsds = new ResultSetDataSet(); - rsds.setResultSet(rs, null, true, DialectFactory.getDialectType(this)); + rsds.readDataFromJdbcResultSetForDatabaseMetaData(rs, null, true, DialectFactory.getDialectType(this)); return rsds; } catch (SQLException e) @@ -1438,7 +1439,7 @@ public synchronized ResultSetDataSet getIndexInfo(ITableInfo ti, int[] columnInd { rs = _getIndexInfo(ti); ResultSetDataSet rsds = new ResultSetDataSet(); - rsds.setResultSet(rs, columnIndices, computeWidths, DialectFactory.getDialectType(this)); + rsds.readDataFromJdbcResultSetForDatabaseMetaData(rs, columnIndices, computeWidths, DialectFactory.getDialectType(this)); return rsds; } catch (SQLException e) @@ -1518,7 +1519,7 @@ public synchronized IDataSet getPrimaryKey(ITableInfo ti, int[] columnIndices, b privateGetJDBCMetaData().getPrimaryKeys(ti.getCatalogName(), ti.getSchemaName(), ti.getSimpleName()); ResultSetDataSet rsds = new ResultSetDataSet(); - rsds.setResultSet(rs, columnIndices, computeWidths, DialectFactory.getDialectType(this)); + rsds.readDataFromJdbcResultSetForDatabaseMetaData(rs, columnIndices, computeWidths, DialectFactory.getDialectType(this)); return rsds; } catch (SQLException e) @@ -1584,7 +1585,7 @@ public synchronized IDataSet getProcedureColumnsDataSet(IProcedureInfo ti) throw DatabaseMetaData md = privateGetJDBCMetaData(); rs = md.getProcedureColumns(ti.getCatalogName(), ti.getSchemaName(), ti.getSimpleName(), "%"); ResultSetDataSet rsds = new ResultSetDataSet(); - rsds.setResultSet(rs, DialectFactory.getDialectType(this)); + rsds.readDataFromJdbcResultSetForGeneralPurpose(rs, DialectFactory.getDialectType(this)); return rsds; } catch (SQLException e) @@ -1623,7 +1624,7 @@ public synchronized IDataSet getTablePrivilegesDataSet(ITableInfo ti, int[] colu DatabaseMetaData md = privateGetJDBCMetaData(); rs = md.getTablePrivileges(ti.getCatalogName(), ti.getSchemaName(), ti.getSimpleName()); ResultSetDataSet rsds = new ResultSetDataSet(); - rsds.setResultSet(rs, columnIndices, computeWidths, DialectFactory.getDialectType(this)); + rsds.readDataFromJdbcResultSetForDatabaseMetaData(rs, columnIndices, computeWidths, DialectFactory.getDialectType(this)); return rsds; } catch (SQLException e) @@ -1660,7 +1661,7 @@ public synchronized IDataSet getVersionColumnsDataSet(ITableInfo ti) throws Data DatabaseMetaData md = privateGetJDBCMetaData(); rs = md.getVersionColumns(ti.getCatalogName(), ti.getSchemaName(), ti.getSimpleName()); ResultSetDataSet rsds = new ResultSetDataSet(); - rsds.setResultSet(rs, DialectFactory.getDialectType(this)); + rsds.readDataFromJdbcResultSetForGeneralPurpose(rs, DialectFactory.getDialectType(this)); return rsds; } catch (SQLException e) @@ -1704,7 +1705,7 @@ public synchronized IDataSet getColumns(ITableInfo ti, int[] columnIndices, bool { rs = getColumns(ti); ResultSetDataSet rsds = new ResultSetDataSet(); - rsds.setResultSet(rs, columnIndices, computeWidths, DialectFactory.getDialectType(this)); + rsds.readDataFromJdbcResultSetForDatabaseMetaData(rs, columnIndices, computeWidths, DialectFactory.getDialectType(this)); // Workaround for DB2/AIX64 driver: COLUMN_SIZE is not CHAR_OCTET_LENGTH for double-bytes datatypes GRAPHIC/VARGRAPHIC result = rsds; diff --git a/sql12/installer/mac/installer-readme.html b/sql12/installer/mac/installer-readme.html index bfd0ce8a91..0199378b1a 100644 --- a/sql12/installer/mac/installer-readme.html +++ b/sql12/installer/mac/installer-readme.html @@ -28,7 +28,7 @@ SQuirreL SQL Client Version JRE Minimum Version - 5.0.0 and higher + 5.1.0 and higher 17 diff --git a/sql12/installer/other/installer-readme.html b/sql12/installer/other/installer-readme.html index fe18305896..afdd99d992 100644 --- a/sql12/installer/other/installer-readme.html +++ b/sql12/installer/other/installer-readme.html @@ -28,7 +28,7 @@ SQuirreL SQL Client Version JRE Minimum Version - 5.0.0 and higher + 5.1.0 and higher 17 diff --git a/sql12/plugins/hibernate/src/net/sourceforge/squirrel_sql/plugins/hibernate/HibernatePlugin.java b/sql12/plugins/hibernate/src/net/sourceforge/squirrel_sql/plugins/hibernate/HibernatePlugin.java index fdfbd6a3ff..6e0176aff1 100644 --- a/sql12/plugins/hibernate/src/net/sourceforge/squirrel_sql/plugins/hibernate/HibernatePlugin.java +++ b/sql12/plugins/hibernate/src/net/sourceforge/squirrel_sql/plugins/hibernate/HibernatePlugin.java @@ -1,8 +1,6 @@ package net.sourceforge.squirrel_sql.plugins.hibernate; import java.util.HashMap; - -import net.sourceforge.squirrel_sql.client.IApplication; import net.sourceforge.squirrel_sql.client.Main; import net.sourceforge.squirrel_sql.client.plugin.DefaultSessionPlugin; import net.sourceforge.squirrel_sql.client.plugin.PluginException; @@ -10,6 +8,7 @@ import net.sourceforge.squirrel_sql.client.plugin.PluginSessionCallbackAdaptor; import net.sourceforge.squirrel_sql.client.preferences.IGlobalPreferencesPanel; import net.sourceforge.squirrel_sql.client.session.ISession; +import net.sourceforge.squirrel_sql.client.shortcut.ShortCutDescriptionReader; import net.sourceforge.squirrel_sql.fw.id.IIdentifier; import net.sourceforge.squirrel_sql.fw.util.log.ILogger; import net.sourceforge.squirrel_sql.fw.util.log.LoggerController; @@ -78,9 +77,9 @@ public synchronized void initialize() throws PluginException { _resources = new HibernatePluginResources(this); - Main.getApplication().getShortcutManager().registerAccelerator(HQLCompleteCodeAction.class, _resources); - Main.getApplication().getShortcutManager().registerAccelerator(HQLBookmarksAction.class, _resources); - Main.getApplication().getShortcutManager().registerAccelerator(HQLToolsPopUpAction.class, _resources); + Main.getApplication().getShortcutManager().registerAccelerator(HQLCompleteCodeAction.class, _resources, ShortCutDescriptionReader.of(_resources, HQLCompleteCodeAction.class)); + Main.getApplication().getShortcutManager().registerAccelerator(HQLBookmarksAction.class, _resources, ShortCutDescriptionReader.of(_resources, HQLBookmarksAction.class)); + Main.getApplication().getShortcutManager().registerAccelerator(HQLToolsPopUpAction.class, _resources, ShortCutDescriptionReader.of(_resources, HQLToolsPopUpAction.class)); } diff --git a/sql12/plugins/mssql/src/net/sourceforge/squirrel_sql/plugins/mssql/gui/MonitorPanel.java b/sql12/plugins/mssql/src/net/sourceforge/squirrel_sql/plugins/mssql/gui/MonitorPanel.java index 51006a29d8..962c15161a 100644 --- a/sql12/plugins/mssql/src/net/sourceforge/squirrel_sql/plugins/mssql/gui/MonitorPanel.java +++ b/sql12/plugins/mssql/src/net/sourceforge/squirrel_sql/plugins/mssql/gui/MonitorPanel.java @@ -27,7 +27,6 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Date; - import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JPanel; @@ -168,11 +167,11 @@ private void refreshData() { _refreshDate = new Date(); rs = _whoStmt.executeQuery(); - _whoDataSet.setResultSet(rs, DialectType.MSSQL); + _whoDataSet.readDataFromJdbcResultSetForGeneralPurpose(rs, DialectType.MSSQL); _whoViewer.show(_whoDataSet); rs = _perfStmt.executeQuery(); - _perfDataSet.setResultSet(rs, DialectType.MSSQL); + _perfDataSet.readDataFromJdbcResultSetForGeneralPurpose(rs, DialectType.MSSQL); _perfViewer.show(_perfDataSet); } catch (java.sql.SQLException ex) diff --git a/sql12/plugins/mysql/src/net/sourceforge/squirrel_sql/plugins/mysql/tab/BaseSQLTab.java b/sql12/plugins/mysql/src/net/sourceforge/squirrel_sql/plugins/mysql/tab/BaseSQLTab.java index 946662edae..e29077eef8 100644 --- a/sql12/plugins/mysql/src/net/sourceforge/squirrel_sql/plugins/mysql/tab/BaseSQLTab.java +++ b/sql12/plugins/mysql/src/net/sourceforge/squirrel_sql/plugins/mysql/tab/BaseSQLTab.java @@ -18,6 +18,13 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +import java.awt.Component; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.HashMap; +import java.util.Map; + import net.sourceforge.squirrel_sql.client.session.ISession; import net.sourceforge.squirrel_sql.client.session.mainpanel.objecttree.tabs.BaseObjectTab; import net.sourceforge.squirrel_sql.client.session.properties.SessionProperties; @@ -31,13 +38,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.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.HashMap; -import java.util.Map; - abstract class BaseSQLTab extends BaseObjectTab { /** Title to display for tab. */ @@ -159,7 +159,7 @@ protected IDataSet createDataSetFromResultSet(ResultSet rs) throws DataSetException { final ResultSetDataSet rsds = new ResultSetDataSet(); - rsds.setResultSet(rs, DialectType.MYSQL); + rsds.readDataFromJdbcResultSetForGeneralPurpose(rs, DialectType.MYSQL); if (!_firstRowOnly) { return rsds; diff --git a/sql12/plugins/oracle/src/net/sourceforge/squirrel_sql/plugins/oracle/oracle.properties b/sql12/plugins/oracle/src/net/sourceforge/squirrel_sql/plugins/oracle/oracle.properties index 84aef54762..14f21ad4a2 100755 --- a/sql12/plugins/oracle/src/net/sourceforge/squirrel_sql/plugins/oracle/oracle.properties +++ b/sql12/plugins/oracle/src/net/sourceforge/squirrel_sql/plugins/oracle/oracle.properties @@ -52,7 +52,7 @@ net.sourceforge.squirrel_sql.plugins.oracle.SGAtrace.SGATraceInternalFrame.frame # Configuration information for Actions. ######## action.net.sourceforge.squirrel_sql.plugins.oracle.dboutput.NewDBOutputWorksheetAction.image=dboutput.gif -action.net.sourceforge.squirrel_sql.plugins.oracle.dboutput.NewDBOutputWorksheetAction.name=DB Ouptut +action.net.sourceforge.squirrel_sql.plugins.oracle.dboutput.NewDBOutputWorksheetAction.name=DB Output action.net.sourceforge.squirrel_sql.plugins.oracle.dboutput.NewDBOutputWorksheetAction.tooltip=View Oracle Database Output action.net.sourceforge.squirrel_sql.plugins.oracle.dboutput.ClearDBOutputAction.image=Delete16.gif diff --git a/sql12/plugins/postgres/src/net/sourceforge/squirrel_sql/plugins/postgres/explain/ExplainExecutorPanel.java b/sql12/plugins/postgres/src/net/sourceforge/squirrel_sql/plugins/postgres/explain/ExplainExecutorPanel.java index adae275fb5..e99730e5d1 100644 --- a/sql12/plugins/postgres/src/net/sourceforge/squirrel_sql/plugins/postgres/explain/ExplainExecutorPanel.java +++ b/sql12/plugins/postgres/src/net/sourceforge/squirrel_sql/plugins/postgres/explain/ExplainExecutorPanel.java @@ -19,6 +19,22 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +import java.awt.BorderLayout; +import java.awt.Component; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.sql.SQLException; +import java.sql.SQLWarning; +import java.text.NumberFormat; +import java.util.ArrayList; +import java.util.List; +import javax.swing.Icon; +import javax.swing.JComponent; +import javax.swing.JMenuItem; +import javax.swing.JPanel; +import javax.swing.JPopupMenu; +import javax.swing.JTabbedPane; +import javax.swing.SwingUtilities; import net.sourceforge.squirrel_sql.client.gui.builders.UIFactory; import net.sourceforge.squirrel_sql.client.session.ISQLEntryPanel; import net.sourceforge.squirrel_sql.client.session.ISQLExecuterHandler; @@ -44,23 +60,6 @@ import net.sourceforge.squirrel_sql.fw.util.log.ILogger; import net.sourceforge.squirrel_sql.fw.util.log.LoggerController; -import javax.swing.Icon; -import javax.swing.JComponent; -import javax.swing.JMenuItem; -import javax.swing.JPanel; -import javax.swing.JPopupMenu; -import javax.swing.JTabbedPane; -import javax.swing.SwingUtilities; -import java.awt.BorderLayout; -import java.awt.Component; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import java.sql.SQLException; -import java.sql.SQLWarning; -import java.text.NumberFormat; -import java.util.ArrayList; -import java.util.List; - public class ExplainExecutorPanel extends JPanel implements ISQLResultExecutor { static final String EXPLAIN_PREFIX = "EXPLAIN ANALYZE "; @@ -287,7 +286,7 @@ public void sqlResultSetAvailable(ResultSetWrapper rs, final SQLExecutionInfo in { final ResultSetDataSet rsds = new ResultSetDataSet(); - rsds.setResultSet(rs.getResultSet(), _dialectType); + rsds.readDataFromJdbcResultSetForGeneralPurpose(rs.getResultSet(), _dialectType); GUIUtils.processOnSwingEventThread( new Runnable() diff --git a/sql12/plugins/postgres/src/net/sourceforge/squirrel_sql/plugins/postgres/tab/ActiveConnections.java b/sql12/plugins/postgres/src/net/sourceforge/squirrel_sql/plugins/postgres/tab/ActiveConnections.java index a38b9ef6b8..8c6fe2e773 100644 --- a/sql12/plugins/postgres/src/net/sourceforge/squirrel_sql/plugins/postgres/tab/ActiveConnections.java +++ b/sql12/plugins/postgres/src/net/sourceforge/squirrel_sql/plugins/postgres/tab/ActiveConnections.java @@ -3,7 +3,6 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; - import net.sourceforge.squirrel_sql.client.session.ISession; import net.sourceforge.squirrel_sql.client.session.mainpanel.objecttree.tabs.BaseDataSetTab; import net.sourceforge.squirrel_sql.fw.datasetviewer.DataSetException; @@ -54,7 +53,7 @@ protected IDataSet createDataSet() throws DataSetException { Statement stmt = con.createStatement(); ResultSet rs = isPostgres92(con) ? stmt.executeQuery(QUERY_92) : stmt.executeQuery(QUERY); ResultSetDataSet rsds = new ResultSetDataSet(); - rsds.setResultSet(rs, DialectType.POSTGRES); + rsds.readDataFromJdbcResultSetForGeneralPurpose(rs, DialectType.POSTGRES); return rsds; } catch (SQLException ex) { diff --git a/sql12/plugins/postgres/src/net/sourceforge/squirrel_sql/plugins/postgres/tab/LockTab.java b/sql12/plugins/postgres/src/net/sourceforge/squirrel_sql/plugins/postgres/tab/LockTab.java index d549267da7..622e7e3010 100644 --- a/sql12/plugins/postgres/src/net/sourceforge/squirrel_sql/plugins/postgres/tab/LockTab.java +++ b/sql12/plugins/postgres/src/net/sourceforge/squirrel_sql/plugins/postgres/tab/LockTab.java @@ -3,7 +3,6 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; - import net.sourceforge.squirrel_sql.client.session.ISession; import net.sourceforge.squirrel_sql.client.session.mainpanel.objecttree.tabs.BaseDataSetTab; import net.sourceforge.squirrel_sql.fw.datasetviewer.DataSetException; @@ -62,7 +61,7 @@ protected IDataSet createDataSet() throws DataSetException { Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(QUERY); ResultSetDataSet rsds = new ResultSetDataSet(); - rsds.setResultSet(rs, DialectType.POSTGRES); + rsds.readDataFromJdbcResultSetForGeneralPurpose(rs, DialectType.POSTGRES); return rsds; } catch (SQLException ex) diff --git a/sql12/plugins/sessionscript/src/net/sourceforge/squirrel_sql/plugins/sessionscript/SQLALiasesCombo.java b/sql12/plugins/sessionscript/src/net/sourceforge/squirrel_sql/plugins/sessionscript/SQLALiasesCombo.java index 06b70a3006..eba8d9561d 100644 --- a/sql12/plugins/sessionscript/src/net/sourceforge/squirrel_sql/plugins/sessionscript/SQLALiasesCombo.java +++ b/sql12/plugins/sessionscript/src/net/sourceforge/squirrel_sql/plugins/sessionscript/SQLALiasesCombo.java @@ -18,11 +18,13 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -import net.sourceforge.squirrel_sql.client.IApplication; +import java.util.ArrayList; +import java.util.List; +import javax.swing.JComboBox; +import net.sourceforge.squirrel_sql.client.Main; import net.sourceforge.squirrel_sql.client.gui.db.SQLAlias; +import org.apache.commons.lang3.StringUtils; -import javax.swing.*; -import java.util.Iterator; /** * This JComboBox will display all aliases. * @@ -46,22 +48,30 @@ public SQLAlias getSelectedSQLAlias() /** * Load control with all the aliases in the system. - * - * @param conn app Application API. - * - * @throws IllegalArgumentException - * Thrown if a null IApplication passed. - * - * @throws BaseSQLException - * Thrown if an SQL exception occurs. */ - public void load(IApplication app) + public void load(AliasScriptCache scriptsCache) { removeAllItems(); - for (Iterator it = app.getAliasesAndDriversManager().aliases(); it.hasNext();) + + List aliasListClone= new ArrayList<>(Main.getApplication().getAliasesAndDriversManager().getAliasList()); + + aliasListClone.sort((a1, a2) -> compareAliases(scriptsCache, a1, a2)); + + aliasListClone.forEach(a -> addItem(a)); + } + + private int compareAliases(AliasScriptCache scriptsCache, SQLAlias a1, SQLAlias a2) + { + if(false == StringUtils.isBlank(scriptsCache.get(a1).getSQL()) && StringUtils.isBlank(scriptsCache.get(a2).getSQL())) { - SQLAlias alias = it.next(); - addItem(alias); + return -1; } - } + else if(StringUtils.isBlank(scriptsCache.get(a1).getSQL()) && false == StringUtils.isBlank(scriptsCache.get(a2).getSQL())) + { + return 1; + } + + return StringUtils.compareIgnoreCase(a1.getName(), a2.getName()); + + } } diff --git a/sql12/plugins/sessionscript/src/net/sourceforge/squirrel_sql/plugins/sessionscript/ScriptsSheet.java b/sql12/plugins/sessionscript/src/net/sourceforge/squirrel_sql/plugins/sessionscript/ScriptsSheet.java index 1b82ad442a..002e6bf917 100644 --- a/sql12/plugins/sessionscript/src/net/sourceforge/squirrel_sql/plugins/sessionscript/ScriptsSheet.java +++ b/sql12/plugins/sessionscript/src/net/sourceforge/squirrel_sql/plugins/sessionscript/ScriptsSheet.java @@ -18,44 +18,34 @@ * 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 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; 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.*; class ScriptsSheet extends DialogWidget { - private static final StringManager s_stringMgr = - StringManagerFactory.getStringManager(ScriptsSheet.class); + private static final StringManager s_stringMgr = StringManagerFactory.getStringManager(ScriptsSheet.class); - - /** Logger for this class. */ - private static ILogger s_log = - LoggerController.createLogger(ScriptsSheet.class); - /** Singleton instance of this class. */ private static ScriptsSheet s_instance; - /** Plugin. */ private SessionScriptPlugin _plugin; - /** Application API. */ - private IApplication _app; /** Main panel. */ private ViewSessionScriptsPanel _mainPnl; - private ScriptsSheet(SessionScriptPlugin plugin, IApplication app) + private ScriptsSheet(SessionScriptPlugin plugin) { // i18n[sessionscript.startupScripts=Startup Scripts] - super(s_stringMgr.getString("sessionscript.startupScripts"), true, true, true, true); + super(s_stringMgr.getString("sessionscript.startupScripts"), true, true, true, true, Main.getApplication().getMainFrame()); _plugin = plugin; - _app = app; createUserInterface(); } @@ -74,9 +64,10 @@ public static synchronized void showSheet(SessionScriptPlugin plugin, { if (s_instance == null) { - s_instance = new ScriptsSheet(plugin, app); + s_instance = new ScriptsSheet(plugin); app.getMainFrame().addWidget(s_instance); } + DialogWidget.centerWithinDesktop(s_instance); s_instance.setVisible(true); } @@ -94,7 +85,7 @@ private void createUserInterface() makeToolWindow(true); - _mainPnl = new ViewSessionScriptsPanel(_plugin, _app); + _mainPnl = new ViewSessionScriptsPanel(_plugin); Container content = getContentPane(); content.setLayout(new BorderLayout()); diff --git a/sql12/plugins/sessionscript/src/net/sourceforge/squirrel_sql/plugins/sessionscript/SessionScriptPlugin.java b/sql12/plugins/sessionscript/src/net/sourceforge/squirrel_sql/plugins/sessionscript/SessionScriptPlugin.java index dac5fa698b..6ec7267ea1 100755 --- a/sql12/plugins/sessionscript/src/net/sourceforge/squirrel_sql/plugins/sessionscript/SessionScriptPlugin.java +++ b/sql12/plugins/sessionscript/src/net/sourceforge/squirrel_sql/plugins/sessionscript/SessionScriptPlugin.java @@ -18,8 +18,9 @@ * 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 java.io.IOException; +import java.io.IOException; +import javax.swing.SwingUtilities; import net.sourceforge.squirrel_sql.client.IApplication; import net.sourceforge.squirrel_sql.client.action.ActionCollection; import net.sourceforge.squirrel_sql.client.plugin.DefaultSessionPlugin; @@ -32,8 +33,7 @@ import net.sourceforge.squirrel_sql.fw.util.FileWrapper; import net.sourceforge.squirrel_sql.fw.util.log.ILogger; import net.sourceforge.squirrel_sql.fw.util.log.LoggerController; - -import javax.swing.*; +import org.apache.commons.lang3.StringUtils; /** * The plugin class. @@ -169,7 +169,8 @@ public synchronized void initialize() throws PluginException try { _cache = new AliasScriptCache(this); - } catch (IOException ex) + } + catch(IOException ex) { throw new PluginException(ex); } @@ -189,17 +190,22 @@ public void unload() super.unload(); } - public PluginSessionCallback sessionStarted(final ISession session) + @Override + public int getSessionStartedCallRank() { - boolean rc = false; + // Call this Plugin's sessionStarted method last. + return Integer.MAX_VALUE; + } + @Override + public PluginSessionCallback sessionStarted(final ISession session) + { AliasScript script = _cache.get(session.getAlias()); if (script != null) { final String sql = script.getSQL(); - if (sql != null && sql.length() > 0) + if (false == StringUtils.isBlank(sql)) { - rc = true; final ISQLPanelAPI api = session.getSessionInternalFrame().getMainSQLPanelAPI(); SwingUtilities.invokeLater(new Runnable() @@ -212,11 +218,6 @@ public void run() }); } } - - if (false == rc) - { - return null; - } return new PluginSessionCallbackAdaptor(); } diff --git a/sql12/plugins/sessionscript/src/net/sourceforge/squirrel_sql/plugins/sessionscript/ViewSessionScriptsPanel.java b/sql12/plugins/sessionscript/src/net/sourceforge/squirrel_sql/plugins/sessionscript/ViewSessionScriptsPanel.java index 7d7cacb525..2a3ff4950c 100644 --- a/sql12/plugins/sessionscript/src/net/sourceforge/squirrel_sql/plugins/sessionscript/ViewSessionScriptsPanel.java +++ b/sql12/plugins/sessionscript/src/net/sourceforge/squirrel_sql/plugins/sessionscript/ViewSessionScriptsPanel.java @@ -18,18 +18,22 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -import net.sourceforge.squirrel_sql.client.IApplication; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import javax.swing.BorderFactory; +import javax.swing.JButton; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; import net.sourceforge.squirrel_sql.client.gui.db.SQLAlias; import net.sourceforge.squirrel_sql.fw.util.StringManager; import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory; -import javax.swing.*; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - public class ViewSessionScriptsPanel extends JPanel { private static final StringManager s_stringMgr = @@ -37,25 +41,18 @@ public class ViewSessionScriptsPanel extends JPanel private SessionScriptPlugin _plugin; - private IApplication _app; private SQLALiasesCombo _aliasesCmb = new SQLALiasesCombo(); private JTextArea _sqlEntry = new JTextArea(); private JButton _saveBtn; - ViewSessionScriptsPanel(SessionScriptPlugin plugin, IApplication app) + ViewSessionScriptsPanel(SessionScriptPlugin plugin) { - super(); if (plugin == null) { throw new IllegalArgumentException("SessionScriptPlugin == null"); } - if (app == null) - { - throw new IllegalArgumentException("IApplication == null"); - } _plugin = plugin; - _app = app; createUserInterface(); refreshScript(); @@ -86,7 +83,7 @@ private void createUserInterface() { setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); - _aliasesCmb.load(_app); + _aliasesCmb.load(_plugin.getScriptsCache()); _aliasesCmb.addActionListener(new AliasesComboListener(this)); _sqlEntry.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); diff --git a/sql12/plugins/sqlbookmark/doc/readme.html b/sql12/plugins/sqlbookmark/doc/readme.html index 23625ab81d..cb0bce8174 100644 --- a/sql12/plugins/sqlbookmark/doc/readme.html +++ b/sql12/plugins/sqlbookmark/doc/readme.html @@ -9,7 +9,7 @@ -

SQLBookmark 1.0 - Joe Mocker, Gerd Wagner

+

SQLBookmark 2.0.1 - Joe Mocker, Gerd Wagner

SQLBookmark allows you to "bookmark" commonly used SQL code for easy point and click reuse. Whatever you type in the SQL editor can be easily bookmarked by opening SQuirreL's tools popup via @@ -99,5 +99,16 @@

The Global Preferences window can be opened using the “Edit Bookmarks” toolbar button of a Session window.

+

+



+

+

Executing Bookmarks scriptlike:

+Bookmarks can be called from within the SQL editor using the following syntax: + + + @runbookmark <bookmarkNameInSingleQuotes> + + + \ No newline at end of file diff --git a/sql12/plugins/sqlbookmark/src/net/sourceforge/squirrel_sql/plugins/sqlbookmark/SQLBookmarkPlugin.java b/sql12/plugins/sqlbookmark/src/net/sourceforge/squirrel_sql/plugins/sqlbookmark/SQLBookmarkPlugin.java index 9d0898967f..106aa61195 100644 --- a/sql12/plugins/sqlbookmark/src/net/sourceforge/squirrel_sql/plugins/sqlbookmark/SQLBookmarkPlugin.java +++ b/sql12/plugins/sqlbookmark/src/net/sourceforge/squirrel_sql/plugins/sqlbookmark/SQLBookmarkPlugin.java @@ -193,7 +193,7 @@ public synchronized void initialize() throws PluginException public boolean allowsSessionStartedInBackground() { - return true; + return false; } public PluginSessionCallback sessionStarted(final ISession session) diff --git a/sql12/plugins/vertica/src/net/sourceforge/squirrel_sql/plugins/vertica/tab/ContentPlusTab.java b/sql12/plugins/vertica/src/net/sourceforge/squirrel_sql/plugins/vertica/tab/ContentPlusTab.java index 8ed426d41f..c3a3801724 100644 --- a/sql12/plugins/vertica/src/net/sourceforge/squirrel_sql/plugins/vertica/tab/ContentPlusTab.java +++ b/sql12/plugins/vertica/src/net/sourceforge/squirrel_sql/plugins/vertica/tab/ContentPlusTab.java @@ -29,7 +29,6 @@ import net.sourceforge.squirrel_sql.client.session.sqlfilter.OrderByClausePanel; import net.sourceforge.squirrel_sql.client.session.sqlfilter.SQLFilterClauses; import net.sourceforge.squirrel_sql.client.session.sqlfilter.WhereClausePanel; -import net.sourceforge.squirrel_sql.fw.datasetviewer.ColumnDisplayDefinition; import net.sourceforge.squirrel_sql.fw.datasetviewer.DataSetException; import net.sourceforge.squirrel_sql.fw.datasetviewer.IDataSet; import net.sourceforge.squirrel_sql.fw.datasetviewer.ResultSetDataSet; @@ -38,12 +37,11 @@ import net.sourceforge.squirrel_sql.fw.sql.ISQLDatabaseMetaData; import net.sourceforge.squirrel_sql.fw.sql.ITableInfo; import net.sourceforge.squirrel_sql.fw.sql.SQLUtilities; -import net.sourceforge.squirrel_sql.fw.sql.TableColumnInfo; import net.sourceforge.squirrel_sql.fw.sql.dbobj.BestRowIdentifier; -import net.sourceforge.squirrel_sql.fw.util.log.ILogger; -import net.sourceforge.squirrel_sql.fw.util.log.LoggerController; 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; public class ContentPlusTab extends ContentsTab { @@ -237,9 +235,9 @@ 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)); if (rs != null) { try { rs.close(); } catch (SQLException e) {} } diff --git a/sql12/plugins/vertica/src/net/sourceforge/squirrel_sql/plugins/vertica/tab/ProjectionTab.java b/sql12/plugins/vertica/src/net/sourceforge/squirrel_sql/plugins/vertica/tab/ProjectionTab.java index c929f60ede..e1fc3888cb 100644 --- a/sql12/plugins/vertica/src/net/sourceforge/squirrel_sql/plugins/vertica/tab/ProjectionTab.java +++ b/sql12/plugins/vertica/src/net/sourceforge/squirrel_sql/plugins/vertica/tab/ProjectionTab.java @@ -16,6 +16,10 @@ package net.sourceforge.squirrel_sql.plugins.vertica.tab; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + import net.sourceforge.squirrel_sql.client.session.mainpanel.objecttree.tabs.table.BaseTableTab; import net.sourceforge.squirrel_sql.fw.datasetviewer.DataSetException; import net.sourceforge.squirrel_sql.fw.datasetviewer.IDataSet; @@ -28,10 +32,6 @@ import net.sourceforge.squirrel_sql.fw.util.StringManager; import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; - /** * This tab shows the primary key info for the currently selected table. */ @@ -99,7 +99,7 @@ protected IDataSet createDataSet() throws DataSetException pstmt.setString(2, ti.getSimpleName()); rs = pstmt.executeQuery(); ResultSetDataSet rsds = new ResultSetDataSet(md.getColumnInfo(ti)); - rsds.setResultSet(rs, DialectFactory.getDialectType(md)); + rsds.readDataFromJdbcResultSetForGeneralPurpose(rs, DialectFactory.getDialectType(md)); return rsds; } diff --git a/sql12/web-site/faq.html b/sql12/web-site/faq.html index cd6d7f89a6..477698c34e 100755 --- a/sql12/web-site/faq.html +++ b/sql12/web-site/faq.html @@ -409,7 +409,7 @@

Which version of the JVM - 5.0.0 and higher + 5.1.0 and higher 17 diff --git a/sql12/web-site/header.html b/sql12/web-site/header.html index 53ab51c75a..98951bba99 100644 --- a/sql12/web-site/header.html +++ b/sql12/web-site/header.html @@ -18,7 +18,7 @@ Universal SQL Client - Version 5.0.0 + Version 5.1.0
diff --git a/sql12/web-site/home.html b/sql12/web-site/home.html index 66dcfe81ee..c682aae962 100755 --- a/sql12/web-site/home.html +++ b/sql12/web-site/home.html @@ -41,32 +41,20 @@

  -

Feature highlights of 5.0.0:

+

Feature highlights of 5.1.0:

    -
  • The Object tree's root node has a new detail tab named "Client Properties"
  • -
  • The Object tree didn't show tables when the JDBC driver didn't provide table types
  • -
  • Support for Java 25
  • -
  • SQL result table search now highlights results in cell detail display, too
  • -
  • Cell data image display offers to scale images to fit the display size
  • -
  • MS Excel exports offer to create tabs containing the exports' SQL statements
  • -
  • Improved memory footprint
  • -
  • Enhanced 'Copy separated by ...' function
  • -
  • Searching all open SQL results and cell data dialogs
  • -
  • Code completion for JOIN ON clauses
  • -
  • Cell data display highlights JSON and XML after reformatting
  • -
  • Choosing fonts for MS-Excel export
  • -
  • Aliases can be made read-only
  • -
  • SQL result tabs that match the current SQL in the editor are marked
  • -
  • SQL result's find function now offers to narrow the columns to search
  • -
  • SQL result's detail data display now allows to automatically reformat XML or Json
  • -
  • Numeric values can be right aligned
  • -
  • Export to MS-Excel allows to configure auto filtering
  • -
  • Header rows of MS-Excel exports can be made bold/centered/frozen
  • -
  • Option to change the statement separator during SQL execution using --#SET TERMINATOR <separator>
  • -
  • Besides sums, means and deviations can now be displayed for selections in numerical columns
  • -
  • New Alias tree icons which for FlatLaf Look and Feels show if top level folders are expanded or collapsed
  • +
  • Table columns can be toggled between a monospaced font and default font
  • +
  • Table cell contents can be concatenated without separator
  • +
  • SQL results can be rerun automatically after a configurable number of seconds
  • +
  • The SQL editor allows to run bookmarks by the syntax @runbookmark <bookmarkNameInSingleQuotes>
  • +
  • MS Excel file export allows to add or replace sheet-tabs in an MS Excel file
  • +
  • Option to execute SQL in multiple Sessions
  • +
  • Single click connect to multiple Aliases
  • +
  • Enhanced security for encrypting Alias passwords
  • +
  • "Copy as WIKI Table" - function of tables now supports copying the Jira/Cloud table format
  • +
  • User Bookmarks can be displayed as tree
- All new features and bug fixes of the 5.0.0 release can be found in our change log at + All new features and bug fixes of the 5.1.0 release can be found in our change log at SourceForge or GitHub. @@ -118,49 +106,56 @@

Feature highlights of 5.0.0:

Latest News

-

- SQuirreL 5.0.0 is released (09/18/2025).
- The list of feature highlights is rather long and can be found above.
- For all new features and bug fixes see our change log at SourceForge - or GitHub.
- Note that SQuirreL 5.0.0 requires at least Java 17.
-
- 5.0.0 releases on SourceForge:
- Download installer for Windows/Linux/others
- Download installer for Mac OS

- 5.0.0 releases on GitHub:
- Download installer for Windows/Linux/others
- Download installer for Mac OS

-

-
-

- The latest snapshot-20250824_2124 is one more candidate for the 5.0.0 release.
- Latest changes are
+

+ SQuirreL 5.1.0 is released (03/26/2026).
+ The list of feature highlights is rather long and can be found above.
+ For all new features and bug fixes see our change log at SourceForge + or GitHub.
+ Note that SQuirreL 5.1.0 requires at least Java 17.
+
+ 5.1.0 releases on SourceForge:
+ Download installer for Windows/Linux/others
+ Download installer for Mac OS

+ 5.1.0 releases on GitHub:
+ Download installer for Windows/Linux/others
+ Download installer for Mac OS
+

+
+

+ The latest snapshot-20260215_1841 is a release candidate for the 5.1.0 release.
+ Changes since the 5.0.0 release are

- - - + + + + + + + + + +
⇒ the Object tree's root node has new detail tab named "Client Properties"
⇒ the Object tree didn't show tables when the JDBC driver didn't provide table types
⇒ support for the upcoming Java 25 release
⇒ Table columns can be toggled between a monospaced font and default font
⇒ Table cell contents can be concatenated without separator
⇒ SQL results can be rerun automatically after a configurable number of seconds
⇒ The SQL editor allows to run bookmarks by the syntax @runbookmark <bookmarkNameInSingleQuotes>
⇒ MS Excel file export allows to add or replace sheet-tabs in an MS Excel file
⇒ Option to execute SQL in multiple Sessions
⇒ Single click connect to multiple Aliases
⇒ Enhanced security for encrypting Alias passwords
⇒ "Copy as WIKI Table" - function of tables now supports copying the Jira/Cloud table format
⇒ User Bookmarks can be displayed as tree
Please give it a try.

- The minimum required Java version for this snapshot is 17.x.

For all new features and bug fixes see our change log at SourceForge or GitHub.

- snapshot-20250824_2124 releases on SourceForge are:
- Download installer for Windows/Linux/others
- Download installer for Mac OS
- snapshot-20250824_2124 releases on GitHub are:
- Download installer for Windows/Linux/others
- Download installer for Mac OS

+ snapshot-20260215_1841 releases on SourceForge are:
+ Download installer for Windows/Linux/others
+ Download installer for Mac OS
+ snapshot-20260215_1841 releases on GitHub are:
+ Download installer for Windows/Linux/others
+ Download installer for Mac OS

-

+

Note: We don't announce every snapshot release here. If you are interested please check
https://github.com/squirrel-sql-client/squirrel-sql-snapshot-releases/releases
or
https://sourceforge.net/projects/squirrel-sql/files/3-snapshots
for the latest snapshots regularly.

+
  @@ -234,19 +229,19 @@

Available downloads are: