From 4ed3cacb5417556e299cf4848f0b71585871225c Mon Sep 17 00:00:00 2001 From: Serge Rider Date: Tue, 25 Dec 2018 17:29:25 +0300 Subject: [PATCH] #4802 Data editor: "Open With" support --- plugins/org.jkiss.dbeaver.core/plugin.xml | 10 ++- .../resultset/ResultSetHandlerOpenWith.java | 82 +++++++++++++++---- .../controls/resultset/ResultSetViewer.java | 61 ++++++++++---- .../org.jkiss.dbeaver.data.office/plugin.xml | 8 +- .../plugin.xml | 3 +- .../DataTransferProcessorDescriptor.java | 6 ++ 6 files changed, 134 insertions(+), 36 deletions(-) diff --git a/plugins/org.jkiss.dbeaver.core/plugin.xml b/plugins/org.jkiss.dbeaver.core/plugin.xml index 7abd277594..39cd8c9521 100644 --- a/plugins/org.jkiss.dbeaver.core/plugin.xml +++ b/plugins/org.jkiss.dbeaver.core/plugin.xml @@ -1360,7 +1360,11 @@ - + + + + + @@ -2584,6 +2588,10 @@ + + + + diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetHandlerOpenWith.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetHandlerOpenWith.java index a6386b762a..13e8b256f5 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetHandlerOpenWith.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetHandlerOpenWith.java @@ -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 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(); + } + } + } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetViewer.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetViewer.java index 23b736ce38..9a63f14b84 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetViewer.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetViewer.java @@ -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 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 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 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 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) { diff --git a/plugins/org.jkiss.dbeaver.data.office/plugin.xml b/plugins/org.jkiss.dbeaver.data.office/plugin.xml index ff4428e058..4bcdc0ad40 100644 --- a/plugins/org.jkiss.dbeaver.data.office/plugin.xml +++ b/plugins/org.jkiss.dbeaver.data.office/plugin.xml @@ -12,7 +12,8 @@ label="%dataTransfer.processor.xlsx.name" binary="true" appFileExtension="xlsx" - appName="Excel"> + appName="Excel" + order="10"> @@ -55,7 +56,10 @@ - + + + + diff --git a/plugins/org.jkiss.dbeaver.data.transfer/plugin.xml b/plugins/org.jkiss.dbeaver.data.transfer/plugin.xml index 4e82ac68aa..09f918a061 100644 --- a/plugins/org.jkiss.dbeaver.data.transfer/plugin.xml +++ b/plugins/org.jkiss.dbeaver.data.transfer/plugin.xml @@ -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"> diff --git a/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/registry/DataTransferProcessorDescriptor.java b/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/registry/DataTransferProcessorDescriptor.java index 72550d8f09..56ead9b5db 100644 --- a/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/registry/DataTransferProcessorDescriptor.java +++ b/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/registry/DataTransferProcessorDescriptor.java @@ -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 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; -- GitLab