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

RSV refactoring.

Presentations support
上级 c3f2c949
...@@ -128,8 +128,8 @@ command.org.jkiss.dbeaver.core.compare.objects.description=Compare database obje ...@@ -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.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.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.grid.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.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.name=First row
command.org.jkiss.dbeaver.core.resultset.row.first.description=Move to 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 command.org.jkiss.dbeaver.core.resultset.row.previous.name=Previous row
......
...@@ -222,7 +222,6 @@ ...@@ -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.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.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.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.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"/> <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 @@ ...@@ -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.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.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.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"/> <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 @@ ...@@ -298,7 +298,7 @@
<image commandId="org.jkiss.dbeaver.core.resultset.applyChanges" icon="icons/sql/accept.png"/> <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.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.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.filter" icon="icons/misc/filter.png"/>
<image commandId="org.jkiss.dbeaver.core.qm.clear" icon="IMG_ETOOL_CLEAR"/> <image commandId="org.jkiss.dbeaver.core.qm.clear" icon="IMG_ETOOL_CLEAR"/>
...@@ -950,7 +950,9 @@ ...@@ -950,7 +950,9 @@
<activeWhen><reference definitionId="org.jkiss.dbeaver.core.ui.spreadsheet.control"/></activeWhen> <activeWhen><reference definitionId="org.jkiss.dbeaver.core.ui.spreadsheet.control"/></activeWhen>
</handler> </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"> <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> <activeWhen><reference definitionId="org.jkiss.dbeaver.core.ui.spreadsheet.control"/></activeWhen>
<enabledWhen> <enabledWhen>
...@@ -959,6 +961,7 @@ ...@@ -959,6 +961,7 @@
</with> </with>
</enabledWhen> </enabledWhen>
</handler> </handler>
<handler commandId="org.eclipse.ui.edit.copy" class="org.jkiss.dbeaver.ui.controls.resultset.ResultSetCommandHandler"> <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> <activeWhen><reference definitionId="org.jkiss.dbeaver.core.ui.spreadsheet.control"/></activeWhen>
<enabledWhen> <enabledWhen>
...@@ -988,14 +991,6 @@ ...@@ -988,14 +991,6 @@
</with> </with>
</enabledWhen> </enabledWhen>
</handler> </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"> <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> <activeWhen><reference definitionId="org.jkiss.dbeaver.core.ui.resultset.part"/></activeWhen>
<enabledWhen> <enabledWhen>
...@@ -1645,7 +1640,6 @@ ...@@ -1645,7 +1640,6 @@
<extension point="org.eclipse.ui.bindings"> <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.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.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.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"/> <key commandId="org.jkiss.dbeaver.core.resultset.row.next" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" sequence="CTRL+ARROW_RIGHT"/>
...@@ -1657,6 +1651,7 @@ ...@@ -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.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.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.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.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"/> <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; ...@@ -35,7 +35,7 @@ import java.util.List;
* Complex value element. * Complex value element.
* Map pair or array item * Map pair or array item
*/ */
class CollectionElementData { public class CollectionElementData {
static final Log log = Log.getLog(CollectionElementData.class); static final Log log = Log.getLog(CollectionElementData.class);
...@@ -67,4 +67,11 @@ class CollectionElementData { ...@@ -67,4 +67,11 @@ class CollectionElementData {
} }
} }
public DBDAttributeBinding getCollectionBinding() {
return collectionBinding;
}
public DBDAttributeBindingElement[] getElements() {
return elements;
}
} }
...@@ -68,7 +68,7 @@ class FilterValueEditDialog extends BaseDialog { ...@@ -68,7 +68,7 @@ class FilterValueEditDialog extends BaseDialog {
editorPlaceholder.setLayoutData(new GridData(GridData.FILL_BOTH)); editorPlaceholder.setLayoutData(new GridData(GridData.FILL_BOTH));
editorPlaceholder.setLayout(new FillLayout()); editorPlaceholder.setLayout(new FillLayout());
final ResultSetViewer.ResultSetValueController valueController = new ResultSetViewer.ResultSetValueController( final ResultSetValueController valueController = new ResultSetValueController(
viewer, viewer,
attr, attr,
row, row,
......
...@@ -21,6 +21,7 @@ package org.jkiss.dbeaver.ui.controls.resultset; ...@@ -21,6 +21,7 @@ package org.jkiss.dbeaver.ui.controls.resultset;
import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.swt.graphics.Color;
import org.eclipse.ui.IWorkbenchPartSite; import org.eclipse.ui.IWorkbenchPartSite;
import org.jkiss.code.NotNull; import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable; import org.jkiss.code.Nullable;
...@@ -35,6 +36,8 @@ import org.jkiss.dbeaver.model.struct.DBSDataContainer; ...@@ -35,6 +36,8 @@ import org.jkiss.dbeaver.model.struct.DBSDataContainer;
*/ */
public interface IResultSetController { public interface IResultSetController {
public static final String MENU_GROUP_EDIT = "edit";
@NotNull @NotNull
IWorkbenchPartSite getSite(); IWorkbenchPartSite getSite();
...@@ -49,10 +52,14 @@ public interface IResultSetController { ...@@ -49,10 +52,14 @@ public interface IResultSetController {
boolean hasData(); boolean hasData();
boolean isHasMoreData();
boolean isReadOnly(); boolean isReadOnly();
boolean isRecordMode(); boolean isRecordMode();
boolean isColumnReadOnly(DBDAttributeBinding attr);
@NotNull @NotNull
IPreferenceStore getPreferenceStore(); IPreferenceStore getPreferenceStore();
...@@ -60,13 +67,43 @@ public interface IResultSetController { ...@@ -60,13 +67,43 @@ public interface IResultSetController {
void rejectChanges(); 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); void fillContextMenu(@NotNull IMenuManager manager, @Nullable DBDAttributeBinding attr, @Nullable ResultSetRow row);
@Nullable @Nullable
ResultSetRow getCurrentRow(); ResultSetRow getCurrentRow();
void setCurrentRow(@Nullable ResultSetRow row);
void navigateAssociation(@NotNull DBRProgressMonitor monitor, @NotNull DBDAttributeBinding attr, @NotNull ResultSetRow row) void navigateAssociation(@NotNull DBRProgressMonitor monitor, @NotNull DBDAttributeBinding attr, @NotNull ResultSetRow row)
throws DBException; throws DBException;
void updateValueView(); void updateValueView();
void updateEditControls();
void fireResultSetChange();
void setStatus(String message, boolean error);
Color getDefaultBackground();
Color getDefaultForeground();
IResultSetPresentation getActivePresentation();
} }
...@@ -19,29 +19,69 @@ ...@@ -19,29 +19,69 @@
package org.jkiss.dbeaver.ui.controls.resultset; package org.jkiss.dbeaver.ui.controls.resultset;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control; 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. * Result set renderer.
* Visualizes result set viewer/editor. * Visualizes result set viewer/editor.
* *
* May additionally implement ISelectionProvider * May additionally implement ISelectionProvider, IStatefulControl
*/ */
public interface IResultSetPresentation { 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(); Control getControl();
void refreshData(boolean refreshMetadata); void refreshData(boolean refreshMetadata);
/**
* Called after results refresh
* @param refreshData data was refreshed
*/
void formatData(boolean refreshData);
void clearData();
void updateValueView(); void updateValueView();
void fillToolbar(IToolBarManager toolBar); void fillToolbar(@NotNull IToolBarManager toolBar);
void fillMenu(@NotNull IMenuManager menu);
void changeMode(boolean recordMode); 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; ...@@ -27,7 +27,6 @@ import org.eclipse.ui.handlers.HandlerUtil;
import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds; import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;
import org.jkiss.code.Nullable; import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.model.data.DBDDisplayFormat; import org.jkiss.dbeaver.model.data.DBDDisplayFormat;
import org.jkiss.dbeaver.ui.controls.resultset.spreadsheet.SpreadsheetCommandHandler;
import org.jkiss.dbeaver.ui.editors.MultiPageAbstractEditor; import org.jkiss.dbeaver.ui.editors.MultiPageAbstractEditor;
/** /**
...@@ -35,7 +34,6 @@ import org.jkiss.dbeaver.ui.editors.MultiPageAbstractEditor; ...@@ -35,7 +34,6 @@ import org.jkiss.dbeaver.ui.editors.MultiPageAbstractEditor;
*/ */
public class ResultSetCommandHandler extends AbstractHandler { 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_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_FIRST = "org.jkiss.dbeaver.core.resultset.row.first";
public static final String CMD_ROW_PREVIOUS = "org.jkiss.dbeaver.core.resultset.row.previous"; public static final String CMD_ROW_PREVIOUS = "org.jkiss.dbeaver.core.resultset.row.previous";
...@@ -62,20 +60,18 @@ public class ResultSetCommandHandler extends AbstractHandler { ...@@ -62,20 +60,18 @@ public class ResultSetCommandHandler extends AbstractHandler {
resultSet.refresh(); resultSet.refresh();
} else if (actionId.equals(CMD_TOGGLE_MODE)) { } else if (actionId.equals(CMD_TOGGLE_MODE)) {
resultSet.toggleMode(); resultSet.toggleMode();
} else if (actionId.equals(CMD_TOGGLE_PREVIEW)) {
resultSet.togglePreview();
} else if (actionId.equals(CMD_ROW_PREVIOUS) || actionId.equals(ITextEditorActionDefinitionIds.WORD_PREVIOUS)) { } 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)) { } 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)) { } 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)) { } 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)) { } else if (actionId.equals(CMD_ROW_EDIT)) {
resultSet.showCellEditor(false); resultSet.getActivePresentation().openValueEditor(false);
} else if (actionId.equals(CMD_ROW_EDIT_INLINE)) { } else if (actionId.equals(CMD_ROW_EDIT_INLINE)) {
resultSet.showCellEditor(true); resultSet.getActivePresentation().openValueEditor(true);
} else if (actionId.equals(CMD_ROW_ADD)) { } else if (actionId.equals(CMD_ROW_ADD)) {
resultSet.addNewRow(false); resultSet.addNewRow(false);
} else if (actionId.equals(CMD_ROW_COPY)) { } else if (actionId.equals(CMD_ROW_COPY)) {
...@@ -87,13 +83,18 @@ public class ResultSetCommandHandler extends AbstractHandler { ...@@ -87,13 +83,18 @@ public class ResultSetCommandHandler extends AbstractHandler {
} else if (actionId.equals(CMD_REJECT_CHANGES)) { } else if (actionId.equals(CMD_REJECT_CHANGES)) {
resultSet.rejectChanges(); resultSet.rejectChanges();
} else if (actionId.equals(IWorkbenchCommandConstants.EDIT_COPY)) { } 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)) { } else if (actionId.equals(IWorkbenchCommandConstants.EDIT_PASTE)) {
resultSet.pasteCellValue(); resultSet.getActivePresentation().pasteFromClipboard();
} else if (actionId.equals(IWorkbenchCommandConstants.EDIT_CUT)) { } 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)) { } else if (actionId.equals(ITextEditorActionDefinitionIds.SMART_ENTER)) {
resultSet.showCellEditor(false); resultSet.getActivePresentation().openValueEditor(false);
} }
......
...@@ -52,12 +52,12 @@ public class ResultSetCopySpecialHandler extends ResultSetCommandHandler impleme ...@@ -52,12 +52,12 @@ public class ResultSetCopySpecialHandler extends ResultSetCommandHandler impleme
if (event.getCommand().getId().equals(ICommandIds.CMD_COPY_SPECIAL)) { if (event.getCommand().getId().equals(ICommandIds.CMD_COPY_SPECIAL)) {
ConfigDialog configDialog = new ConfigDialog(HandlerUtil.getActiveShell(event)); ConfigDialog configDialog = new ConfigDialog(HandlerUtil.getActiveShell(event));
if (configDialog.open() == IDialogConstants.OK_ID) { if (configDialog.open() == IDialogConstants.OK_ID) {
resultSet.copySelectionToClipboard( ResultSetUtils.copyToClipboard(resultSet.getActivePresentation().copySelectionToString(
configDialog.copyHeader, configDialog.copyHeader,
configDialog.copyRows, configDialog.copyRows,
false, false,
configDialog.delimiter, configDialog.delimiter,
configDialog.format); configDialog.format));
} }
} }
return null; return null;
......
...@@ -178,10 +178,10 @@ class ResultSetDataPumpJob extends DataSourceJob { ...@@ -178,10 +178,10 @@ class ResultSetDataPumpJob extends DataSourceJob {
return Status.OK_STATUS; return Status.OK_STATUS;
} }
private void showProgress(final Composite spreadsheet) { private void showProgress(final Composite progressPlaceholder) {
if (progressOverlay == null) { if (progressOverlay == null) {
// Start progress visualization // Start progress visualization
cancelButton = new Button(spreadsheet, SWT.PUSH); cancelButton = new Button(progressPlaceholder, SWT.PUSH);
cancelButton.setText("Cancel"); cancelButton.setText("Cancel");
GridData gd = new GridData(GridData.FILL_BOTH); GridData gd = new GridData(GridData.FILL_BOTH);
gd.verticalIndent = DBIcon.PROGRESS0.getImage().getBounds().height * 2; gd.verticalIndent = DBIcon.PROGRESS0.getImage().getBounds().height * 2;
...@@ -221,18 +221,18 @@ class ResultSetDataPumpJob extends DataSourceJob { ...@@ -221,18 +221,18 @@ class ResultSetDataPumpJob extends DataSourceJob {
int statusX = (buttonBounds.x + buttonBounds.width / 2) - statusSize.x / 2; int statusX = (buttonBounds.x + buttonBounds.width / 2) - statusSize.x / 2;
int statusY = buttonBounds.y - imageBounds.height - 10 - statusSize.y; int statusY = buttonBounds.y - imageBounds.height - 10 - statusSize.y;
e.gc.setForeground(spreadsheet.getForeground()); e.gc.setForeground(progressPlaceholder.getForeground());
e.gc.setBackground(spreadsheet.getBackground()); e.gc.setBackground(progressPlaceholder.getBackground());
e.gc.fillRectangle(statusX - 2, statusY - 2, statusSize.x + 4, statusSize.y + 4); e.gc.fillRectangle(statusX - 2, statusY - 2, statusSize.x + 4, statusSize.y + 4);
e.gc.drawText(status, statusX, statusY, true); e.gc.drawText(status, statusX, statusY, true);
} }
}; };
spreadsheet.addPaintListener(painListener); progressPlaceholder.addPaintListener(painListener);
progressOverlay = new ControlEditor(spreadsheet) { progressOverlay = new ControlEditor(progressPlaceholder) {
@Override @Override
public void layout() { public void layout() {
spreadsheet.redraw(); progressPlaceholder.redraw();
super.layout(); super.layout();
} }
}; };
......
...@@ -510,7 +510,7 @@ public class ResultSetModel { ...@@ -510,7 +510,7 @@ public class ResultSetModel {
} }
} }
boolean isColumnReadOnly(@NotNull DBDAttributeBinding column) public boolean isColumnReadOnly(@NotNull DBDAttributeBinding column)
{ {
if (column.getMetaAttribute().isReadOnly()) { if (column.getMetaAttribute().isReadOnly()) {
return true; return true;
...@@ -673,7 +673,7 @@ public class ResultSetModel { ...@@ -673,7 +673,7 @@ public class ResultSetModel {
this.dataFilter.setAnyConstraint(filter.isAnyConstraint()); this.dataFilter.setAnyConstraint(filter.isAnyConstraint());
} }
void resetOrdering() public void resetOrdering()
{ {
final boolean hasOrdering = dataFilter.hasOrdering(); final boolean hasOrdering = dataFilter.hasOrdering();
// Sort locally // Sort locally
......
...@@ -219,10 +219,10 @@ class ResultSetPersister { ...@@ -219,10 +219,10 @@ class ResultSetPersister {
} }
model.refreshChangeCount(); model.refreshChangeCount();
viewer.refreshSpreadsheet(rowsChanged); viewer.redrawData(rowsChanged);
viewer.fireResultSetChange(); viewer.fireResultSetChange();
viewer.updateEditControls(); viewer.updateEditControls();
viewer.previewValue(); viewer.getActivePresentation().updateValueView();
} }
// Reflect data changes in viewer // Reflect data changes in viewer
...@@ -330,7 +330,7 @@ class ResultSetPersister { ...@@ -330,7 +330,7 @@ class ResultSetPersister {
} }
if (!viewer.getControl().isDisposed()) { if (!viewer.getControl().isDisposed()) {
//releaseStatements(); //releaseStatements();
viewer.refreshSpreadsheet(rowsChanged); viewer.redrawData(rowsChanged);
viewer.updateEditControls(); viewer.updateEditControls();
if (error == null) { if (error == null) {
viewer.setStatus( viewer.setStatus(
......
...@@ -52,9 +52,9 @@ public class ResultSetPropertyTester extends PropertyTester ...@@ -52,9 +52,9 @@ public class ResultSetPropertyTester extends PropertyTester
} else if (PROP_HAS_DATA.equals(property)) { } else if (PROP_HAS_DATA.equals(property)) {
return rsv.getModel().getRowCount() > 0; return rsv.getModel().getRowCount() > 0;
} else if (PROP_CAN_COPY.equals(property)) { } 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)) { } 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); return attr != null && !rsv.isColumnReadOnly(attr);
} else if (PROP_CAN_MOVE.equals(property)) { } else if (PROP_CAN_MOVE.equals(property)) {
ResultSetRow currentRow = rsv.getCurrentRow(); ResultSetRow currentRow = rsv.getCurrentRow();
...@@ -68,7 +68,7 @@ public class ResultSetPropertyTester extends PropertyTester ...@@ -68,7 +68,7 @@ public class ResultSetPropertyTester extends PropertyTester
return false; return false;
} }
if ("edit".equals(expectedValue) || "inline".equals(expectedValue)) { if ("edit".equals(expectedValue) || "inline".equals(expectedValue)) {
DBDAttributeBinding attr = rsv.getFocusAttribute(); DBDAttributeBinding attr = rsv.getActivePresentation().getCurrentAttribute();
if (attr == null) { if (attr == null) {
return false; return false;
} }
......
...@@ -34,9 +34,9 @@ import java.util.Map; ...@@ -34,9 +34,9 @@ import java.util.Map;
*/ */
public class ResultSetRow { public class ResultSetRow {
static final byte STATE_NORMAL = 1; public static final byte STATE_NORMAL = 1;
static final byte STATE_ADDED = 2; public static final byte STATE_ADDED = 2;
static final byte STATE_REMOVED = 3; public static final byte STATE_REMOVED = 3;
// Physical row number // Physical row number
private int rowNumber; private int rowNumber;
...@@ -118,7 +118,7 @@ public class ResultSetRow { ...@@ -118,7 +118,7 @@ public class ResultSetRow {
} }
@NotNull @NotNull
CollectionElementData getCollectionData(DBDAttributeBinding binding, DBDCollection collection) { public CollectionElementData getCollectionData(DBDAttributeBinding binding, DBDCollection collection) {
if (collections == null) { if (collections == null) {
collections = new HashMap<DBDValue, CollectionElementData>(); collections = new HashMap<DBDValue, CollectionElementData>();
} }
......
...@@ -19,14 +19,18 @@ ...@@ -19,14 +19,18 @@
package org.jkiss.dbeaver.ui.controls.resultset; 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.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.core.Log; import org.jkiss.dbeaver.core.Log;
import org.jkiss.dbeaver.model.DBPDataSource;
import org.jkiss.dbeaver.model.DBUtils; import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.data.*; import org.jkiss.dbeaver.model.data.*;
import org.jkiss.dbeaver.model.exec.DBCAttributeMetaData; import org.jkiss.dbeaver.model.exec.*;
import org.jkiss.dbeaver.model.exec.DBCEntityMetaData;
import org.jkiss.dbeaver.model.exec.DBCSession;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.sql.SQLQuery; import org.jkiss.dbeaver.model.sql.SQLQuery;
import org.jkiss.dbeaver.model.struct.*; import org.jkiss.dbeaver.model.struct.*;
...@@ -35,6 +39,7 @@ import org.jkiss.dbeaver.model.struct.rdb.DBSTable; ...@@ -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.struct.rdb.DBSTableIndex;
import org.jkiss.dbeaver.model.virtual.DBVEntity; import org.jkiss.dbeaver.model.virtual.DBVEntity;
import org.jkiss.dbeaver.model.virtual.DBVEntityConstraint; import org.jkiss.dbeaver.model.virtual.DBVEntityConstraint;
import org.jkiss.dbeaver.runtime.VoidProgressMonitor;
import org.jkiss.utils.CommonUtils; import org.jkiss.utils.CommonUtils;
import java.util.*; import java.util.*;
...@@ -42,7 +47,7 @@ import java.util.*; ...@@ -42,7 +47,7 @@ import java.util.*;
/** /**
* Utils * Utils
*/ */
class ResultSetUtils public class ResultSetUtils
{ {
static final Log log = Log.getLog(ResultSetUtils.class); static final Log log = Log.getLog(ResultSetUtils.class);
...@@ -248,4 +253,35 @@ class ResultSetUtils ...@@ -248,4 +253,35 @@ class ResultSetUtils
attr1.getTypeID() == attr2.getTypeID() && attr1.getTypeID() == attr2.getTypeID() &&
CommonUtils.equalObjects(attr1.getTypeName(), attr2.getTypeName()); 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 { ...@@ -59,7 +59,7 @@ public class Spreadsheet extends LightGrid implements Listener {
@NotNull @NotNull
private final IWorkbenchPartSite site; private final IWorkbenchPartSite site;
@NotNull @NotNull
private final SpreadsheetPresentation spreadsheetController; private final SpreadsheetPresentation presentation;
@NotNull @NotNull
private final IGridContentProvider contentProvider; private final IGridContentProvider contentProvider;
@NotNull @NotNull
...@@ -71,7 +71,7 @@ public class Spreadsheet extends LightGrid implements Listener { ...@@ -71,7 +71,7 @@ public class Spreadsheet extends LightGrid implements Listener {
@NotNull final Composite parent, @NotNull final Composite parent,
final int style, final int style,
@NotNull final IWorkbenchPartSite site, @NotNull final IWorkbenchPartSite site,
@NotNull final SpreadsheetPresentation spreadsheetController, @NotNull final SpreadsheetPresentation presentation,
@NotNull final IGridContentProvider contentProvider, @NotNull final IGridContentProvider contentProvider,
@NotNull final IGridLabelProvider labelProvider) @NotNull final IGridLabelProvider labelProvider)
{ {
...@@ -84,7 +84,7 @@ public class Spreadsheet extends LightGrid implements Listener { ...@@ -84,7 +84,7 @@ public class Spreadsheet extends LightGrid implements Listener {
this.setLayout(layout); this.setLayout(layout);
this.site = site; this.site = site;
this.spreadsheetController = spreadsheetController; this.presentation = presentation;
this.contentProvider = contentProvider; this.contentProvider = contentProvider;
this.labelProvider = labelProvider; this.labelProvider = labelProvider;
...@@ -125,6 +125,11 @@ public class Spreadsheet extends LightGrid implements Listener { ...@@ -125,6 +125,11 @@ public class Spreadsheet extends LightGrid implements Listener {
} }
} }
@NotNull
public SpreadsheetPresentation getPresentation() {
return presentation;
}
public Clipboard getClipboard() public Clipboard getClipboard()
{ {
return clipboard; return clipboard;
...@@ -234,7 +239,7 @@ public class Spreadsheet extends LightGrid implements Listener { ...@@ -234,7 +239,7 @@ public class Spreadsheet extends LightGrid implements Listener {
(event.keyCode >= 'a' && event.keyCode <= 'z') || (event.keyCode >= 'a' && event.keyCode <= 'z') ||
(event.keyCode >= '0' && event.keyCode <= '9')) (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) { if (editorControl != null && event.keyCode != SWT.CR) {
// Forward the same key event to just created control // Forward the same key event to just created control
final Event fwdEvent = new Event(); final Event fwdEvent = new Event();
...@@ -254,7 +259,7 @@ public class Spreadsheet extends LightGrid implements Listener { ...@@ -254,7 +259,7 @@ public class Spreadsheet extends LightGrid implements Listener {
Object col = getFocusColumnElement(); Object col = getFocusColumnElement();
Object row = getFocusRowElement(); Object row = getFocusRowElement();
if (col != null && row != null) { if (col != null && row != null) {
spreadsheetController.resetCellValue(col, row, false); presentation.resetCellValue(col, row, false);
} }
} }
break; break;
...@@ -263,27 +268,27 @@ public class Spreadsheet extends LightGrid implements Listener { ...@@ -263,27 +268,27 @@ public class Spreadsheet extends LightGrid implements Listener {
GridPos focusPos = super.getFocusPos(); GridPos focusPos = super.getFocusPos();
if (pos != null && focusPos != null && pos.equals(super.getFocusPos())) { if (pos != null && focusPos != null && pos.equals(super.getFocusPos())) {
DoubleClickBehavior doubleClickBehavior = DoubleClickBehavior.valueOf( DoubleClickBehavior doubleClickBehavior = DoubleClickBehavior.valueOf(
spreadsheetController.getPreferenceStore().getString(DBeaverPreferences.RESULT_SET_DOUBLE_CLICK)); presentation.getPreferenceStore().getString(DBeaverPreferences.RESULT_SET_DOUBLE_CLICK));
switch (doubleClickBehavior) { switch (doubleClickBehavior) {
case NONE: case NONE:
return; return;
case EDITOR: case EDITOR:
spreadsheetController.showCellEditor(false); presentation.openValueEditor(false);
break; break;
case INLINE_EDITOR: case INLINE_EDITOR:
spreadsheetController.showCellEditor(true); presentation.openValueEditor(true);
break; break;
} }
} }
break; break;
case SWT.MouseDown: case SWT.MouseDown:
if (event.button == 2) { if (event.button == 2) {
spreadsheetController.showCellEditor(true); presentation.openValueEditor(true);
} }
break; break;
case LightGrid.Event_ChangeSort: case LightGrid.Event_ChangeSort:
spreadsheetController.changeSorting(event.data, event.stateMask); presentation.changeSorting(event.data, event.stateMask);
break; break;
case LightGrid.Event_NavigateLink: case LightGrid.Event_NavigateLink:
// Perform navigation async because it may change grid content and // Perform navigation async because it may change grid content and
...@@ -291,7 +296,7 @@ public class Spreadsheet extends LightGrid implements Listener { ...@@ -291,7 +296,7 @@ public class Spreadsheet extends LightGrid implements Listener {
getDisplay().asyncExec(new Runnable() { getDisplay().asyncExec(new Runnable() {
@Override @Override
public void run() { public void run() {
spreadsheetController.navigateLink((GridCell) event.data, event.stateMask); presentation.navigateLink((GridCell) event.data, event.stateMask);
} }
}); });
break; break;
...@@ -302,6 +307,7 @@ public class Spreadsheet extends LightGrid implements Listener { ...@@ -302,6 +307,7 @@ public class Spreadsheet extends LightGrid implements Listener {
public void refreshData(boolean refreshColumns) { public void refreshData(boolean refreshColumns) {
cancelInlineEditor(); cancelInlineEditor();
super.refreshData(refreshColumns); super.refreshData(refreshColumns);
super.redraw();
} }
private void hookContextMenu() private void hookContextMenu()
...@@ -316,7 +322,7 @@ public class Spreadsheet extends LightGrid implements Listener { ...@@ -316,7 +322,7 @@ public class Spreadsheet extends LightGrid implements Listener {
// Let controller to provide it's own menu items // Let controller to provide it's own menu items
GridPos focusPos = getFocusPos(); GridPos focusPos = getFocusPos();
spreadsheetController.fillContextMenu( presentation.fillContextMenu(
focusPos.col >= 0 && focusPos.col < columnElements.length ? columnElements[focusPos.col] : null, focusPos.col >= 0 && focusPos.col < columnElements.length ? columnElements[focusPos.col] : null,
focusPos.row >= 0 && focusPos.row < rowElements.length ? rowElements[focusPos.row] : null, focusPos.row >= 0 && focusPos.row < rowElements.length ? rowElements[focusPos.row] : null,
manager); manager);
......
...@@ -35,6 +35,8 @@ import org.jkiss.code.Nullable; ...@@ -35,6 +35,8 @@ import org.jkiss.code.Nullable;
*/ */
public class SpreadsheetCommandHandler extends AbstractHandler { 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) public static Spreadsheet getActiveSpreadsheet(ExecutionEvent event)
{ {
Object control = HandlerUtil.getVariable(event, ISources.ACTIVE_FOCUS_CONTROL_NAME); Object control = HandlerUtil.getVariable(event, ISources.ACTIVE_FOCUS_CONTROL_NAME);
...@@ -57,7 +59,11 @@ public class SpreadsheetCommandHandler extends AbstractHandler { ...@@ -57,7 +59,11 @@ public class SpreadsheetCommandHandler extends AbstractHandler {
if (actionId.equals(IWorkbenchCommandConstants.EDIT_SELECT_ALL)) { if (actionId.equals(IWorkbenchCommandConstants.EDIT_SELECT_ALL)) {
spreadsheet.selectAll(); spreadsheet.selectAll();
return null; return null;
} else if (actionId.equals(CMD_TOGGLE_PREVIEW)) {
spreadsheet.getPresentation().togglePreview();
return null;
} }
Event keyEvent = new Event(); Event keyEvent = new Event();
keyEvent.doit = true; keyEvent.doit = true;
if (actionId.equals(ITextEditorActionDefinitionIds.LINE_START)) { if (actionId.equals(ITextEditorActionDefinitionIds.LINE_START)) {
......
...@@ -16,18 +16,21 @@ ...@@ -16,18 +16,21 @@
* License along with this library; if not, write to the Free Software * License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * 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.IWorkbenchPartSite;
import org.eclipse.ui.commands.IElementUpdater; import org.eclipse.ui.commands.IElementUpdater;
import org.eclipse.ui.menus.UIElement; 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; import java.util.Map;
/** /**
* ResultSetModeTogglePreviewHandler * ResultSetModeTogglePreviewHandler
*/ */
public class ResultSetModeTogglePreviewHandler extends ResultSetCommandHandler implements IElementUpdater { public class SpreadsheetTogglePreviewHandler extends SpreadsheetCommandHandler implements IElementUpdater {
@Override @Override
public void updateElement(UIElement element, Map parameters) public void updateElement(UIElement element, Map parameters)
...@@ -37,7 +40,8 @@ public class ResultSetModeTogglePreviewHandler extends ResultSetCommandHandler i ...@@ -37,7 +40,8 @@ public class ResultSetModeTogglePreviewHandler extends ResultSetCommandHandler i
if (partSite.getPart() instanceof IResultSetContainer) { if (partSite.getPart() instanceof IResultSetContainer) {
ResultSetViewer rsv = ((IResultSetContainer) partSite.getPart()).getResultSetViewer(); ResultSetViewer rsv = ((IResultSetContainer) partSite.getPart()).getResultSetViewer();
if (rsv != null) { if (rsv != null) {
if (rsv.isPreviewVisible()) { IResultSetPresentation presentation = rsv.getActivePresentation();
if (presentation instanceof SpreadsheetPresentation && ((SpreadsheetPresentation) presentation).isPreviewVisible()) {
element.setText("Hide value view panel"); element.setText("Hide value view panel");
element.setChecked(true); element.setChecked(true);
} else { } else {
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * 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 * ThemeConstants
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
* License along with this library; if not, write to the Free Software * License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * 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.TraverseEvent;
import org.eclipse.swt.events.TraverseListener; import org.eclipse.swt.events.TraverseListener;
......
...@@ -19,10 +19,15 @@ ...@@ -19,10 +19,15 @@
package org.jkiss.dbeaver.ui.controls.resultset.view; package org.jkiss.dbeaver.ui.controls.resultset.view;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.swt.SWT; import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control; 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.IResultSetController;
import org.jkiss.dbeaver.ui.controls.resultset.IResultSetPresentation; import org.jkiss.dbeaver.ui.controls.resultset.IResultSetPresentation;
...@@ -35,7 +40,7 @@ public class EmptyPresentation implements IResultSetPresentation { ...@@ -35,7 +40,7 @@ public class EmptyPresentation implements IResultSetPresentation {
private Composite placeholder; private Composite placeholder;
@Override @Override
public void createPresentation(IResultSetController controller, Composite parent) { public void createPresentation(@NotNull IResultSetController controller, @NotNull Composite parent) {
placeholder = new Composite(parent, SWT.NONE); placeholder = new Composite(parent, SWT.NONE);
} }
...@@ -49,13 +54,28 @@ public class EmptyPresentation implements IResultSetPresentation { ...@@ -49,13 +54,28 @@ public class EmptyPresentation implements IResultSetPresentation {
} }
@Override
public void formatData(boolean refreshData) {
}
@Override
public void clearData() {
}
@Override @Override
public void updateValueView() { public void updateValueView() {
} }
@Override @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 { ...@@ -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 @@ ...@@ -19,11 +19,16 @@
package org.jkiss.dbeaver.ui.controls.resultset.view; package org.jkiss.dbeaver.ui.controls.resultset.view;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT; import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control; 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.IResultSetController;
import org.jkiss.dbeaver.ui.controls.resultset.IResultSetPresentation; import org.jkiss.dbeaver.ui.controls.resultset.IResultSetPresentation;
...@@ -36,7 +41,7 @@ public class StatisticsPresentation implements IResultSetPresentation { ...@@ -36,7 +41,7 @@ public class StatisticsPresentation implements IResultSetPresentation {
private TableViewer tableViewer; private TableViewer tableViewer;
@Override @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); tableViewer = new TableViewer(parent, SWT.MULTI | SWT.FULL_SELECTION);
} }
...@@ -50,13 +55,28 @@ public class StatisticsPresentation implements IResultSetPresentation { ...@@ -50,13 +55,28 @@ public class StatisticsPresentation implements IResultSetPresentation {
tableViewer.refresh(); tableViewer.refresh();
} }
@Override
public void formatData(boolean refreshData) {
}
@Override
public void clearData() {
}
@Override @Override
public void updateValueView() { public void updateValueView() {
} }
@Override @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 { ...@@ -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 ...@@ -132,7 +132,7 @@ public class DatabaseDataEditor extends AbstractDatabaseObjectEditor<DBSDataCont
{ {
createResultSetView(); createResultSetView();
if (resultSetView != null) { if (resultSetView != null) {
resultSetView.getSpreadsheet().setFocus(); resultSetView.getActivePresentation().getControl().setFocus();
} }
// Register find/replace action // Register find/replace action
......
...@@ -334,7 +334,7 @@ public class SQLEditor extends SQLEditorBase ...@@ -334,7 +334,7 @@ public class SQLEditor extends SQLEditorBase
curQueryProcessor = resultsProvider.queryProcessor; curQueryProcessor = resultsProvider.queryProcessor;
ResultSetViewer rsv = resultsProvider.getResultSetViewer(); ResultSetViewer rsv = resultsProvider.getResultSetViewer();
if (rsv != null) { if (rsv != null) {
rsv.getSpreadsheet().setFocus(); rsv.getActivePresentation().getControl().setFocus();
} }
} else if (data == outputViewer) { } else if (data == outputViewer) {
((CTabItem) e.item).setImage(IMG_OUTPUT); ((CTabItem) e.item).setImage(IMG_OUTPUT);
...@@ -347,8 +347,8 @@ public class SQLEditor extends SQLEditorBase ...@@ -347,8 +347,8 @@ public class SQLEditor extends SQLEditorBase
public void keyTraversed(TraverseEvent e) { public void keyTraversed(TraverseEvent e) {
if (e.detail == SWT.TRAVERSE_PAGE_NEXT) { if (e.detail == SWT.TRAVERSE_PAGE_NEXT) {
ResultSetViewer viewer = getResultSetViewer(); ResultSetViewer viewer = getResultSetViewer();
if (viewer != null && viewer.getSpreadsheet().isVisible()) { if (viewer != null && viewer.getActivePresentation().getControl().isVisible()) {
viewer.getSpreadsheet().setFocus(); viewer.getActivePresentation().getControl().setFocus();
e.doit = false; e.doit = false;
e.detail = SWT.TRAVERSE_NONE; e.detail = SWT.TRAVERSE_NONE;
} }
...@@ -1165,10 +1165,10 @@ public class SQLEditor extends SQLEditorBase ...@@ -1165,10 +1165,10 @@ public class SQLEditor extends SQLEditorBase
this.resultSetNumber = resultSetNumber; this.resultSetNumber = resultSetNumber;
viewer = new ResultSetViewer(resultTabs, getSite(), this); viewer = new ResultSetViewer(resultTabs, getSite(), this);
selectionProvider.trackProvider(viewer.getSpreadsheet(), viewer); selectionProvider.trackProvider(viewer.getActivePresentation().getControl(), viewer);
// Find/replace target activation // Find/replace target activation
viewer.getSpreadsheet().addFocusListener(new FocusAdapter() { viewer.getActivePresentation().getControl().addFocusListener(new FocusAdapter() {
@Override @Override
public void focusGained(FocusEvent e) public void focusGained(FocusEvent e)
{ {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册