From 4c16f29659b6eeec7c45a09e68214cc122e92169 Mon Sep 17 00:00:00 2001 From: Patrick Plitzner Date: Mon, 20 Jul 2015 18:31:02 +0200 Subject: [PATCH] Generalize cdmViewer extension point Refactored parameters to be based on commands. --- ...u.etaxonomy.taxeditor.store.cdmViewer.exsd | 40 ++++++++++++++++++- .../taxeditor/view/CdmViewerContextMenu.java | 40 +++++++++++++++---- .../taxeditor/view/CdmViewerUtil.java | 27 ++++++++++++- 3 files changed, 98 insertions(+), 9 deletions(-) diff --git a/eu.etaxonomy.taxeditor.store/schema/eu.etaxonomy.taxeditor.store.cdmViewer.exsd b/eu.etaxonomy.taxeditor.store/schema/eu.etaxonomy.taxeditor.store.cdmViewer.exsd index 42791ec3b..b233e53f9 100644 --- a/eu.etaxonomy.taxeditor.store/schema/eu.etaxonomy.taxeditor.store.cdmViewer.exsd +++ b/eu.etaxonomy.taxeditor.store/schema/eu.etaxonomy.taxeditor.store.cdmViewer.exsd @@ -21,7 +21,8 @@ - + + @@ -72,6 +73,43 @@ + + + + Maps a viewing class, like editors or views, to a command which opens it. + + + + + + + The command which opens the viewer to show the selected object + + + + + + + + + + The name of the viewer which shows the selected element + + + + + + + The class of the selected element + + + + + + + + + diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/CdmViewerContextMenu.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/CdmViewerContextMenu.java index 712bec9d8..f2eef9fe3 100644 --- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/CdmViewerContextMenu.java +++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/CdmViewerContextMenu.java @@ -3,6 +3,8 @@ package eu.etaxonomy.taxeditor.view; import java.util.Map; import java.util.Map.Entry; +import org.eclipse.core.commands.Command; +import org.eclipse.core.commands.common.NotDefinedException; import org.eclipse.jface.action.ContributionItem; import org.eclipse.jface.action.IContributionItem; import org.eclipse.jface.viewers.ISelection; @@ -15,6 +17,10 @@ import org.eclipse.swt.widgets.MenuItem; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.actions.CompoundContributionItem; +import org.eclipse.ui.commands.ICommandService; +import org.eclipse.ui.handlers.IHandlerService; + +import eu.etaxonomy.taxeditor.model.MessagingUtils; /** * Generic context menu for opening elements in the taxeditor. @@ -28,20 +34,40 @@ public class CdmViewerContextMenu extends CompoundContributionItem { new ContributionItem() { @Override public void fill(Menu menu, int index) { + final IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); + final ISelection selection = window.getActivePage().getSelection(); + MenuItem addItem = new MenuItem(menu, SWT.CASCADE); addItem.setText("Open in..."); Menu addMenu = new Menu(menu); addItem.setMenu(addMenu); - final IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); - final ISelection selection = window.getActivePage().getSelection(); if(selection instanceof IStructuredSelection){ Object firstElement = ((IStructuredSelection) selection).getFirstElement(); - Map, String>, ICdmViewer> nameViewerMap = CdmViewerUtil.getNameViewerMap(firstElement); - for(Entry, String>, ICdmViewer> entry:nameViewerMap.entrySet()){ - Entry, String> viewerClass = entry.getKey(); + Map availableViewers = CdmViewerUtil.getAvailableViewers(firstElement); + for(Entry entry:availableViewers.entrySet()){ + final String commandId = entry.getKey(); + String viewerName = entry.getValue(); MenuItem menuItem = new MenuItem(addMenu, SWT.NONE); - menuItem.setText(viewerClass.getValue()); - menuItem.addSelectionListener(new OpenInViewerListener(entry.getValue(), firstElement, viewerClass.getKey())); + menuItem.setText(viewerName); + menuItem.addSelectionListener(new SelectionAdapter() { + + @Override + public void widgetSelected(SelectionEvent e) { + ICommandService commandService = (ICommandService)PlatformUI.getWorkbench().getService(ICommandService.class); + + Command command = commandService.getCommand(commandId); + if(command.isEnabled()) { + IHandlerService handlerService = (IHandlerService)PlatformUI.getWorkbench().getService(IHandlerService.class); + try { + handlerService.executeCommand(commandId, null); + } catch (NotDefinedException nde) { + throw new RuntimeException("Could not find open command: " + commandId); + } catch (Exception exception) { + MessagingUtils.error(getClass(), "An exception occured while trying execute "+commandId, exception); + } + } + } + }) ; } } } diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/CdmViewerUtil.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/CdmViewerUtil.java index 6f5c6f67a..8fc2e73e3 100644 --- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/CdmViewerUtil.java +++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/CdmViewerUtil.java @@ -32,7 +32,7 @@ public class CdmViewerUtil { public static Map, String>, ICdmViewer> getNameViewerMap(Object input){ Map, String>, ICdmViewer> nameViewerMap = new HashMap, String>, ICdmViewer>(); - + IExtensionRegistry reg = Platform.getExtensionRegistry(); IConfigurationElement[] extensions = reg .getConfigurationElementsFor("eu.etaxonomy.taxeditor.store.cdmViewer"); @@ -56,4 +56,29 @@ public class CdmViewerUtil { return nameViewerMap; } + public static Map getAvailableViewers(Object input){ + Map commandViewerNameMap = new HashMap(); + + IExtensionRegistry reg = Platform.getExtensionRegistry(); + IConfigurationElement[] extensions = reg + .getConfigurationElementsFor("eu.etaxonomy.taxeditor.store.cdmViewer"); + for (IConfigurationElement configElement : extensions) { + if(configElement.getName().equals("viewCommandMapping")){ + String commandId = configElement.getAttribute("commandId"); + String viewerName = configElement.getAttribute("viewerName"); + try { + Object selectionObject = configElement.createExecutableExtension("selection"); + System.out.println(selectionObject); + Class selectionClass = selectionObject.getClass(); + if(input.getClass().isAssignableFrom(selectionClass)){ + commandViewerNameMap.put(commandId, viewerName); + } + } catch (CoreException e) { + MessagingUtils.error(CdmViewerChooser.class, "Could not initalize selection class element of cdmViewer extension", e); + } + } + } + return commandViewerNameMap; + } + } -- 2.34.1