提交 4ed3cacb 编写于 作者: S Serge Rider

#4802 Data editor: "Open With" support

上级 47d0b2b1
......@@ -1360,7 +1360,11 @@
<activeWhen><reference definitionId="org.jkiss.dbeaver.core.ui.resultset.part"/></activeWhen>
</handler>
<handler commandId="org.jkiss.dbeaver.core.resultset.openWith" class="org.jkiss.dbeaver.ui.controls.resultset.ResultSetHandlerOpenWith">
<activeWhen><reference definitionId="org.jkiss.dbeaver.core.ui.resultset.part"/></activeWhen>
<enabledWhen>
<with variable="activePart">
<test property="org.jkiss.dbeaver.core.resultset.hasData"/>
</with>
</enabledWhen>
</handler>
<handler commandId="org.jkiss.dbeaver.core.resultset.grid.toggleLayout" class="org.jkiss.dbeaver.ui.controls.resultset.ResultSetHandlerMain">
<!--<activeWhen><reference definitionId="org.jkiss.dbeaver.core.ui.resultset.part"/></activeWhen>-->
......@@ -2584,6 +2588,10 @@
<menuContribution allPopups="false" locationURI="menu:org.jkiss.dbeaver.core.resultset.panels">
<dynamic id="org.jkiss.dbeaver.core.resultset.panels" class="org.jkiss.dbeaver.ui.controls.resultset.ResultSetViewer$PanelsMenuContributor"/>
</menuContribution>
<!-- RSV open-with drop-down menu -->
<menuContribution allPopups="false" locationURI="menu:org.jkiss.dbeaver.core.resultset.openWith">
<dynamic id="org.jkiss.dbeaver.core.resultset.openWith" class="org.jkiss.dbeaver.ui.controls.resultset.ResultSetHandlerOpenWith$OpenWithMenuContributor"/>
</menuContribution>
</extension>
......
......@@ -22,6 +22,8 @@ import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.IParameterValues;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.ui.actions.CompoundContributionItem;
import org.eclipse.ui.commands.IElementUpdater;
import org.eclipse.ui.handlers.HandlerUtil;
import org.eclipse.ui.menus.UIElement;
......@@ -29,6 +31,7 @@ import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.core.DBeaverUI;
import org.jkiss.dbeaver.model.data.DBDAttributeBinding;
import org.jkiss.dbeaver.model.data.DBDDataFilter;
import org.jkiss.dbeaver.model.preferences.DBPPreferenceStore;
import org.jkiss.dbeaver.model.preferences.DBPPropertyDescriptor;
import org.jkiss.dbeaver.model.runtime.AbstractJob;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
......@@ -48,10 +51,7 @@ import org.jkiss.utils.CommonUtils;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
/**
* Open results in external application
......@@ -63,6 +63,8 @@ public class ResultSetHandlerOpenWith extends AbstractHandler implements IElemen
public static final String CMD_OPEN_WITH = "org.jkiss.dbeaver.core.resultset.openWith";
public static final String PARAM_PROCESSOR_ID = "processorId";
public static final String PARAM_ACTIVE_APP = "org.jkiss.dbeaver.core.resultset.openWith.currentApp";
@Override
public Object execute(ExecutionEvent event) throws ExecutionException
{
......@@ -70,25 +72,40 @@ public class ResultSetHandlerOpenWith extends AbstractHandler implements IElemen
if (resultSet == null) {
return null;
}
String processorId = event.getParameter(PARAM_PROCESSOR_ID);
if (processorId == null) {
DataTransferProcessorDescriptor processor = getActiveProcessor(event.getParameter(PARAM_PROCESSOR_ID));
if (processor == null) {
return null;
}
switch (event.getCommand().getId()) {
case CMD_OPEN_WITH:
openResultsWith(resultSet, processorId);
openResultsWith(resultSet, processor);
break;
}
return null;
}
private static void openResultsWith(IResultSetController resultSet, String processorId) {
DataTransferProcessorDescriptor processor = DataTransferRegistry.getInstance().getProcessor(processorId);
if (processor == null) {
log.debug("Processor '" + processorId + "' not found");
return;
static DataTransferProcessorDescriptor getActiveProcessor(String processorId) {
if (CommonUtils.isEmpty(processorId)) {
processorId = DBWorkbench.getPlatform().getPreferenceStore().getString(PARAM_ACTIVE_APP);
}
if (CommonUtils.isEmpty(processorId)) {
DataTransferProcessorDescriptor defaultAppProcessor = getDefaultProcessor();
if (defaultAppProcessor != null) {
return defaultAppProcessor;
}
} else {
return DataTransferRegistry.getInstance().getProcessor(processorId);
}
openResultsWith(resultSet, processor);
return null;
}
static DataTransferProcessorDescriptor getDefaultProcessor() {
DataTransferProcessorDescriptor defaultAppProcessor = getDefaultAppProcessor();
if (defaultAppProcessor != null) {
return defaultAppProcessor;
}
return null;
}
private static void openResultsWith(IResultSetController resultSet, DataTransferProcessorDescriptor processor) {
......@@ -116,6 +133,13 @@ public class ResultSetHandlerOpenWith extends AbstractHandler implements IElemen
return;
}
DBPPreferenceStore preferenceStore = DBWorkbench.getPlatform().getPreferenceStore();
String prevActiveApp = preferenceStore.getString(PARAM_ACTIVE_APP);
if (!CommonUtils.equalObjects(prevActiveApp, processor.getFullId())) {
//preferenceStore.setValue(PARAM_ACTIVE_APP, processor.getFullId());
//resultSet.updateEditControls();
//resultSet.getControl().layout(true);
}
AbstractJob exportJob = new AbstractJob("Open " + processor.getAppName()) {
......@@ -186,9 +210,8 @@ public class ResultSetHandlerOpenWith extends AbstractHandler implements IElemen
@Override
public void updateElement(UIElement element, Map parameters) {
// Put processor name in command label
String processorId = (String) parameters.get(PARAM_PROCESSOR_ID);
if (processorId != null) {
DataTransferProcessorDescriptor processor = DataTransferRegistry.getInstance().getProcessor(processorId);
DataTransferProcessorDescriptor processor = getActiveProcessor((String) parameters.get(PARAM_PROCESSOR_ID));
if (processor != null) {
element.setText(processor.getAppName());
if (!CommonUtils.isEmpty(processor.getDescription())) {
element.setTooltip(processor.getDescription());
......@@ -199,6 +222,19 @@ public class ResultSetHandlerOpenWith extends AbstractHandler implements IElemen
}
}
private static DataTransferProcessorDescriptor getDefaultAppProcessor() {
List<DataTransferProcessorDescriptor> processors = new ArrayList<>();
for (final DataTransferNodeDescriptor consumerNode : DataTransferRegistry.getInstance().getNodes(DataTransferNodeDescriptor.NodeType.CONSUMER)) {
for (DataTransferProcessorDescriptor processor : consumerNode.getProcessors()) {
if (processor.getAppFileExtension() != null) {
processors.add(processor);
}
}
}
processors.sort(Comparator.comparingInt(DataTransferProcessorDescriptor::getOrder));
return processors.isEmpty() ? null : processors.get(0);
}
public static class OpenWithParameterValues implements IParameterValues {
@Override
......@@ -217,4 +253,18 @@ public class ResultSetHandlerOpenWith extends AbstractHandler implements IElemen
}
}
public static class OpenWithMenuContributor extends CompoundContributionItem
{
@Override
protected IContributionItem[] getContributionItems() {
final ResultSetViewer rsv = (ResultSetViewer) ResultSetHandlerMain.getActiveResultSet(
UIUtils.getActiveWorkbenchWindow().getActivePage().getActivePart());
if (rsv == null) {
return new IContributionItem[0];
}
return rsv.fillOpenWithMenu().getItems();
}
}
}
......@@ -1014,33 +1014,41 @@ public class ResultSetViewer extends Viewer
return items;
}
private IContributionItem fillOpenWithMenu() {
MenuManager fillOpenWithMenu() {
MenuManager openWithMenu = new MenuManager(ActionUtils.findCommandName(ResultSetHandlerOpenWith.CMD_OPEN_WITH));
ResultSetDataContainerOptions options = new ResultSetDataContainerOptions();
ResultSetDataContainer dataContainer = new ResultSetDataContainer(getDataContainer(), getModel(), options);
List<DataTransferProcessorDescriptor> appProcessors = new ArrayList<>();
for (final DataTransferNodeDescriptor consumerNode : DataTransferRegistry.getInstance().getAvailableConsumers(Collections.singleton(dataContainer))) {
for (DataTransferProcessorDescriptor processor : consumerNode.getProcessors()) {
if (processor.getAppFileExtension() != null) {
CommandContributionItemParameter params = new CommandContributionItemParameter(
site,
processor.getId(),
ResultSetHandlerOpenWith.CMD_OPEN_WITH,
CommandContributionItem.STYLE_RADIO
);
params.label = processor.getAppName();
if (processor.getIcon() != null) {
params.icon = DBeaverIcons.getImageDescriptor(processor.getIcon());
}
Map<String, Object> parameters = new HashMap<>();
parameters.put(ResultSetHandlerOpenWith.PARAM_PROCESSOR_ID, processor.getFullId());
params.parameters = parameters;
openWithMenu.add(new CommandContributionItem(params));
appProcessors.add(processor);
}
}
}
appProcessors.sort(Comparator.comparingInt(DataTransferProcessorDescriptor::getOrder));
for (DataTransferProcessorDescriptor processor : appProcessors) {
CommandContributionItemParameter params = new CommandContributionItemParameter(
site,
processor.getId(),
ResultSetHandlerOpenWith.CMD_OPEN_WITH,
CommandContributionItem.STYLE_RADIO
);
params.label = processor.getAppName();
if (processor.getIcon() != null) {
params.icon = DBeaverIcons.getImageDescriptor(processor.getIcon());
}
Map<String, Object> parameters = new HashMap<>();
parameters.put(ResultSetHandlerOpenWith.PARAM_PROCESSOR_ID, processor.getFullId());
params.parameters = parameters;
openWithMenu.add(new CommandContributionItem(params));
}
return openWithMenu;
}
......@@ -1276,7 +1284,7 @@ public class ResultSetViewer extends Viewer
"org.jkiss.dbeaver.core.resultset.panels",
ResultSetHandlerMain.CMD_TOGGLE_PANELS,
CommandContributionItem.STYLE_PULLDOWN);
ciParam.label = "Panels";
ciParam.label = CoreMessages.controls_resultset_config_panels;
ciParam.mode = CommandContributionItem.MODE_FORCE_TEXT;
configToolbar.add(new CommandContributionItem(ciParam));
}
......@@ -1296,6 +1304,27 @@ public class ResultSetViewer extends Viewer
{
ToolBarManager addToolbar = new ToolBarManager(SWT.FLAT | SWT.HORIZONTAL | SWT.RIGHT);
addToolbar.add(new GroupMarker(TOOLBAR_GROUP_PRESENTATIONS));
/*
if (false) {
CommandContributionItemParameter ciParam = new CommandContributionItemParameter(
site,
"org.jkiss.dbeaver.core.resultset.openWith",
ResultSetHandlerOpenWith.CMD_OPEN_WITH,
CommandContributionItem.STYLE_PULLDOWN);
ciParam.mode = CommandContributionItem.MODE_FORCE_TEXT;
DataTransferProcessorDescriptor activeProcessor = ResultSetHandlerOpenWith.getDefaultProcessor();
if (activeProcessor != null) {
ciParam.label = activeProcessor.getAppName();
ciParam.icon = DBeaverIcons.getImageDescriptor(activeProcessor.getIcon());
}
Map<String, String> params = new HashMap<>();
//params.put(ResultSetHandlerOpenWith.PARAM_PROCESSOR_ID, "stream:stream.xlsx");
ciParam.parameters = params;
addToolbar.add(new CommandContributionItem(ciParam));
}
*/
addToolbar.add(new Separator(TOOLBAR_GROUP_ADDITIONS));
final IMenuService menuService = getSite().getService(IMenuService.class);
if (menuService != null) {
......
......@@ -12,7 +12,8 @@
label="%dataTransfer.processor.xlsx.name"
binary="true"
appFileExtension="xlsx"
appName="Excel">
appName="Excel"
order="10">
<propertyGroup label="%dataTransfer.processor.xlsx.propertyGroup.general.label">
<property id="extension" label="%dataTransfer.processor.xlsx.property.extension.label" defaultValue="xlsx"/>
......@@ -55,7 +56,10 @@
<!-- Results viewer status bar additions -->
<menuContribution allPopups="false" locationURI="toolbar:org.jkiss.dbeaver.ui.controls.resultset.status?after=presentations">
<command commandId="org.jkiss.dbeaver.ext.data.office.results.openSpreadsheet" style="push" mode="FORCE_TEXT" label="%command.org.jkiss.dbeaver.ext.data.office.results.openSpreadsheet.toolbar.label"/>
<command commandId="org.jkiss.dbeaver.core.resultset.openWith" style="push" mode="FORCE_TEXT" label="%command.org.jkiss.dbeaver.ext.data.office.results.openSpreadsheet.toolbar.label">
<parameter name="processorId" value="stream_consumer:stream.xlsx">
</parameter>
</command>
</menuContribution>
</extension>
......
......@@ -170,7 +170,8 @@
icon="platform:/plugin/org.jkiss.dbeaver.ui/icons/misc/html.png"
label="%dataTransfer.processor.html.name"
appFileExtension="html"
appName="Web browser">
appName="Web browser"
order="20">
<propertyGroup label="%dataTransfer.processor.html.propertyGroup.general.label">
<property id="extension" label="%dataTransfer.processor.html.property.extension.label" defaultValue="html"/>
<property id="extractImages" label="%dataTransfer.processor.html.property.images.name" type="boolean" description="%dataTransfer.processor.html.property.images.description" defaultValue="true"/>
......
......@@ -46,6 +46,7 @@ public class DataTransferProcessorDescriptor extends AbstractDescriptor implemen
private final String description;
private final String appFileExtension;
private final String appName;
private final int order;
@NotNull
private final DBPImage icon;
private final List<DBPPropertyDescriptor> properties = new ArrayList<>();
......@@ -64,6 +65,7 @@ public class DataTransferProcessorDescriptor extends AbstractDescriptor implemen
this.isBinary = CommonUtils.getBoolean(config.getAttribute("binary"), false);
this.appFileExtension = config.getAttribute("appFileExtension");
this.appName = config.getAttribute("appName");
this.order = CommonUtils.toInt(config.getAttribute("order"));
for (IConfigurationElement typeCfg : ArrayUtils.safeArray(config.getChildren("sourceType"))) {
sourceTypes.add(new ObjectType(typeCfg.getAttribute("type")));
......@@ -103,6 +105,10 @@ public class DataTransferProcessorDescriptor extends AbstractDescriptor implemen
return program;
}
public int getOrder() {
return order;
}
@NotNull
public DBPImage getIcon() {
return icon;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册