diff --git a/plugins/org.jkiss.dbeaver.core/plugin.properties b/plugins/org.jkiss.dbeaver.core/plugin.properties
index f6d08b115bcfc9cc7fbccd5fa507b8e1be23d6f4..eddf1e4737213668736d967b004ad5035224fe09 100644
--- a/plugins/org.jkiss.dbeaver.core/plugin.properties
+++ b/plugins/org.jkiss.dbeaver.core/plugin.properties
@@ -128,8 +128,8 @@ command.org.jkiss.dbeaver.core.compare.objects.description=Compare database obje
command.org.jkiss.dbeaver.core.resultset.toggleMode.name=Toggle Grid/Record view
command.org.jkiss.dbeaver.core.resultset.toggleMode.description=Toggle Result Set Grid/Record View
-command.org.jkiss.dbeaver.core.resultset.togglePreview.name=Toggle value view panel
-command.org.jkiss.dbeaver.core.resultset.togglePreview.description=Toggle result set cell value view panel
+command.org.jkiss.dbeaver.core.resultset.grid.togglePreview.name=Toggle value view panel
+command.org.jkiss.dbeaver.core.resultset.grid.togglePreview.description=Toggle result set cell value view panel
command.org.jkiss.dbeaver.core.resultset.row.first.name=First row
command.org.jkiss.dbeaver.core.resultset.row.first.description=Move to first row
command.org.jkiss.dbeaver.core.resultset.row.previous.name=Previous row
diff --git a/plugins/org.jkiss.dbeaver.core/plugin.xml b/plugins/org.jkiss.dbeaver.core/plugin.xml
index 9ac8ccc3f218bf333e8c04e8cb0b97f096bf2ca6..d79629504c3cd3751932a918cef0e3ffedd84898 100644
--- a/plugins/org.jkiss.dbeaver.core/plugin.xml
+++ b/plugins/org.jkiss.dbeaver.core/plugin.xml
@@ -222,7 +222,6 @@
-
@@ -234,6 +233,7 @@
+
@@ -298,7 +298,7 @@
-
+
@@ -950,7 +950,9 @@
-
+
+
+
@@ -959,6 +961,7 @@
+
@@ -988,14 +991,6 @@
-
-
-
-
-
-
-
-
@@ -1645,7 +1640,6 @@
-
@@ -1657,6 +1651,7 @@
+
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/CollectionElementData.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/CollectionElementData.java
index 294c75e49c6403f7c7dc22a180958d9b51c7e823..ab1a14f618f8f4f5e101604c6120a69b9deff104 100644
--- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/CollectionElementData.java
+++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/CollectionElementData.java
@@ -35,7 +35,7 @@ import java.util.List;
* Complex value element.
* Map pair or array item
*/
-class CollectionElementData {
+public class CollectionElementData {
static final Log log = Log.getLog(CollectionElementData.class);
@@ -67,4 +67,11 @@ class CollectionElementData {
}
}
+ public DBDAttributeBinding getCollectionBinding() {
+ return collectionBinding;
+ }
+
+ public DBDAttributeBindingElement[] getElements() {
+ return elements;
+ }
}
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/FilterValueEditDialog.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/FilterValueEditDialog.java
index 0ea38860b6f3ff16e637b743075691e747fec6d7..6db33edcaba9c96d6257c921a5a5836d457d19c1 100644
--- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/FilterValueEditDialog.java
+++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/FilterValueEditDialog.java
@@ -68,7 +68,7 @@ class FilterValueEditDialog extends BaseDialog {
editorPlaceholder.setLayoutData(new GridData(GridData.FILL_BOTH));
editorPlaceholder.setLayout(new FillLayout());
- final ResultSetViewer.ResultSetValueController valueController = new ResultSetViewer.ResultSetValueController(
+ final ResultSetValueController valueController = new ResultSetValueController(
viewer,
attr,
row,
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/IResultSetController.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/IResultSetController.java
index 6641e3cf3ba33a314787265c97f332c37cb0f032..c2cad46e8a2fa8dd76c8637ce6ed36a0f8352342 100644
--- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/IResultSetController.java
+++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/IResultSetController.java
@@ -21,6 +21,7 @@ package org.jkiss.dbeaver.ui.controls.resultset;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.swt.graphics.Color;
import org.eclipse.ui.IWorkbenchPartSite;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
@@ -35,6 +36,8 @@ import org.jkiss.dbeaver.model.struct.DBSDataContainer;
*/
public interface IResultSetController {
+ public static final String MENU_GROUP_EDIT = "edit";
+
@NotNull
IWorkbenchPartSite getSite();
@@ -49,10 +52,14 @@ public interface IResultSetController {
boolean hasData();
+ boolean isHasMoreData();
+
boolean isReadOnly();
boolean isRecordMode();
+ boolean isColumnReadOnly(DBDAttributeBinding attr);
+
@NotNull
IPreferenceStore getPreferenceStore();
@@ -60,13 +67,43 @@ public interface IResultSetController {
void rejectChanges();
+ /**
+ * Refreshes data. Reads data from underlying data container
+ */
+ void refreshData(@Nullable Runnable onSuccess);
+
+ /**
+ * Reads next segment of data
+ */
+ void readNextSegment();
+
+ /**
+ * Redraws results and updates all toolbars/edit controls
+ * @param rowsChanged updates contents
+ */
+ void redrawData(boolean rowsChanged);
+
void fillContextMenu(@NotNull IMenuManager manager, @Nullable DBDAttributeBinding attr, @Nullable ResultSetRow row);
@Nullable
ResultSetRow getCurrentRow();
+ void setCurrentRow(@Nullable ResultSetRow row);
+
void navigateAssociation(@NotNull DBRProgressMonitor monitor, @NotNull DBDAttributeBinding attr, @NotNull ResultSetRow row)
throws DBException;
void updateValueView();
+
+ void updateEditControls();
+
+ void fireResultSetChange();
+
+ void setStatus(String message, boolean error);
+
+ Color getDefaultBackground();
+
+ Color getDefaultForeground();
+
+ IResultSetPresentation getActivePresentation();
}
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/IResultSetPresentation.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/IResultSetPresentation.java
index 26c8ea6ba4bf85cbb0ecb70d1384d2c9da248e4c..dabb10e38ad26a450bdae20de6a5a4f9c682ee24 100644
--- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/IResultSetPresentation.java
+++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/IResultSetPresentation.java
@@ -19,29 +19,69 @@
package org.jkiss.dbeaver.ui.controls.resultset;
+import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
+import org.jkiss.code.NotNull;
+import org.jkiss.code.Nullable;
+import org.jkiss.dbeaver.model.data.DBDAttributeBinding;
+import org.jkiss.dbeaver.model.data.DBDDisplayFormat;
/**
* Result set renderer.
* Visualizes result set viewer/editor.
*
- * May additionally implement ISelectionProvider
+ * May additionally implement ISelectionProvider, IStatefulControl
*/
public interface IResultSetPresentation {
- void createPresentation(IResultSetController controller, Composite parent);
+ public enum RowPosition {
+ FIRST,
+ PREVIOUS,
+ NEXT,
+ LAST
+ }
+
+
+ void createPresentation(@NotNull IResultSetController controller, @NotNull Composite parent);
Control getControl();
void refreshData(boolean refreshMetadata);
+ /**
+ * Called after results refresh
+ * @param refreshData data was refreshed
+ */
+ void formatData(boolean refreshData);
+
+ void clearData();
+
void updateValueView();
- void fillToolbar(IToolBarManager toolBar);
+ void fillToolbar(@NotNull IToolBarManager toolBar);
+
+ void fillMenu(@NotNull IMenuManager menu);
void changeMode(boolean recordMode);
- // ISelectionProvider
+ void scrollToRow(@NotNull RowPosition position);
+
+ @Nullable
+ DBDAttributeBinding getCurrentAttribute();
+
+ @Nullable
+ Control openValueEditor(final boolean inline);
+
+ @Nullable
+ String copySelectionToString(
+ boolean copyHeader,
+ boolean copyRowNumbers,
+ boolean cut,
+ String delimiter,
+ DBDDisplayFormat format);
+
+ void pasteFromClipboard();
+
}
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/IStatefulControl.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/IStatefulControl.java
new file mode 100644
index 0000000000000000000000000000000000000000..4b63920fbf137d9cac1d1df827fcf5475699fe95
--- /dev/null
+++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/IStatefulControl.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2010-2015 Serge Rieder
+ * serge@jkiss.org
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+package org.jkiss.dbeaver.ui.controls.resultset;
+
+/**
+ * Result set provider
+ */
+public interface IStatefulControl {
+
+
+ /**
+ * Saves presentation state (focus position)
+ */
+ Object saveState();
+
+ /**
+ * Restores presentation state (focus position)
+ */
+ void restoreState(Object state);
+
+}
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetCommandHandler.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetCommandHandler.java
index 85f1c5c5cb6baaa47f2cf52ec5dd94452e122ee6..d9546aef70ff670fc08d378dd5a98b3855d71a65 100644
--- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetCommandHandler.java
+++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetCommandHandler.java
@@ -27,7 +27,6 @@ import org.eclipse.ui.handlers.HandlerUtil;
import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.model.data.DBDDisplayFormat;
-import org.jkiss.dbeaver.ui.controls.resultset.spreadsheet.SpreadsheetCommandHandler;
import org.jkiss.dbeaver.ui.editors.MultiPageAbstractEditor;
/**
@@ -35,7 +34,6 @@ import org.jkiss.dbeaver.ui.editors.MultiPageAbstractEditor;
*/
public class ResultSetCommandHandler extends AbstractHandler {
- public static final String CMD_TOGGLE_PREVIEW = "org.jkiss.dbeaver.core.resultset.togglePreview";
public static final String CMD_TOGGLE_MODE = "org.jkiss.dbeaver.core.resultset.toggleMode";
public static final String CMD_ROW_FIRST = "org.jkiss.dbeaver.core.resultset.row.first";
public static final String CMD_ROW_PREVIOUS = "org.jkiss.dbeaver.core.resultset.row.previous";
@@ -62,20 +60,18 @@ public class ResultSetCommandHandler extends AbstractHandler {
resultSet.refresh();
} else if (actionId.equals(CMD_TOGGLE_MODE)) {
resultSet.toggleMode();
- } else if (actionId.equals(CMD_TOGGLE_PREVIEW)) {
- resultSet.togglePreview();
} else if (actionId.equals(CMD_ROW_PREVIOUS) || actionId.equals(ITextEditorActionDefinitionIds.WORD_PREVIOUS)) {
- resultSet.scrollToRow(ResultSetViewer.RowPosition.PREVIOUS);
+ resultSet.getActivePresentation().scrollToRow(IResultSetPresentation.RowPosition.PREVIOUS);
} else if (actionId.equals(CMD_ROW_NEXT) || actionId.equals(ITextEditorActionDefinitionIds.WORD_NEXT)) {
- resultSet.scrollToRow(ResultSetViewer.RowPosition.NEXT);
+ resultSet.getActivePresentation().scrollToRow(IResultSetPresentation.RowPosition.NEXT);
} else if (actionId.equals(CMD_ROW_FIRST) || actionId.equals(ITextEditorActionDefinitionIds.SELECT_WORD_PREVIOUS)) {
- resultSet.scrollToRow(ResultSetViewer.RowPosition.FIRST);
+ resultSet.getActivePresentation().scrollToRow(IResultSetPresentation.RowPosition.FIRST);
} else if (actionId.equals(CMD_ROW_LAST) || actionId.equals(ITextEditorActionDefinitionIds.SELECT_WORD_NEXT)) {
- resultSet.scrollToRow(ResultSetViewer.RowPosition.LAST);
+ resultSet.getActivePresentation().scrollToRow(IResultSetPresentation.RowPosition.LAST);
} else if (actionId.equals(CMD_ROW_EDIT)) {
- resultSet.showCellEditor(false);
+ resultSet.getActivePresentation().openValueEditor(false);
} else if (actionId.equals(CMD_ROW_EDIT_INLINE)) {
- resultSet.showCellEditor(true);
+ resultSet.getActivePresentation().openValueEditor(true);
} else if (actionId.equals(CMD_ROW_ADD)) {
resultSet.addNewRow(false);
} else if (actionId.equals(CMD_ROW_COPY)) {
@@ -87,13 +83,18 @@ public class ResultSetCommandHandler extends AbstractHandler {
} else if (actionId.equals(CMD_REJECT_CHANGES)) {
resultSet.rejectChanges();
} else if (actionId.equals(IWorkbenchCommandConstants.EDIT_COPY)) {
- resultSet.copySelectionToClipboard(false, false, false, null, DBDDisplayFormat.EDIT);
+ ResultSetUtils.copyToClipboard(
+ resultSet.getActivePresentation().copySelectionToString(
+ false, false, false, null, DBDDisplayFormat.EDIT));
} else if (actionId.equals(IWorkbenchCommandConstants.EDIT_PASTE)) {
- resultSet.pasteCellValue();
+ resultSet.getActivePresentation().pasteFromClipboard();
} else if (actionId.equals(IWorkbenchCommandConstants.EDIT_CUT)) {
- resultSet.copySelectionToClipboard(false, false, true, null, DBDDisplayFormat.EDIT);
+ ResultSetUtils.copyToClipboard(
+ resultSet.getActivePresentation().copySelectionToString(
+ false, false, true, null, DBDDisplayFormat.EDIT)
+ );
} else if (actionId.equals(ITextEditorActionDefinitionIds.SMART_ENTER)) {
- resultSet.showCellEditor(false);
+ resultSet.getActivePresentation().openValueEditor(false);
}
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetCopySpecialHandler.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetCopySpecialHandler.java
index e4cde72cc01d90e75cfdebcc376023584ac0161a..582158a60b644abf065a2440b3509d4490dae716 100644
--- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetCopySpecialHandler.java
+++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetCopySpecialHandler.java
@@ -52,12 +52,12 @@ public class ResultSetCopySpecialHandler extends ResultSetCommandHandler impleme
if (event.getCommand().getId().equals(ICommandIds.CMD_COPY_SPECIAL)) {
ConfigDialog configDialog = new ConfigDialog(HandlerUtil.getActiveShell(event));
if (configDialog.open() == IDialogConstants.OK_ID) {
- resultSet.copySelectionToClipboard(
+ ResultSetUtils.copyToClipboard(resultSet.getActivePresentation().copySelectionToString(
configDialog.copyHeader,
configDialog.copyRows,
false,
configDialog.delimiter,
- configDialog.format);
+ configDialog.format));
}
}
return null;
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetDataPumpJob.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetDataPumpJob.java
index f5625a78f24e309cf642a6a64a58e2a69d44e9f9..d65b0519703b6d50ad97df1dac0a56416feade09 100644
--- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetDataPumpJob.java
+++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetDataPumpJob.java
@@ -178,10 +178,10 @@ class ResultSetDataPumpJob extends DataSourceJob {
return Status.OK_STATUS;
}
- private void showProgress(final Composite spreadsheet) {
+ private void showProgress(final Composite progressPlaceholder) {
if (progressOverlay == null) {
// Start progress visualization
- cancelButton = new Button(spreadsheet, SWT.PUSH);
+ cancelButton = new Button(progressPlaceholder, SWT.PUSH);
cancelButton.setText("Cancel");
GridData gd = new GridData(GridData.FILL_BOTH);
gd.verticalIndent = DBIcon.PROGRESS0.getImage().getBounds().height * 2;
@@ -221,18 +221,18 @@ class ResultSetDataPumpJob extends DataSourceJob {
int statusX = (buttonBounds.x + buttonBounds.width / 2) - statusSize.x / 2;
int statusY = buttonBounds.y - imageBounds.height - 10 - statusSize.y;
- e.gc.setForeground(spreadsheet.getForeground());
- e.gc.setBackground(spreadsheet.getBackground());
+ e.gc.setForeground(progressPlaceholder.getForeground());
+ e.gc.setBackground(progressPlaceholder.getBackground());
e.gc.fillRectangle(statusX - 2, statusY - 2, statusSize.x + 4, statusSize.y + 4);
e.gc.drawText(status, statusX, statusY, true);
}
};
- spreadsheet.addPaintListener(painListener);
+ progressPlaceholder.addPaintListener(painListener);
- progressOverlay = new ControlEditor(spreadsheet) {
+ progressOverlay = new ControlEditor(progressPlaceholder) {
@Override
public void layout() {
- spreadsheet.redraw();
+ progressPlaceholder.redraw();
super.layout();
}
};
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetModel.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetModel.java
index f44f95a06ccbe9684ca9d4ba95e68bc8ecd400fd..2d61d7f4ff1cb7ee1d486514f28fbe9e88ba4377 100644
--- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetModel.java
+++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetModel.java
@@ -510,7 +510,7 @@ public class ResultSetModel {
}
}
- boolean isColumnReadOnly(@NotNull DBDAttributeBinding column)
+ public boolean isColumnReadOnly(@NotNull DBDAttributeBinding column)
{
if (column.getMetaAttribute().isReadOnly()) {
return true;
@@ -673,7 +673,7 @@ public class ResultSetModel {
this.dataFilter.setAnyConstraint(filter.isAnyConstraint());
}
- void resetOrdering()
+ public void resetOrdering()
{
final boolean hasOrdering = dataFilter.hasOrdering();
// Sort locally
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 99725e5c2902ebe79abde11f7f970f252cc5e26c..5513f6d27b9f804554d2a95c2a11836671d40907 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
@@ -219,10 +219,10 @@ class ResultSetPersister {
}
model.refreshChangeCount();
- viewer.refreshSpreadsheet(rowsChanged);
+ viewer.redrawData(rowsChanged);
viewer.fireResultSetChange();
viewer.updateEditControls();
- viewer.previewValue();
+ viewer.getActivePresentation().updateValueView();
}
// Reflect data changes in viewer
@@ -330,7 +330,7 @@ class ResultSetPersister {
}
if (!viewer.getControl().isDisposed()) {
//releaseStatements();
- viewer.refreshSpreadsheet(rowsChanged);
+ viewer.redrawData(rowsChanged);
viewer.updateEditControls();
if (error == null) {
viewer.setStatus(
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetPropertyTester.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetPropertyTester.java
index 21f8824dee5ae3cd5346c219726fb0d34984169b..e4c6e729815ef9ef4068d5145f291ba757b5ed1f 100644
--- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetPropertyTester.java
+++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetPropertyTester.java
@@ -52,9 +52,9 @@ public class ResultSetPropertyTester extends PropertyTester
} else if (PROP_HAS_DATA.equals(property)) {
return rsv.getModel().getRowCount() > 0;
} else if (PROP_CAN_COPY.equals(property)) {
- return rsv.getFocusAttribute() != null && rsv.getFocusRow() != null;
+ return rsv.getActivePresentation().getCurrentAttribute() != null && rsv.getCurrentRow() != null;
} else if (PROP_CAN_PASTE.equals(property) || PROP_CAN_CUT.equals(property)) {
- DBDAttributeBinding attr = rsv.getFocusAttribute();
+ DBDAttributeBinding attr = rsv.getActivePresentation().getCurrentAttribute();
return attr != null && !rsv.isColumnReadOnly(attr);
} else if (PROP_CAN_MOVE.equals(property)) {
ResultSetRow currentRow = rsv.getCurrentRow();
@@ -68,7 +68,7 @@ public class ResultSetPropertyTester extends PropertyTester
return false;
}
if ("edit".equals(expectedValue) || "inline".equals(expectedValue)) {
- DBDAttributeBinding attr = rsv.getFocusAttribute();
+ DBDAttributeBinding attr = rsv.getActivePresentation().getCurrentAttribute();
if (attr == null) {
return false;
}
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetRow.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetRow.java
index b3e3378336c6eac6c3aaf59665f1a0e5db5cb444..348e31167f707220640a6949155336cf5d36e15b 100644
--- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetRow.java
+++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetRow.java
@@ -34,9 +34,9 @@ import java.util.Map;
*/
public class ResultSetRow {
- static final byte STATE_NORMAL = 1;
- static final byte STATE_ADDED = 2;
- static final byte STATE_REMOVED = 3;
+ public static final byte STATE_NORMAL = 1;
+ public static final byte STATE_ADDED = 2;
+ public static final byte STATE_REMOVED = 3;
// Physical row number
private int rowNumber;
@@ -118,7 +118,7 @@ public class ResultSetRow {
}
@NotNull
- CollectionElementData getCollectionData(DBDAttributeBinding binding, DBDCollection collection) {
+ public CollectionElementData getCollectionData(DBDAttributeBinding binding, DBDCollection collection) {
if (collections == null) {
collections = new HashMap();
}
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetUtils.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetUtils.java
index e1e7f2cd4bd64260aa5a69482f43665c381044fe..b995597364e196ab3b1a82e7b0e4174b56738981 100644
--- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetUtils.java
+++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetUtils.java
@@ -19,14 +19,18 @@
package org.jkiss.dbeaver.ui.controls.resultset;
+import org.eclipse.swt.dnd.Clipboard;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.widgets.Display;
import org.jkiss.code.NotNull;
+import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.core.Log;
+import org.jkiss.dbeaver.model.DBPDataSource;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.data.*;
-import org.jkiss.dbeaver.model.exec.DBCAttributeMetaData;
-import org.jkiss.dbeaver.model.exec.DBCEntityMetaData;
-import org.jkiss.dbeaver.model.exec.DBCSession;
+import org.jkiss.dbeaver.model.exec.*;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.sql.SQLQuery;
import org.jkiss.dbeaver.model.struct.*;
@@ -35,6 +39,7 @@ import org.jkiss.dbeaver.model.struct.rdb.DBSTable;
import org.jkiss.dbeaver.model.struct.rdb.DBSTableIndex;
import org.jkiss.dbeaver.model.virtual.DBVEntity;
import org.jkiss.dbeaver.model.virtual.DBVEntityConstraint;
+import org.jkiss.dbeaver.runtime.VoidProgressMonitor;
import org.jkiss.utils.CommonUtils;
import java.util.*;
@@ -42,7 +47,7 @@ import java.util.*;
/**
* Utils
*/
-class ResultSetUtils
+public class ResultSetUtils
{
static final Log log = Log.getLog(ResultSetUtils.class);
@@ -248,4 +253,35 @@ class ResultSetUtils
attr1.getTypeID() == attr2.getTypeID() &&
CommonUtils.equalObjects(attr1.getTypeName(), attr2.getTypeName());
}
+
+ @Nullable
+ public static Object getColumnValueFromClipboard(DBDAttributeBinding metaColumn) throws DBCException
+ {
+ DBPDataSource dataSource = metaColumn.getDataSource();
+ DBCSession session = dataSource.openSession(VoidProgressMonitor.INSTANCE, DBCExecutionPurpose.UTIL, "Copy from clipboard");
+ Clipboard clipboard = new Clipboard(Display.getCurrent());
+ try {
+ String strValue = (String) clipboard.getContents(TextTransfer.getInstance());
+ return metaColumn.getValueHandler().getValueFromObject(
+ session, metaColumn.getAttribute(), strValue, true);
+ } finally {
+ session.close();
+ clipboard.dispose();
+ }
+ }
+
+ public static void copyToClipboard(String string) {
+ if (string.length() > 0) {
+ Clipboard clipboard = new Clipboard(Display.getCurrent());
+ try {
+ TextTransfer textTransfer = TextTransfer.getInstance();
+ clipboard.setContents(
+ new Object[]{string},
+ new Transfer[]{textTransfer});
+ } finally {
+ clipboard.dispose();
+ }
+ }
+ }
+
}
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetValueController.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetValueController.java
new file mode 100644
index 0000000000000000000000000000000000000000..280d87b145a3c7427eab7654722f59b4f2ce4ade
--- /dev/null
+++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetValueController.java
@@ -0,0 +1,213 @@
+/*
+ * Copyright (C) 2010-2015 Serge Rieder
+ * serge@jkiss.org
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+package org.jkiss.dbeaver.ui.controls.resultset;
+
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.ui.IWorkbenchPartSite;
+import org.jkiss.code.NotNull;
+import org.jkiss.code.Nullable;
+import org.jkiss.dbeaver.model.DBPDataSource;
+import org.jkiss.dbeaver.model.DBUtils;
+import org.jkiss.dbeaver.model.data.*;
+import org.jkiss.dbeaver.model.exec.DBCAttributeMetaData;
+import org.jkiss.dbeaver.model.struct.DBSDataContainer;
+import org.jkiss.dbeaver.model.struct.DBSTypedObject;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+* ResultSetValueController
+*/
+public class ResultSetValueController implements DBDAttributeController, DBDRowController {
+
+ protected final IResultSetController controller;
+ protected final EditType editType;
+ protected final Composite inlinePlaceholder;
+ protected ResultSetRow curRow;
+ protected final DBDAttributeBinding binding;
+
+ public ResultSetValueController(
+ @NotNull IResultSetController controller,
+ @NotNull DBDAttributeBinding binding,
+ @NotNull ResultSetRow row,
+ @NotNull EditType editType,
+ @Nullable Composite inlinePlaceholder)
+ {
+ this.controller = controller;
+ this.binding = binding;
+ this.curRow = row;
+ this.editType = editType;
+ this.inlinePlaceholder = inlinePlaceholder;
+ }
+
+ public ResultSetRow getCurRow() {
+ return curRow;
+ }
+
+ public void setCurRow(ResultSetRow curRow)
+ {
+ this.curRow = curRow;
+ }
+
+ @Nullable
+ @Override
+ public DBPDataSource getDataSource()
+ {
+ DBSDataContainer dataContainer = controller.getDataContainer();
+ return dataContainer == null ? null : dataContainer.getDataSource();
+ }
+
+ @Override
+ public String getValueName()
+ {
+ return binding.getName();
+ }
+
+ @Override
+ public DBSTypedObject getValueType()
+ {
+ return binding.getMetaAttribute();
+ }
+
+ @NotNull
+ @Override
+ public DBDRowController getRowController() {
+ return this;
+ }
+
+ @NotNull
+ @Override
+ public DBDAttributeBinding getBinding()
+ {
+ return binding;
+ }
+
+ @NotNull
+ @Override
+ public String getColumnId() {
+ DBPDataSource dataSource = getDataSource();
+ DBCAttributeMetaData metaAttribute = binding.getMetaAttribute();
+ return DBUtils.getSimpleQualifiedName(
+ dataSource == null ? null : dataSource.getContainer().getName(),
+ metaAttribute.getEntityName(),
+ metaAttribute.getName());
+ }
+
+ @Override
+ public Object getValue()
+ {
+ return controller.getModel().getCellValue(binding, curRow);
+ }
+
+ @Override
+ public void updateValue(@Nullable Object value)
+ {
+ if (controller.getModel().updateCellValue(binding, curRow, value)) {
+ // Update controls
+ controller.getSite().getShell().getDisplay().syncExec(new Runnable() {
+ @Override
+ public void run() {
+ controller.updateValueView();
+ }
+ });
+ }
+ controller.fireResultSetChange();
+ }
+
+ @Nullable
+ @Override
+ public DBDRowIdentifier getRowIdentifier()
+ {
+ return binding.getRowIdentifier();
+ }
+
+ @Override
+ public DBDValueHandler getValueHandler()
+ {
+ return binding.getValueHandler();
+ }
+
+ @Override
+ public EditType getEditType()
+ {
+ return editType;
+ }
+
+ @Override
+ public boolean isReadOnly()
+ {
+ return controller.isColumnReadOnly(binding);
+ }
+
+ @Override
+ public IWorkbenchPartSite getValueSite()
+ {
+ return controller.getSite();
+ }
+
+ @Nullable
+ @Override
+ public Composite getEditPlaceholder()
+ {
+ return inlinePlaceholder;
+ }
+
+ @Nullable
+ @Override
+ public ToolBar getEditToolBar()
+ {
+ return null;
+ }
+
+ @Override
+ public void closeInlineEditor()
+ {
+ }
+
+ @Override
+ public void nextInlineEditor(boolean next) {
+ }
+
+ @Override
+ public void unregisterEditor(DBDValueEditorStandalone editor) {
+ }
+
+ @Override
+ public void showMessage(String message, boolean error)
+ {
+ controller.setStatus(message, error);
+ }
+
+ @NotNull
+ @Override
+ public List getRowAttributes()
+ {
+ return Arrays.asList(controller.getModel().getColumns());
+ }
+
+ @Nullable
+ @Override
+ public Object getAttributeValue(DBDAttributeBinding attribute)
+ {
+ return controller.getModel().getCellValue(attribute, curRow);
+ }
+
+}
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 a04930c3b28d4d1f770869608f8f05054de66659..60a135d182354c5145cf11ab39e9acc394281bb3 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
@@ -20,8 +20,6 @@ package org.jkiss.dbeaver.ui.controls.resultset;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
import org.eclipse.jface.action.*;
@@ -29,18 +27,15 @@ import org.eclipse.jface.dialogs.ControlEnableState;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.text.IFindReplaceTarget;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.*;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.Viewer;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.SashForm;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
@@ -49,12 +44,6 @@ import org.eclipse.ui.IWorkbenchCommandConstants;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.commands.ICommandService;
import org.eclipse.ui.menus.CommandContributionItem;
-import org.eclipse.ui.progress.UIJob;
-import org.eclipse.ui.themes.ITheme;
-import org.eclipse.ui.themes.IThemeManager;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-import org.eclipse.ui.views.properties.IPropertySource;
-import org.eclipse.ui.views.properties.IPropertySourceProvider;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
@@ -64,7 +53,6 @@ import org.jkiss.dbeaver.core.DBeaverCore;
import org.jkiss.dbeaver.core.DBeaverUI;
import org.jkiss.dbeaver.core.Log;
import org.jkiss.dbeaver.ext.IDataSourceProvider;
-import org.jkiss.dbeaver.model.DBPDataKind;
import org.jkiss.dbeaver.model.DBPDataSource;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.data.*;
@@ -83,12 +71,6 @@ import org.jkiss.dbeaver.tools.transfer.database.DatabaseTransferProducer;
import org.jkiss.dbeaver.tools.transfer.wizard.DataTransferWizard;
import org.jkiss.dbeaver.ui.*;
import org.jkiss.dbeaver.ui.controls.CImageCombo;
-import org.jkiss.dbeaver.ui.controls.PropertyPageStandard;
-import org.jkiss.dbeaver.ui.controls.lightgrid.GridCell;
-import org.jkiss.dbeaver.ui.controls.lightgrid.GridPos;
-import org.jkiss.dbeaver.ui.controls.lightgrid.IGridContentProvider;
-import org.jkiss.dbeaver.ui.controls.lightgrid.IGridLabelProvider;
-import org.jkiss.dbeaver.ui.controls.resultset.spreadsheet.Spreadsheet;
import org.jkiss.dbeaver.ui.controls.resultset.spreadsheet.SpreadsheetPresentation;
import org.jkiss.dbeaver.ui.dialogs.ActiveWizardDialog;
import org.jkiss.dbeaver.ui.dialogs.ConfirmationDialog;
@@ -96,8 +78,6 @@ import org.jkiss.dbeaver.ui.dialogs.EditTextDialog;
import org.jkiss.dbeaver.ui.dialogs.sql.ViewSQLDialog;
import org.jkiss.dbeaver.ui.dialogs.struct.EditConstraintDialog;
import org.jkiss.dbeaver.ui.preferences.PrefPageDatabaseGeneral;
-import org.jkiss.dbeaver.ui.properties.PropertyCollector;
-import org.jkiss.dbeaver.utils.ContentUtils;
import org.jkiss.utils.CommonUtils;
import java.lang.reflect.InvocationTargetException;
@@ -121,16 +101,6 @@ public class ResultSetViewer extends Viewer
{
static final Log log = Log.getLog(ResultSetViewer.class);
- private static final String VIEW_PANEL_VISIBLE = "viewPanelVisible";
- private static final String VIEW_PANEL_RATIO = "viewPanelRatio";
-
- public enum RowPosition {
- FIRST,
- PREVIOUS,
- NEXT,
- LAST
- }
-
public static class StateItem {
DBSDataContainer dataContainer;
DBDDataFilter filter;
@@ -165,44 +135,20 @@ public class ResultSetViewer extends Viewer
private IResultSetPresentation activePresentation;
private List presentations;
- private final SashForm resultsSash;
- private final Spreadsheet spreadsheet;
- private final ViewValuePanel previewPane;
- private ResultSetValueController panelValueController;
-
@NotNull
private final IResultSetContainer resultSetProvider;
@NotNull
private final ResultSetDataReceiver dataReceiver;
- @NotNull
- private final IThemeManager themeManager;
- private final IPropertyChangeListener themeChangeListener;
private ToolBarManager toolBarManager;
// Current row/col number
@Nullable
private ResultSetRow curRow;
- @Nullable
- private DBDAttributeBinding curAttribute;
// Mode
private boolean recordMode;
- private int columnOrder = SWT.NONE;
- private final Map openEditors = new HashMap();
private final List listeners = new ArrayList();
- // UI modifiers
- private final Color colorRed;
- private Color backgroundAdded;
- private Color backgroundDeleted;
- private Color backgroundModified;
- private Color backgroundNormal;
- private Color backgroundOdd;
- private Color backgroundReadOnly;
- private Color foregroundDefault;
- private Color foregroundNull;
- private final Font boldFont;
-
private volatile ResultSetDataPumpJob dataPumpJob;
private final ResultSetModel model = new ResultSetModel();
@@ -210,14 +156,13 @@ public class ResultSetViewer extends Viewer
private final List stateHistory = new ArrayList();
private int historyPosition = -1;
- private boolean showOddRows = true;
- private boolean showCelIcons = true;
-
private ToolItem filtersApplyButton;
private ToolItem filtersClearButton;
private ToolItem historyBackButton;
private ToolItem historyForwardButton;
+ private final Color colorRed;
+
public ResultSetViewer(@NotNull Composite parent, @NotNull IWorkbenchPartSite site, @NotNull IResultSetContainer resultSetProvider)
{
super();
@@ -228,108 +173,22 @@ public class ResultSetViewer extends Viewer
this.dataReceiver = new ResultSetDataReceiver(this);
this.colorRed = Display.getDefault().getSystemColor(SWT.COLOR_RED);
- this.boldFont = UIUtils.makeBoldFont(parent.getFont());
- this.foregroundNull = getSite().getShell().getDisplay().getSystemColor(SWT.COLOR_GRAY);
this.viewerPanel = UIUtils.createPlaceholder(parent, 1);
UIUtils.setHelp(this.viewerPanel, IHelpContextIds.CTX_RESULT_SET_VIEWER);
createFiltersPanel();
this.activePresentation = new SpreadsheetPresentation();
-
- {
- resultsSash = new SashForm(viewerPanel, SWT.HORIZONTAL | SWT.SMOOTH);
- resultsSash.setBackgroundMode(SWT.INHERIT_FORCE);
- resultsSash.setLayoutData(new GridData(GridData.FILL_BOTH));
- resultsSash.setSashWidth(5);
- //resultsSash.setBackground(resultsSash.getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
-
- this.spreadsheet = new Spreadsheet(
- resultsSash,
- SWT.MULTI | SWT.VIRTUAL | SWT.H_SCROLL | SWT.V_SCROLL,
- site,
- (SpreadsheetPresentation) this.activePresentation,
- new ContentProvider(),
- new GridLabelProvider());
- this.spreadsheet.setLayoutData(new GridData(GridData.FILL_BOTH));
-
- this.previewPane = new ViewValuePanel(resultsSash) {
- @Override
- protected void hidePanel()
- {
- togglePreview();
- }
- };
-
- final IPreferenceStore preferences = getPreferenceStore();
- int ratio = preferences.getInt(VIEW_PANEL_RATIO);
- boolean viewPanelVisible = preferences.getBoolean(VIEW_PANEL_VISIBLE);
- if (ratio <= 0) {
- ratio = 750;
- }
- resultsSash.setWeights(new int[]{ratio, 1000 - ratio});
- if (!viewPanelVisible) {
- resultsSash.setMaximizedControl(spreadsheet);
- }
- previewPane.addListener(SWT.Resize, new Listener() {
- @Override
- public void handleEvent(Event event)
- {
- DBPDataSource dataSource = getDataSource();
- if (dataSource != null) {
- if (!resultsSash.isDisposed()) {
- int[] weights = resultsSash.getWeights();
- int ratio = weights[0];
- preferences.setValue(VIEW_PANEL_RATIO, ratio);
- }
- }
- }
- });
- }
-
this.activePresentation.createPresentation(this, viewerPanel);
createStatusBar(viewerPanel);
- this.themeManager = site.getWorkbenchWindow().getWorkbench().getThemeManager();
- this.themeChangeListener = new IPropertyChangeListener() {
- @Override
- public void propertyChange(PropertyChangeEvent event) {
- if (event.getProperty().startsWith(ThemeConstants.RESULTS_PROP_PREFIX)) {
- applyThemeSettings();
- }
- }
- };
- this.themeManager.addPropertyChangeListener(themeChangeListener);
this.viewerPanel.addDisposeListener(new DisposeListener() {
@Override
- public void widgetDisposed(DisposeEvent e)
- {
+ public void widgetDisposed(DisposeEvent e) {
dispose();
}
});
- this.spreadsheet.addCursorChangeListener(new Listener() {
- @Override
- public void handleEvent(Event event)
- {
- if (event.detail != SWT.DRAG && event.detail != SWT.DROP_DOWN) {
- updateGridCursor((GridCell)event.data);
- }
- }
- });
- applyThemeSettings();
-
- spreadsheet.addFocusListener(new FocusListener() {
- @Override
- public void focusGained(FocusEvent e) {
- updateToolbar();
- }
-
- @Override
- public void focusLost(FocusEvent e) {
- updateToolbar();
- }
- });
changeMode(false);
}
@@ -516,7 +375,7 @@ public class ResultSetViewer extends Viewer
DBDDataFilter newFilter = model.createDataFilter();
newFilter.setWhere(condition);
setDataFilter(newFilter, true);
- spreadsheet.setFocus();
+ viewerPanel.setFocus();
}
public void updateFiltersText()
@@ -594,18 +453,10 @@ public class ResultSetViewer extends Viewer
{
if (!model.getDataFilter().equalFilters(dataFilter)) {
if (model.setDataFilter(dataFilter)) {
- refreshSpreadsheet(true);
+ redrawData(true);
}
if (refreshData) {
- reorderResultSet(true, new Runnable() {
- @Override
- public void run()
- {
- if (!recordMode) {
- spreadsheet.refreshData(false);
- }
- }
- });
+ activePresentation.formatData(true);
} else {
updateFiltersText();
}
@@ -625,6 +476,21 @@ public class ResultSetViewer extends Viewer
return DBeaverCore.getGlobalPreferenceStore();
}
+ @Override
+ public Color getDefaultBackground() {
+ return filtersText.getBackground();
+ }
+
+ @Override
+ public Color getDefaultForeground() {
+ return filtersText.getForeground();
+ }
+
+ @Override
+ public IResultSetPresentation getActivePresentation() {
+ return activePresentation;
+ }
+
@Nullable
@Override
public DBPDataSource getDataSource()
@@ -637,37 +503,8 @@ public class ResultSetViewer extends Viewer
@Override
public Object getAdapter(Class adapter)
{
- if (adapter == IPropertySheetPage.class) {
- // Show cell properties
- PropertyPageStandard page = new PropertyPageStandard();
- page.setPropertySourceProvider(new IPropertySourceProvider() {
- @Nullable
- @Override
- public IPropertySource getPropertySource(Object object)
- {
- if (object instanceof GridCell) {
- GridCell cell = (GridCell) object;
- final DBDAttributeBinding attr = (DBDAttributeBinding)(recordMode ? cell.row : cell.col);
- final ResultSetRow row = (ResultSetRow)(recordMode ? cell.col : cell.row);
- final ResultSetValueController valueController = new ResultSetValueController(
- ResultSetViewer.this,
- attr,
- row,
- DBDValueController.EditType.NONE,
- null);
- PropertyCollector props = new PropertyCollector(valueController.binding.getAttribute(), false);
- props.collectProperties();
- valueController.getValueHandler().contributeProperties(props, valueController);
- return props;
- }
- return null;
- }
- });
- return page;
- } else if (adapter == IFindReplaceTarget.class) {
- if (activePresentation instanceof IFindReplaceTarget) {
- return activePresentation;
- }
+ if (adapter.isAssignableFrom(activePresentation.getClass())) {
+ return activePresentation;
}
// Try to get it from adapter
if (activePresentation instanceof IAdaptable) {
@@ -690,44 +527,16 @@ public class ResultSetViewer extends Viewer
}
}
- private void updateGridCursor(GridCell cell)
- {
- boolean changed;
- Object newCol = cell == null ? null : cell.col;
- Object newRow = cell == null ? null : cell.row;
- if (!recordMode) {
- changed = curRow != newRow || curAttribute != newCol;
- if (newRow instanceof ResultSetRow && newCol instanceof DBDAttributeBinding) {
- curRow = (ResultSetRow) newRow;
- curAttribute = (DBDAttributeBinding) newCol;
- }
- } else {
- changed = curAttribute != newRow;
- if (newRow instanceof DBDAttributeBinding) {
- curAttribute = (DBDAttributeBinding) newRow;
- }
- }
- if (curState != null && curRow != null) {
- curState.rowNumber = curRow.getVisualNumber();
- }
- if (changed) {
- ResultSetPropertyTester.firePropertyChange(ResultSetPropertyTester.PROP_CAN_MOVE);
- ResultSetPropertyTester.firePropertyChange(ResultSetPropertyTester.PROP_EDITABLE);
- updateValueView();
- }
- }
-
private void updateRecordMode()
{
- DBDAttributeBinding oldAttr = this.curAttribute;
- this.initResultSet();
- this.curAttribute = oldAttr;
- if (curRow != null && oldAttr != null) {
- spreadsheet.setCursor(new GridCell(curRow, oldAttr), false);
- }
+ //Object state = savePresentationState();
+ //this.redrawData(false);
+ activePresentation.refreshData(true);
+ this.updateStatusMessage();
+ //restorePresentationState(state);
}
- void updateEditControls()
+ public void updateEditControls()
{
ResultSetPropertyTester.firePropertyChange(ResultSetPropertyTester.PROP_EDITABLE);
ResultSetPropertyTester.firePropertyChange(ResultSetPropertyTester.PROP_CHANGED);
@@ -749,9 +558,9 @@ public class ResultSetViewer extends Viewer
}
}
- void refreshSpreadsheet(boolean rowsChanged)
+ public void redrawData(boolean rowsChanged)
{
- if (spreadsheet.isDisposed()) {
+ if (viewerPanel.isDisposed()) {
return;
}
if (rowsChanged) {
@@ -759,20 +568,17 @@ public class ResultSetViewer extends Viewer
if (curRow == null || curRow.getVisualNumber() >= rowCount) {
curRow = rowCount == 0 ? null : model.getRow(rowCount - 1);
}
- GridCell curCell = spreadsheet.getCursorCell();
// Set cursor on new row
if (!recordMode) {
- this.initResultSet();
- if (curCell != null) {
- spreadsheet.setCursor(curCell, false);
- }
+ activePresentation.refreshData(false);
+ this.updateFiltersText();
+ this.updateStatusMessage();
} else {
- updateRecordMode();
+ this.updateRecordMode();
}
-
} else {
- this.spreadsheet.redrawGrid();
+ activePresentation.refreshData(false);
}
}
@@ -833,7 +639,7 @@ public class ResultSetViewer extends Viewer
toolBarManager.add(refreshAction);
toolBarManager.add(new Separator());
toolBarManager.add(ActionUtils.makeCommandContribution(site, ResultSetCommandHandler.CMD_TOGGLE_MODE, CommandContributionItem.STYLE_CHECK));
- toolBarManager.add(ActionUtils.makeCommandContribution(site, ResultSetCommandHandler.CMD_TOGGLE_PREVIEW, CommandContributionItem.STYLE_CHECK));
+ activePresentation.fillToolbar(toolBarManager);
toolBarManager.add(new ConfigAction());
toolBarManager.createControl(statusBar);
@@ -841,12 +647,6 @@ public class ResultSetViewer extends Viewer
//updateEditControls();
}
- @NotNull
- public Spreadsheet getSpreadsheet()
- {
- return spreadsheet;
- }
-
@Nullable
public DBSDataContainer getDataContainer()
{
@@ -864,6 +664,7 @@ public class ResultSetViewer extends Viewer
public void toggleMode()
{
changeMode(!recordMode);
+
// Refresh elements
ICommandService commandService = (ICommandService) site.getService(ICommandService.class);
if (commandService != null) {
@@ -873,83 +674,15 @@ public class ResultSetViewer extends Viewer
private void changeMode(boolean recordMode)
{
- ResultSetRow oldRow = this.curRow;
- DBDAttributeBinding oldAttribute = this.curAttribute;
- int rowCount = model.getRowCount();
- if (rowCount > 0) {
- // Fix row number if needed
- if (oldRow == null) {
- oldRow = this.curRow = model.getRow(0);
- } else if (oldRow.getVisualNumber() >= rowCount) {
- oldRow = this.curRow = model.getRow(rowCount - 1);
- }
- }
- if (oldAttribute == null && model.getVisibleColumnCount() > 0) {
- oldAttribute = model.getVisibleColumn(0);
- }
+ //Object state = savePresentationState();
this.recordMode = recordMode;
+ //redrawData(false);
+ activePresentation.refreshData(true);
activePresentation.changeMode(recordMode);
-
- this.columnOrder = recordMode ? SWT.DEFAULT : SWT.NONE;
- if (!this.recordMode) {
- this.initResultSet();
- } else {
- this.updateRecordMode();
- }
- if (oldRow != null && oldAttribute != null) {
- if (!recordMode) {
- spreadsheet.setCursor(new GridCell(oldAttribute, oldRow), false);
- } else {
- spreadsheet.setCursor(new GridCell(oldRow, oldAttribute), false);
- }
- }
- spreadsheet.layout(true, true);
- previewValue();
- }
-
- ////////////////////////////////////////////////////////////
- // Value preview
-
- public boolean isPreviewVisible()
- {
- return resultsSash.getMaximizedControl() == null;
- }
-
- public void togglePreview()
- {
- if (resultsSash.getMaximizedControl() == null) {
- resultsSash.setMaximizedControl(spreadsheet);
- } else {
- resultsSash.setMaximizedControl(null);
- previewValue();
- }
- getPreferenceStore().setValue(VIEW_PANEL_VISIBLE, isPreviewVisible());
-
- // Refresh elements
- ICommandService commandService = (ICommandService) site.getService(ICommandService.class);
- if (commandService != null) {
- commandService.refreshElements(ResultSetCommandHandler.CMD_TOGGLE_PREVIEW, null);
- }
- }
-
- void previewValue()
- {
- DBDAttributeBinding attr = getFocusAttribute();
- ResultSetRow row = getFocusRow();
- if (!isPreviewVisible() || attr == null || row == null) {
- return;
- }
- if (panelValueController == null || panelValueController.binding != attr) {
- panelValueController = new ResultSetValueController(
- this,
- attr,
- row,
- DBDValueController.EditType.PANEL,
- previewPane.getViewPlaceholder());
- } else {
- panelValueController.setCurRow(row);
+ if (!recordMode) {
+ updateStatusMessage();
}
- previewPane.viewValue(panelValueController);
+ //restorePresentationState(state);
}
////////////////////////////////////////////////////////////
@@ -957,12 +690,8 @@ public class ResultSetViewer extends Viewer
private void dispose()
{
- closeEditors();
clearData();
- themeManager.removePropertyChangeListener(themeChangeListener);
-
- UIUtils.dispose(this.boldFont);
if (toolBarManager != null) {
try {
toolBarManager.dispose();
@@ -973,73 +702,7 @@ public class ResultSetViewer extends Viewer
}
}
- private void applyThemeSettings()
- {
- ITheme currentTheme = themeManager.getCurrentTheme();
- Font rsFont = currentTheme.getFontRegistry().get(ThemeConstants.FONT_SQL_RESULT_SET);
- if (rsFont != null) {
- this.spreadsheet.setFont(rsFont);
- }
- Color previewBack = currentTheme.getColorRegistry().get(ThemeConstants.COLOR_SQL_RESULT_SET_PREVIEW_BACK);
- if (previewBack != null) {
- this.previewPane.getViewPlaceholder().setBackground(previewBack);
- for (Control control : this.previewPane.getViewPlaceholder().getChildren()) {
- control.setBackground(previewBack);
- }
- }
- this.backgroundAdded = currentTheme.getColorRegistry().get(ThemeConstants.COLOR_SQL_RESULT_CELL_NEW_BACK);
- this.backgroundDeleted = currentTheme.getColorRegistry().get(ThemeConstants.COLOR_SQL_RESULT_CELL_DELETED_BACK);
- this.backgroundModified = currentTheme.getColorRegistry().get(ThemeConstants.COLOR_SQL_RESULT_CELL_MODIFIED_BACK);
- this.backgroundOdd = currentTheme.getColorRegistry().get(ThemeConstants.COLOR_SQL_RESULT_CELL_ODD_BACK);
- this.backgroundReadOnly = currentTheme.getColorRegistry().get(ThemeConstants.COLOR_SQL_RESULT_CELL_READ_ONLY);
-
- this.spreadsheet.recalculateSizes();
- }
-
- void scrollToRow(RowPosition position)
- {
- switch (position) {
- case FIRST:
- if (recordMode) {
- if (model.getRowCount() > 0) {
- curRow = model.getRow(0);
- } else {
- curRow = null;
- }
- updateRecordMode();
- } else {
- spreadsheet.shiftCursor(0, -spreadsheet.getItemCount(), false);
- }
- break;
- case PREVIOUS:
- if (recordMode && curRow != null && curRow.getVisualNumber() > 0) {
- curRow = model.getRow(curRow.getVisualNumber() - 1);
- updateRecordMode();
- } else {
- spreadsheet.shiftCursor(0, -1, false);
- }
- break;
- case NEXT:
- if (recordMode && curRow != null && curRow.getVisualNumber() < model.getRowCount() - 1) {
- curRow = model.getRow(curRow.getVisualNumber() + 1);
- updateRecordMode();
- } else {
- spreadsheet.shiftCursor(0, 1, false);
- }
- break;
- case LAST:
- if (recordMode && model.getRowCount() > 0) {
- curRow = model.getRow(model.getRowCount() - 1);
- updateRecordMode();
- } else {
- spreadsheet.shiftCursor(0, spreadsheet.getItemCount(), false);
- }
- break;
- }
- updateToolbar();
- }
-
- boolean isColumnReadOnly(DBDAttributeBinding column)
+ public boolean isColumnReadOnly(DBDAttributeBinding column)
{
if (isReadOnly()) {
return true;
@@ -1051,6 +714,20 @@ public class ResultSetViewer extends Viewer
return !newRow;
}
+ private Object savePresentationState() {
+ if (activePresentation instanceof IStatefulControl) {
+ return ((IStatefulControl) activePresentation).saveState();
+ } else {
+ return null;
+ }
+ }
+
+ private void restorePresentationState(Object state) {
+ if (activePresentation instanceof IStatefulControl) {
+ ((IStatefulControl) activePresentation).restoreState(state);
+ }
+ }
+
///////////////////////////////////////
// History
@@ -1107,20 +784,15 @@ public class ResultSetViewer extends Viewer
return curRow;
}
- @Nullable
- public DBDAttributeBinding getFocusAttribute()
- {
- return recordMode ?
- (DBDAttributeBinding) spreadsheet.getFocusRowElement() :
- (DBDAttributeBinding) spreadsheet.getFocusColumnElement();
- }
-
- @Nullable
- public ResultSetRow getFocusRow()
- {
- return recordMode ?
- (ResultSetRow) spreadsheet.getFocusColumnElement() :
- (ResultSetRow) spreadsheet.getFocusRowElement();
+ @Override
+ public void setCurrentRow(@Nullable ResultSetRow curRow) {
+ this.curRow = curRow;
+ if (curState != null && curRow != null) {
+ curState.rowNumber = curRow.getVisualNumber();
+ }
+ if (recordMode) {
+ updateRecordMode();
+ }
}
///////////////////////////////////////
@@ -1181,20 +853,16 @@ public class ResultSetViewer extends Viewer
{
model.setMetaData(columns);
if (model.isMetadataChanged()) {
- this.panelValueController = null;
- this.curAttribute = null;
- //getSpreadsheet().set
+ activePresentation.clearData();
}
}
public void setData(List