+package eu.etaxonomy.taxeditor.view;
+
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.eclipse.jface.action.ContributionItem;
+import org.eclipse.jface.action.IContributionItem;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.CompoundContributionItem;
+
+/**
+ * Generic context menu for opening elements in the taxeditor.
+ *
+ */
+public class CdmViewerContextMenu extends CompoundContributionItem {
+
+ @Override
+ protected IContributionItem[] getContributionItems() {
+ IContributionItem[] contributionItems = new IContributionItem[] {
+ new ContributionItem() {
+ @Override
+ public void fill(Menu menu, int index) {
+ 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<Entry<Class<?>, String>, ICdmViewer> nameViewerMap = CdmViewerChooser.getNameViewerMap(firstElement);
+ for(Entry<Entry<Class<?>, String>, ICdmViewer> entry:nameViewerMap.entrySet()){
+ Entry<Class<?>, String> viewerClass = entry.getKey();
+ MenuItem menuItem = new MenuItem(addMenu, SWT.NONE);
+ menuItem.setText(viewerClass.getValue());
+ menuItem.addSelectionListener(new OpenInViewerListener(entry.getValue(), firstElement, viewerClass.getKey()));
+ }
+ }
+ }
+ }
+ };
+ return contributionItems;
+ }
+
+ private class OpenInViewerListener extends SelectionAdapter {
+
+ private final ICdmViewer cdmViewer;
+ private final Object input;
+ private final Class<?> viewerClass;
+
+ public OpenInViewerListener(ICdmViewer cdmViewer, Object input, Class<?> viewerClass) {
+ super();
+ this.cdmViewer = cdmViewer;
+ this.input = input;
+ this.viewerClass = viewerClass;
+ }
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ cdmViewer.show(input, viewerClass);
+ }
+
+ }
+
+}