提交 31c63e76 编写于 作者: J jurgen

RSV refactoring.

Presentations support
上级 c3f2c949
......@@ -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
......
......@@ -222,7 +222,6 @@
<command id="org.jkiss.dbeaver.core.compare.objects" name="%command.org.jkiss.dbeaver.core.compare.objects.name" description="%command.org.jkiss.dbeaver.core.compare.objects.description" categoryId="org.jkiss.dbeaver.core.util"/>
<command id="org.jkiss.dbeaver.core.resultset.toggleMode" name="%command.org.jkiss.dbeaver.core.resultset.toggleMode.name" description="%command.org.jkiss.dbeaver.core.resultset.toggleMode.description" categoryId="org.jkiss.dbeaver.core.rs"/>
<command id="org.jkiss.dbeaver.core.resultset.togglePreview" name="%command.org.jkiss.dbeaver.core.resultset.togglePreview.name" description="%command.org.jkiss.dbeaver.core.resultset.togglePreview.description" categoryId="org.jkiss.dbeaver.core.rs"/>
<command id="org.jkiss.dbeaver.core.resultset.row.first" name="%command.org.jkiss.dbeaver.core.resultset.row.first.name" description="%command.org.jkiss.dbeaver.core.resultset.row.first.description" categoryId="org.jkiss.dbeaver.core.rs"/>
<command id="org.jkiss.dbeaver.core.resultset.row.previous" name="%command.org.jkiss.dbeaver.core.resultset.row.previous.name" description="%command.org.jkiss.dbeaver.core.resultset.row.previous.description" categoryId="org.jkiss.dbeaver.core.rs"/>
<command id="org.jkiss.dbeaver.core.resultset.row.next" name="%command.org.jkiss.dbeaver.core.resultset.row.next.name" description="%command.org.jkiss.dbeaver.core.resultset.row.next.description" categoryId="org.jkiss.dbeaver.core.rs"/>
......@@ -234,6 +233,7 @@
<command id="org.jkiss.dbeaver.core.resultset.row.delete" name="%command.org.jkiss.dbeaver.core.resultset.row.delete.name" description="%command.org.jkiss.dbeaver.core.resultset.row.delete.description" categoryId="org.jkiss.dbeaver.core.rs"/>
<command id="org.jkiss.dbeaver.core.resultset.applyChanges" name="%command.org.jkiss.dbeaver.core.resultset.applyChanges.name" description="%command.org.jkiss.dbeaver.core.resultset.applyChanges.description" categoryId="org.jkiss.dbeaver.core.rs"/>
<command id="org.jkiss.dbeaver.core.resultset.rejectChanges" name="%command.org.jkiss.dbeaver.core.resultset.rejectChanges.name" description="%command.org.jkiss.dbeaver.core.resultset.rejectChanges.description" categoryId="org.jkiss.dbeaver.core.rs"/>
<command id="org.jkiss.dbeaver.core.resultset.grid.togglePreview" name="%command.org.jkiss.dbeaver.core.resultset.grid.togglePreview.name" description="%command.org.jkiss.dbeaver.core.resultset.grid.togglePreview.description" categoryId="org.jkiss.dbeaver.core.rs"/>
<command id="org.jkiss.dbeaver.core.edit.copy.special" name="%command.org.jkiss.dbeaver.core.edit.copy.special.name" description="%command.org.jkiss.dbeaver.core.edit.copy.special.description" categoryId="org.jkiss.dbeaver.core.util"/>
......@@ -298,7 +298,7 @@
<image commandId="org.jkiss.dbeaver.core.resultset.applyChanges" icon="icons/sql/accept.png"/>
<image commandId="org.jkiss.dbeaver.core.resultset.rejectChanges" icon="icons/sql/cancel.png"/>
<image commandId="org.jkiss.dbeaver.core.resultset.toggleMode" icon="icons/sql/grid.png"/>
<image commandId="org.jkiss.dbeaver.core.resultset.togglePreview" icon="icons/sql/details.png"/>
<image commandId="org.jkiss.dbeaver.core.resultset.grid.togglePreview" icon="icons/sql/details.png"/>
<image commandId="org.jkiss.dbeaver.core.qm.filter" icon="icons/misc/filter.png"/>
<image commandId="org.jkiss.dbeaver.core.qm.clear" icon="IMG_ETOOL_CLEAR"/>
......@@ -950,7 +950,9 @@
<activeWhen><reference definitionId="org.jkiss.dbeaver.core.ui.spreadsheet.control"/></activeWhen>
</handler>
<handler commandId="org.jkiss.dbeaver.core.resultset.grid.togglePreview" class="org.jkiss.dbeaver.ui.controls.resultset.spreadsheet.SpreadsheetTogglePreviewHandler">
<activeWhen><reference definitionId="org.jkiss.dbeaver.core.ui.resultset.part"/></activeWhen>
</handler>
<handler commandId="org.eclipse.ui.edit.selectAll" class="org.jkiss.dbeaver.ui.controls.resultset.spreadsheet.SpreadsheetCommandHandler">
<activeWhen><reference definitionId="org.jkiss.dbeaver.core.ui.spreadsheet.control"/></activeWhen>
<enabledWhen>
......@@ -959,6 +961,7 @@
</with>
</enabledWhen>
</handler>
<handler commandId="org.eclipse.ui.edit.copy" class="org.jkiss.dbeaver.ui.controls.resultset.ResultSetCommandHandler">
<activeWhen><reference definitionId="org.jkiss.dbeaver.core.ui.spreadsheet.control"/></activeWhen>
<enabledWhen>
......@@ -988,14 +991,6 @@
</with>
</enabledWhen>
</handler>
<handler commandId="org.jkiss.dbeaver.core.resultset.togglePreview" class="org.jkiss.dbeaver.ui.controls.resultset.ResultSetModeTogglePreviewHandler">
<activeWhen><reference definitionId="org.jkiss.dbeaver.core.ui.resultset.part"/></activeWhen>
<enabledWhen>
<with variable="activePart">
<test property="org.jkiss.dbeaver.core.resultset.canToggle"/>
</with>
</enabledWhen>
</handler>
<handler commandId="org.jkiss.dbeaver.core.resultset.row.first" class="org.jkiss.dbeaver.ui.controls.resultset.ResultSetCommandHandler">
<activeWhen><reference definitionId="org.jkiss.dbeaver.core.ui.resultset.part"/></activeWhen>
<enabledWhen>
......@@ -1645,7 +1640,6 @@
<extension point="org.eclipse.ui.bindings">
<key commandId="org.jkiss.dbeaver.core.resultset.toggleMode" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" sequence="TAB"/>
<key commandId="org.jkiss.dbeaver.core.resultset.togglePreview" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" sequence="F7"/>
<key commandId="org.jkiss.dbeaver.core.resultset.row.first" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" sequence="CTRL+SHIFT+ARROW_LEFT"/>
<key commandId="org.jkiss.dbeaver.core.resultset.row.previous" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" sequence="CTRL+ARROW_LEFT"/>
<key commandId="org.jkiss.dbeaver.core.resultset.row.next" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" sequence="CTRL+ARROW_RIGHT"/>
......@@ -1657,6 +1651,7 @@
<key commandId="org.jkiss.dbeaver.core.resultset.row.delete" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" sequence="ALT+DELETE"/>
<key commandId="org.jkiss.dbeaver.core.resultset.applyChanges" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" sequence="CTRL+ALT+S"/>
<key commandId="org.jkiss.dbeaver.core.resultset.rejectChanges" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" sequence="CTRL+ALT+R"/>
<key commandId="org.jkiss.dbeaver.core.resultset.grid.togglePreview" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" sequence="F7"/>
<key commandId="org.jkiss.dbeaver.core.edit.copy.special" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" sequence="CTRL+SHIFT+C"/>
<key commandId="org.jkiss.dbeaver.core.navigator.bookmark.add" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" sequence="CTRL+D"/>
......
......@@ -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;
}
}
......@@ -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,
......
......@@ -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();
}
......@@ -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();
}
/*
* 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);
}
......@@ -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);
}
......
......@@ -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;
......
......@@ -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();
}
};
......
......@@ -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
......
......@@ -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(
......
......@@ -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;
}
......
......@@ -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<DBDValue, CollectionElementData>();
}
......
......@@ -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();
}
}
}
}
/*
* 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<DBDAttributeBinding> getRowAttributes()
{
return Arrays.asList(controller.getModel().getColumns());
}
@Nullable
@Override
public Object getAttributeValue(DBDAttributeBinding attribute)
{
return controller.getModel().getCellValue(attribute, curRow);
}
}
......@@ -59,7 +59,7 @@ public class Spreadsheet extends LightGrid implements Listener {
@NotNull
private final IWorkbenchPartSite site;
@NotNull
private final SpreadsheetPresentation spreadsheetController;
private final SpreadsheetPresentation presentation;
@NotNull
private final IGridContentProvider contentProvider;
@NotNull
......@@ -71,7 +71,7 @@ public class Spreadsheet extends LightGrid implements Listener {
@NotNull final Composite parent,
final int style,
@NotNull final IWorkbenchPartSite site,
@NotNull final SpreadsheetPresentation spreadsheetController,
@NotNull final SpreadsheetPresentation presentation,
@NotNull final IGridContentProvider contentProvider,
@NotNull final IGridLabelProvider labelProvider)
{
......@@ -84,7 +84,7 @@ public class Spreadsheet extends LightGrid implements Listener {
this.setLayout(layout);
this.site = site;
this.spreadsheetController = spreadsheetController;
this.presentation = presentation;
this.contentProvider = contentProvider;
this.labelProvider = labelProvider;
......@@ -125,6 +125,11 @@ public class Spreadsheet extends LightGrid implements Listener {
}
}
@NotNull
public SpreadsheetPresentation getPresentation() {
return presentation;
}
public Clipboard getClipboard()
{
return clipboard;
......@@ -234,7 +239,7 @@ public class Spreadsheet extends LightGrid implements Listener {
(event.keyCode >= 'a' && event.keyCode <= 'z') ||
(event.keyCode >= '0' && event.keyCode <= '9'))
{
final Control editorControl = spreadsheetController.showCellEditor(true);
final Control editorControl = presentation.openValueEditor(true);
if (editorControl != null && event.keyCode != SWT.CR) {
// Forward the same key event to just created control
final Event fwdEvent = new Event();
......@@ -254,7 +259,7 @@ public class Spreadsheet extends LightGrid implements Listener {
Object col = getFocusColumnElement();
Object row = getFocusRowElement();
if (col != null && row != null) {
spreadsheetController.resetCellValue(col, row, false);
presentation.resetCellValue(col, row, false);
}
}
break;
......@@ -263,27 +268,27 @@ public class Spreadsheet extends LightGrid implements Listener {
GridPos focusPos = super.getFocusPos();
if (pos != null && focusPos != null && pos.equals(super.getFocusPos())) {
DoubleClickBehavior doubleClickBehavior = DoubleClickBehavior.valueOf(
spreadsheetController.getPreferenceStore().getString(DBeaverPreferences.RESULT_SET_DOUBLE_CLICK));
presentation.getPreferenceStore().getString(DBeaverPreferences.RESULT_SET_DOUBLE_CLICK));
switch (doubleClickBehavior) {
case NONE:
return;
case EDITOR:
spreadsheetController.showCellEditor(false);
presentation.openValueEditor(false);
break;
case INLINE_EDITOR:
spreadsheetController.showCellEditor(true);
presentation.openValueEditor(true);
break;
}
}
break;
case SWT.MouseDown:
if (event.button == 2) {
spreadsheetController.showCellEditor(true);
presentation.openValueEditor(true);
}
break;
case LightGrid.Event_ChangeSort:
spreadsheetController.changeSorting(event.data, event.stateMask);
presentation.changeSorting(event.data, event.stateMask);
break;
case LightGrid.Event_NavigateLink:
// Perform navigation async because it may change grid content and
......@@ -291,7 +296,7 @@ public class Spreadsheet extends LightGrid implements Listener {
getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
spreadsheetController.navigateLink((GridCell) event.data, event.stateMask);
presentation.navigateLink((GridCell) event.data, event.stateMask);
}
});
break;
......@@ -302,6 +307,7 @@ public class Spreadsheet extends LightGrid implements Listener {
public void refreshData(boolean refreshColumns) {
cancelInlineEditor();
super.refreshData(refreshColumns);
super.redraw();
}
private void hookContextMenu()
......@@ -316,7 +322,7 @@ public class Spreadsheet extends LightGrid implements Listener {
// Let controller to provide it's own menu items
GridPos focusPos = getFocusPos();
spreadsheetController.fillContextMenu(
presentation.fillContextMenu(
focusPos.col >= 0 && focusPos.col < columnElements.length ? columnElements[focusPos.col] : null,
focusPos.row >= 0 && focusPos.row < rowElements.length ? rowElements[focusPos.row] : null,
manager);
......
......@@ -35,6 +35,8 @@ import org.jkiss.code.Nullable;
*/
public class SpreadsheetCommandHandler extends AbstractHandler {
public static final String CMD_TOGGLE_PREVIEW = "org.jkiss.dbeaver.core.resultset.grid.togglePreview";
public static Spreadsheet getActiveSpreadsheet(ExecutionEvent event)
{
Object control = HandlerUtil.getVariable(event, ISources.ACTIVE_FOCUS_CONTROL_NAME);
......@@ -57,7 +59,11 @@ public class SpreadsheetCommandHandler extends AbstractHandler {
if (actionId.equals(IWorkbenchCommandConstants.EDIT_SELECT_ALL)) {
spreadsheet.selectAll();
return null;
} else if (actionId.equals(CMD_TOGGLE_PREVIEW)) {
spreadsheet.getPresentation().togglePreview();
return null;
}
Event keyEvent = new Event();
keyEvent.doit = true;
if (actionId.equals(ITextEditorActionDefinitionIds.LINE_START)) {
......
......@@ -16,18 +16,21 @@
* 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;
package org.jkiss.dbeaver.ui.controls.resultset.spreadsheet;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.commands.IElementUpdater;
import org.eclipse.ui.menus.UIElement;
import org.jkiss.dbeaver.ui.controls.resultset.IResultSetContainer;
import org.jkiss.dbeaver.ui.controls.resultset.IResultSetPresentation;
import org.jkiss.dbeaver.ui.controls.resultset.ResultSetViewer;
import java.util.Map;
/**
* ResultSetModeTogglePreviewHandler
*/
public class ResultSetModeTogglePreviewHandler extends ResultSetCommandHandler implements IElementUpdater {
public class SpreadsheetTogglePreviewHandler extends SpreadsheetCommandHandler implements IElementUpdater {
@Override
public void updateElement(UIElement element, Map parameters)
......@@ -37,7 +40,8 @@ public class ResultSetModeTogglePreviewHandler extends ResultSetCommandHandler i
if (partSite.getPart() instanceof IResultSetContainer) {
ResultSetViewer rsv = ((IResultSetContainer) partSite.getPart()).getResultSetViewer();
if (rsv != null) {
if (rsv.isPreviewVisible()) {
IResultSetPresentation presentation = rsv.getActivePresentation();
if (presentation instanceof SpreadsheetPresentation && ((SpreadsheetPresentation) presentation).isPreviewVisible()) {
element.setText("Hide value view panel");
element.setChecked(true);
} else {
......
......@@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.jkiss.dbeaver.ui.controls.resultset;
package org.jkiss.dbeaver.ui.controls.resultset.spreadsheet;
/**
* ThemeConstants
......
......@@ -16,7 +16,7 @@
* 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;
package org.jkiss.dbeaver.ui.controls.resultset.spreadsheet;
import org.eclipse.swt.events.TraverseEvent;
import org.eclipse.swt.events.TraverseListener;
......
......@@ -19,10 +19,15 @@
package org.jkiss.dbeaver.ui.controls.resultset.view;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.swt.SWT;
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;
import org.jkiss.dbeaver.ui.controls.resultset.IResultSetController;
import org.jkiss.dbeaver.ui.controls.resultset.IResultSetPresentation;
......@@ -35,7 +40,7 @@ public class EmptyPresentation implements IResultSetPresentation {
private Composite placeholder;
@Override
public void createPresentation(IResultSetController controller, Composite parent) {
public void createPresentation(@NotNull IResultSetController controller, @NotNull Composite parent) {
placeholder = new Composite(parent, SWT.NONE);
}
......@@ -49,13 +54,28 @@ public class EmptyPresentation implements IResultSetPresentation {
}
@Override
public void formatData(boolean refreshData) {
}
@Override
public void clearData() {
}
@Override
public void updateValueView() {
}
@Override
public void fillToolbar(IToolBarManager toolBar) {
public void fillToolbar(@NotNull IToolBarManager toolBar) {
}
@Override
public void fillMenu(@NotNull IMenuManager menu) {
}
......@@ -64,4 +84,32 @@ public class EmptyPresentation implements IResultSetPresentation {
}
@Override
public void scrollToRow(@NotNull RowPosition position) {
}
@Nullable
@Override
public DBDAttributeBinding getCurrentAttribute() {
return null;
}
@Nullable
@Override
public Control openValueEditor(boolean inline) {
return null;
}
@Nullable
@Override
public String copySelectionToString(boolean copyHeader, boolean copyRowNumbers, boolean cut, String delimiter, DBDDisplayFormat format) {
return null;
}
@Override
public void pasteFromClipboard() {
}
}
......@@ -19,11 +19,16 @@
package org.jkiss.dbeaver.ui.controls.resultset.view;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
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;
import org.jkiss.dbeaver.ui.controls.resultset.IResultSetController;
import org.jkiss.dbeaver.ui.controls.resultset.IResultSetPresentation;
......@@ -36,7 +41,7 @@ public class StatisticsPresentation implements IResultSetPresentation {
private TableViewer tableViewer;
@Override
public void createPresentation(IResultSetController controller, Composite parent) {
public void createPresentation(@NotNull IResultSetController controller, @NotNull Composite parent) {
tableViewer = new TableViewer(parent, SWT.MULTI | SWT.FULL_SELECTION);
}
......@@ -50,13 +55,28 @@ public class StatisticsPresentation implements IResultSetPresentation {
tableViewer.refresh();
}
@Override
public void formatData(boolean refreshData) {
}
@Override
public void clearData() {
}
@Override
public void updateValueView() {
}
@Override
public void fillToolbar(IToolBarManager toolBar) {
public void fillToolbar(@NotNull IToolBarManager toolBar) {
}
@Override
public void fillMenu(@NotNull IMenuManager menu) {
}
......@@ -65,4 +85,32 @@ public class StatisticsPresentation implements IResultSetPresentation {
}
@Override
public void scrollToRow(@NotNull RowPosition position) {
}
@Nullable
@Override
public DBDAttributeBinding getCurrentAttribute() {
return null;
}
@Nullable
@Override
public Control openValueEditor(boolean inline) {
return null;
}
@Nullable
@Override
public String copySelectionToString(boolean copyHeader, boolean copyRowNumbers, boolean cut, String delimiter, DBDDisplayFormat format) {
return null;
}
@Override
public void pasteFromClipboard() {
}
}
......@@ -132,7 +132,7 @@ public class DatabaseDataEditor extends AbstractDatabaseObjectEditor<DBSDataCont
{
createResultSetView();
if (resultSetView != null) {
resultSetView.getSpreadsheet().setFocus();
resultSetView.getActivePresentation().getControl().setFocus();
}
// Register find/replace action
......
......@@ -334,7 +334,7 @@ public class SQLEditor extends SQLEditorBase
curQueryProcessor = resultsProvider.queryProcessor;
ResultSetViewer rsv = resultsProvider.getResultSetViewer();
if (rsv != null) {
rsv.getSpreadsheet().setFocus();
rsv.getActivePresentation().getControl().setFocus();
}
} else if (data == outputViewer) {
((CTabItem) e.item).setImage(IMG_OUTPUT);
......@@ -347,8 +347,8 @@ public class SQLEditor extends SQLEditorBase
public void keyTraversed(TraverseEvent e) {
if (e.detail == SWT.TRAVERSE_PAGE_NEXT) {
ResultSetViewer viewer = getResultSetViewer();
if (viewer != null && viewer.getSpreadsheet().isVisible()) {
viewer.getSpreadsheet().setFocus();
if (viewer != null && viewer.getActivePresentation().getControl().isVisible()) {
viewer.getActivePresentation().getControl().setFocus();
e.doit = false;
e.detail = SWT.TRAVERSE_NONE;
}
......@@ -1165,10 +1165,10 @@ public class SQLEditor extends SQLEditorBase
this.resultSetNumber = resultSetNumber;
viewer = new ResultSetViewer(resultTabs, getSite(), this);
selectionProvider.trackProvider(viewer.getSpreadsheet(), viewer);
selectionProvider.trackProvider(viewer.getActivePresentation().getControl(), viewer);
// Find/replace target activation
viewer.getSpreadsheet().addFocusListener(new FocusAdapter() {
viewer.getActivePresentation().getControl().addFocusListener(new FocusAdapter() {
@Override
public void focusGained(FocusEvent e)
{
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册