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

#4802 Data editor: "Open With" support

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