diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/DBeaverPreferencesInitializer.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/DBeaverPreferencesInitializer.java index 3de9cc613ad27f70db497bced8b39d2dff657fd2..2d26f9163fe67c529f297660f283a6cd232fdc9a 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/DBeaverPreferencesInitializer.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/DBeaverPreferencesInitializer.java @@ -16,7 +16,7 @@ import org.jkiss.dbeaver.runtime.qm.QMConstants; import org.jkiss.dbeaver.runtime.qm.QMObjectType; import org.jkiss.dbeaver.runtime.sql.SQLScriptCommitType; import org.jkiss.dbeaver.runtime.sql.SQLScriptErrorHandling; -import org.jkiss.dbeaver.ui.controls.resultset.ResultSetViewer; +import org.jkiss.dbeaver.ui.controls.spreadsheet.Spreadsheet; import org.jkiss.dbeaver.ui.editors.binary.HexEditControl; import org.jkiss.dbeaver.ui.editors.sql.SQLPreferenceConstants; import org.jkiss.dbeaver.utils.ContentUtils; @@ -127,7 +127,7 @@ public class DBeaverPreferencesInitializer extends AbstractPreferenceInitializer RuntimeUtils.setDefaultPreferenceValue(store, DBeaverPreferences.RESULT_SET_ORDER_SERVER_SIDE, true); RuntimeUtils.setDefaultPreferenceValue(store, DBeaverPreferences.RESULT_SET_SHOW_ODD_ROWS, true); RuntimeUtils.setDefaultPreferenceValue(store, DBeaverPreferences.RESULT_SET_SHOW_CELL_ICONS, true); - RuntimeUtils.setDefaultPreferenceValue(store, DBeaverPreferences.RESULT_SET_DOUBLE_CLICK, ResultSetViewer.DoubleClickBehavior.EDITOR.name()); + RuntimeUtils.setDefaultPreferenceValue(store, DBeaverPreferences.RESULT_SET_DOUBLE_CLICK, Spreadsheet.DoubleClickBehavior.INLINE_EDITOR.name()); // QM RuntimeUtils.setDefaultPreferenceValue(store, QMConstants.PROP_HISTORY_DAYS, 90); diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/UIUtils.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/UIUtils.java index 3fc443b6bacc61c9c618bd7ba362bc151946dffa..850f432f14ef2896dd45af3dedc084d1061893f5 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/UIUtils.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/UIUtils.java @@ -811,7 +811,7 @@ public class UIUtils { public static void showErrorDialog( Shell shell, String title, - String message, + @Nullable String message, @Nullable Throwable error) { if (error instanceof DBException && DBUtils.showDatabaseError(shell, title, message, (DBException)error)) { diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetPersister.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetPersister.java index 08f17bb5ced2bb22f50e7cff5f8447151674e712..02b6d01accebfc674d93ddf6cc768bc4d9314954 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetPersister.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetPersister.java @@ -21,6 +21,7 @@ package org.jkiss.dbeaver.ui.controls.resultset; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.osgi.util.NLS; +import org.jkiss.code.Nullable; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.core.CoreMessages; import org.jkiss.dbeaver.model.DBUtils; @@ -70,7 +71,7 @@ class ResultSetPersister { * @param monitor progress monitor * @param listener value listener */ - void applyChanges(DBRProgressMonitor monitor, DataUpdateListener listener) + void applyChanges(@Nullable DBRProgressMonitor monitor, @Nullable DataUpdateListener listener) throws DBException { prepareDeleteStatements(); diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetViewer.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetViewer.java index 54a4bb7988a46d87da703736041528268198527e..ab8ce180d7228f51a90317b167b5fcaf35ee4fac 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetViewer.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetViewer.java @@ -117,7 +117,6 @@ public class ResultSetViewer extends Viewer implements IDataSourceProvider, ISpr private static final String VIEW_PANEL_VISIBLE = "viewPanelVisible"; private static final String VIEW_PANEL_RATIO = "viewPanelRatio"; - private boolean showOddRows; public enum GridMode { GRID, @@ -131,12 +130,6 @@ public class ResultSetViewer extends Viewer implements IDataSourceProvider, ISpr LAST } - public enum DoubleClickBehavior { - NONE, - EDITOR, - INLINE_EDITOR - } - private final IWorkbenchPartSite site; private final Composite viewerPanel; private Composite filtersPanel; @@ -176,6 +169,9 @@ public class ResultSetViewer extends Viewer implements IDataSourceProvider, ISpr private final ResultSetModel model = new ResultSetModel(); + private boolean showOddRows = true; + private boolean showCelIcons = true; + public ResultSetViewer(Composite parent, IWorkbenchPartSite site, ResultSetProvider resultSetProvider) { super(); @@ -322,7 +318,7 @@ public class ResultSetViewer extends Viewer implements IDataSourceProvider, ISpr public void widgetSelected(SelectionEvent e) { String queryText = model.getStatistics() == null ? null : model.getStatistics().getQueryText(); - if (CommonUtils.isEmpty(queryText)) { + if (queryText == null || queryText.isEmpty()) { queryText = ""; } ViewSQLDialog dialog = new ViewSQLDialog(site, getDataSource(), "Query Text", DBIcon.SQL_TEXT.getImage(), queryText); @@ -1704,7 +1700,12 @@ public class ResultSetViewer extends Viewer implements IDataSourceProvider, ISpr } } - showOddRows = getPreferenceStore().getBoolean(DBeaverPreferences.RESULT_SET_SHOW_ODD_ROWS); + // Cache preferences + IPreferenceStore preferenceStore = getPreferenceStore(); + showOddRows = preferenceStore.getBoolean(DBeaverPreferences.RESULT_SET_SHOW_ODD_ROWS); + showCelIcons = preferenceStore.getBoolean(DBeaverPreferences.RESULT_SET_SHOW_CELL_ICONS); + + // Pump data int oldRowNum = curRowNum; int oldColNum = curColNum; @@ -1781,7 +1782,7 @@ public class ResultSetViewer extends Viewer implements IDataSourceProvider, ISpr return getPreferenceStore().getInt(DBeaverPreferences.RESULT_SET_MAX_ROWS); } - private IPreferenceStore getPreferenceStore() + public IPreferenceStore getPreferenceStore() { DBPDataSource dataSource = getDataSource(); if (dataSource != null) { @@ -1793,8 +1794,8 @@ public class ResultSetViewer extends Viewer implements IDataSourceProvider, ISpr private synchronized void runDataPump( final int offset, final int maxRows, - final GridPos oldPos, - final Runnable finalizer) + @Nullable final GridPos oldPos, + @Nullable final Runnable finalizer) { if (dataPumpJob == null) { dataPumpJob = new ResultSetDataPumpJob(this); @@ -2028,9 +2029,14 @@ public class ResultSetViewer extends Viewer implements IDataSourceProvider, ISpr } } + @Nullable private Object getColumnValueFromClipboard(DBDAttributeBinding metaColumn) throws DBCException { - DBCSession session = getDataSource().openSession(VoidProgressMonitor.INSTANCE, DBCExecutionPurpose.UTIL, "Copy from clipboard"); + DBPDataSource dataSource = getDataSource(); + if (dataSource == null) { + return null; + } + DBCSession session = dataSource.openSession(VoidProgressMonitor.INSTANCE, DBCExecutionPurpose.UTIL, "Copy from clipboard"); try { String strValue = (String) getSpreadsheet().getClipboard().getContents(TextTransfer.getInstance()); return metaColumn.getValueHandler().getValueFromObject( @@ -2054,6 +2060,11 @@ public class ResultSetViewer extends Viewer implements IDataSourceProvider, ISpr } model.shiftRows(rowNum, 1); + final DBPDataSource dataSource = getDataSource(); + if (dataSource == null) { + return; + } + // Add new row final DBDAttributeBinding[] columns = model.getColumns(); final Object[] cells = new Object[columns.length]; @@ -2065,7 +2076,7 @@ public class ResultSetViewer extends Viewer implements IDataSourceProvider, ISpr throws InvocationTargetException, InterruptedException { // Copy cell values in new context - DBCSession session = getDataSource().openSession(monitor, DBCExecutionPurpose.UTIL, CoreMessages.controls_resultset_viewer_add_new_row_context_name); + DBCSession session = dataSource.openSession(monitor, DBCExecutionPurpose.UTIL, CoreMessages.controls_resultset_viewer_add_new_row_context_name); try { if (copyCurrent && currentRowNumber >= 0 && currentRowNumber < model.getRowCount()) { Object[] origRow = model.getRowData(currentRowNumber); @@ -2173,6 +2184,7 @@ public class ResultSetViewer extends Viewer implements IDataSourceProvider, ISpr ////////////////////////////////// // Virtual identifier management + @Nullable DBCEntityIdentifier getVirtualEntityIdentifier() { if (!model.isSingleSource() || model.getVisibleColumnCount() == 0) { @@ -2595,6 +2607,9 @@ public class ResultSetViewer extends Viewer implements IDataSourceProvider, ISpr @Override public Image getImage(int col, int row) { + if (!showCelIcons) { + return null; + } DBDAttributeBinding attr; if (gridMode == GridMode.RECORD) { if (row >= model.getVisibleColumnCount()) { diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/spreadsheet/ISpreadsheetController.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/spreadsheet/ISpreadsheetController.java index d7294022930c436745fae020852efa8a674edf6c..31ecda8a48c5174818d70e32234b026e66f3d37f 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/spreadsheet/ISpreadsheetController.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/spreadsheet/ISpreadsheetController.java @@ -20,6 +20,7 @@ package org.jkiss.dbeaver.ui.controls.spreadsheet; import org.eclipse.jface.action.IMenuManager; +import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.swt.widgets.Control; import org.jkiss.code.Nullable; import org.jkiss.dbeaver.ui.controls.lightgrid.GridColumn; @@ -43,11 +44,9 @@ public interface ISpreadsheetController { void resetCellValue(GridPos cell, boolean delete); - void fillContextMenu( - GridPos cell, - IMenuManager manager); + void fillContextMenu(GridPos cell, IMenuManager manager); - void changeSorting( - GridColumn column, - int state); + void changeSorting(GridColumn column, int state); + + IPreferenceStore getPreferenceStore(); } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/spreadsheet/Spreadsheet.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/spreadsheet/Spreadsheet.java index 8165d75ef97ebc0686af8a980cbbd2fbef289f32..8f5e51eeb6defc0ae5d5e5bafa16659ad374235a 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/spreadsheet/Spreadsheet.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/spreadsheet/Spreadsheet.java @@ -32,7 +32,6 @@ import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.GridData; @@ -40,6 +39,7 @@ import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.*; import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.IWorkbenchPartSite; +import org.jkiss.dbeaver.DBeaverPreferences; import org.jkiss.dbeaver.ui.UIUtils; import org.jkiss.dbeaver.ui.controls.lightgrid.*; @@ -49,6 +49,12 @@ import org.jkiss.dbeaver.ui.controls.lightgrid.*; public class Spreadsheet extends LightGrid implements Listener { static final Log log = LogFactory.getLog(Spreadsheet.class); + public enum DoubleClickBehavior { + NONE, + EDITOR, + INLINE_EDITOR + } + private static final String SPREADSHEET_CONTROL_ID = "org.jkiss.dbeaver.ui.spreadsheet"; public static final int MAX_DEF_COLUMN_WIDTH = 300; public static final int MAX_INLINE_EDIT_WITH = 300; @@ -389,7 +395,19 @@ public class Spreadsheet extends LightGrid implements Listener { GridPos pos = super.getCell(new Point(event.x, event.y)); GridPos focusPos = super.getFocusCell(); if (pos != null && focusPos != null && pos.equals(super.getFocusCell())) { - spreadsheetController.showCellEditor(false); + DoubleClickBehavior doubleClickBehavior = DoubleClickBehavior.valueOf( + getController().getPreferenceStore().getString(DBeaverPreferences.RESULT_SET_DOUBLE_CLICK)); + + switch (doubleClickBehavior) { + case NONE: + return; + case EDITOR: + spreadsheetController.showCellEditor(false); + break; + case INLINE_EDITOR: + spreadsheetController.showCellEditor(true); + break; + } } break; case SWT.MouseDown: diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/dialogs/sql/ViewSQLDialog.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/dialogs/sql/ViewSQLDialog.java index f2c8c18d51f20b9fe1ac8fc0a015ee7a584f05ef..aa0fe4d8d18c3a246310e55103e0bae790b8dac0 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/dialogs/sql/ViewSQLDialog.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/dialogs/sql/ViewSQLDialog.java @@ -24,6 +24,7 @@ import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.ui.IWorkbenchPartSite; +import org.jkiss.code.Nullable; import org.jkiss.dbeaver.core.CoreMessages; import org.jkiss.dbeaver.model.DBPDataSource; @@ -35,7 +36,7 @@ public class ViewSQLDialog extends BaseSQLDialog { private boolean enlargeViewPanel = true; private boolean wordWrap = false; - public ViewSQLDialog(final IWorkbenchPartSite parentSite, DBPDataSource dataSource, String title, Image image, String text) + public ViewSQLDialog(final IWorkbenchPartSite parentSite, @Nullable DBPDataSource dataSource, String title, Image image, String text) { super(parentSite, title, image); this.dataSource = dataSource; @@ -106,6 +107,7 @@ public class ViewSQLDialog extends BaseSQLDialog { } } + @Nullable @Override public DBPDataSource getDataSource() { diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/preferences/PrefPageResultSet.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/preferences/PrefPageResultSet.java index 299046fd17345fa969d19822dd5c5063048cf5cb..5bb6cd86c0efd79519432113fbab43feebb456fe 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/preferences/PrefPageResultSet.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/preferences/PrefPageResultSet.java @@ -31,7 +31,7 @@ import org.jkiss.dbeaver.model.data.DBDValueController; import org.jkiss.dbeaver.registry.DataSourceDescriptor; import org.jkiss.dbeaver.runtime.RuntimeUtils; import org.jkiss.dbeaver.ui.UIUtils; -import org.jkiss.dbeaver.ui.controls.resultset.ResultSetViewer; +import org.jkiss.dbeaver.ui.controls.spreadsheet.Spreadsheet; import org.jkiss.dbeaver.utils.AbstractPreferenceStore; import org.jkiss.utils.CommonUtils; @@ -161,9 +161,9 @@ public class PrefPageResultSet extends TargetPrefPage showOddRows = UIUtils.createLabelCheckbox(uiGroup, "Mark odd/even rows", false); showCellIcons = UIUtils.createLabelCheckbox(uiGroup, "Show cell icons", false); doubleClickBehavior = UIUtils.createLabelCombo(uiGroup, "Double-click behavior", SWT.READ_ONLY); - doubleClickBehavior.add("None", ResultSetViewer.DoubleClickBehavior.NONE.ordinal()); - doubleClickBehavior.add("Editor", ResultSetViewer.DoubleClickBehavior.EDITOR.ordinal()); - doubleClickBehavior.add("Inline Editor", ResultSetViewer.DoubleClickBehavior.INLINE_EDITOR.ordinal()); + doubleClickBehavior.add("None", Spreadsheet.DoubleClickBehavior.NONE.ordinal()); + doubleClickBehavior.add("Editor", Spreadsheet.DoubleClickBehavior.EDITOR.ordinal()); + doubleClickBehavior.add("Inline Editor", Spreadsheet.DoubleClickBehavior.INLINE_EDITOR.ordinal()); } return composite; @@ -199,7 +199,7 @@ public class PrefPageResultSet extends TargetPrefPage showOddRows.setSelection(store.getBoolean(DBeaverPreferences.RESULT_SET_SHOW_ODD_ROWS)); showCellIcons.setSelection(store.getBoolean(DBeaverPreferences.RESULT_SET_SHOW_CELL_ICONS)); doubleClickBehavior.select( - ResultSetViewer.DoubleClickBehavior.valueOf(store.getString(DBeaverPreferences.RESULT_SET_DOUBLE_CLICK)).ordinal()); + Spreadsheet.DoubleClickBehavior.valueOf(store.getString(DBeaverPreferences.RESULT_SET_DOUBLE_CLICK)).ordinal()); } catch (Exception e) { log.warn(e); } @@ -231,7 +231,7 @@ public class PrefPageResultSet extends TargetPrefPage store.setValue(DBeaverPreferences.RESULT_SET_SHOW_ODD_ROWS, showOddRows.getSelection()); store.setValue(DBeaverPreferences.RESULT_SET_SHOW_CELL_ICONS, showCellIcons.getSelection()); - store.setValue(DBeaverPreferences.RESULT_SET_DOUBLE_CLICK, CommonUtils.fromOrdinal(ResultSetViewer.DoubleClickBehavior.class, doubleClickBehavior.getSelectionIndex()).name()); + store.setValue(DBeaverPreferences.RESULT_SET_DOUBLE_CLICK, CommonUtils.fromOrdinal(Spreadsheet.DoubleClickBehavior.class, doubleClickBehavior.getSelectionIndex()).name()); } catch (Exception e) { log.warn(e); } diff --git a/plugins/org.jkiss.dbeaver.oracle/src/org/jkiss/dbeaver/ext/oracle/model/OracleDataSource.java b/plugins/org.jkiss.dbeaver.oracle/src/org/jkiss/dbeaver/ext/oracle/model/OracleDataSource.java index ef237e47a4756542e70c0728a3dfe170df429f5c..a2d3ec7f6fe39e875e4afdc158aba16335fd7600 100644 --- a/plugins/org.jkiss.dbeaver.oracle/src/org/jkiss/dbeaver/ext/oracle/model/OracleDataSource.java +++ b/plugins/org.jkiss.dbeaver.oracle/src/org/jkiss/dbeaver/ext/oracle/model/OracleDataSource.java @@ -270,7 +270,7 @@ public class OracleDataSource extends JDBCDataSource } } Object sessionTerritory = connectionInfo.getProperties().get(OracleConstants.PROP_SESSION_TERRITORY); - if (sessionLanguage != null) { + if (sessionTerritory != null) { try { JDBCUtils.executeSQL( session,