ref #7439 Add e4 context menu to nattable
authorPatrick Plitzner <p.plitzner@bgbm.org>
Tue, 29 May 2018 13:41:04 +0000 (15:41 +0200)
committerPatrick Plitzner <p.plitzner@bgbm.org>
Tue, 29 May 2018 13:41:04 +0000 (15:41 +0200)
 - add full row selection

eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/e4/BulkEditorE4.java

index d99c333e411846a10348a008c53712f9b342ad87..2c6e94c4c72100f5103e66972b2bd2da24bb69c4 100644 (file)
@@ -9,6 +9,7 @@
 
 package eu.etaxonomy.taxeditor.bulkeditor.e4;
 
+import java.io.Serializable;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -33,9 +34,12 @@ import org.eclipse.jface.viewers.ISelectionChangedListener;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.TableViewer;
 import org.eclipse.nebula.widgets.nattable.NatTable;
-import org.eclipse.nebula.widgets.nattable.data.IDataProvider;
+import org.eclipse.nebula.widgets.nattable.config.AbstractUiBindingConfiguration;
+import org.eclipse.nebula.widgets.nattable.config.DefaultNatTableStyleConfiguration;
+import org.eclipse.nebula.widgets.nattable.data.IRowIdAccessor;
 import org.eclipse.nebula.widgets.nattable.data.ListDataProvider;
 import org.eclipse.nebula.widgets.nattable.extension.glazedlists.GlazedListsEventLayer;
+import org.eclipse.nebula.widgets.nattable.grid.GridRegion;
 import org.eclipse.nebula.widgets.nattable.grid.data.DefaultColumnHeaderDataProvider;
 import org.eclipse.nebula.widgets.nattable.grid.data.DefaultCornerDataProvider;
 import org.eclipse.nebula.widgets.nattable.grid.data.DefaultRowHeaderDataProvider;
@@ -45,10 +49,16 @@ import org.eclipse.nebula.widgets.nattable.grid.layer.GridLayer;
 import org.eclipse.nebula.widgets.nattable.grid.layer.RowHeaderLayer;
 import org.eclipse.nebula.widgets.nattable.layer.DataLayer;
 import org.eclipse.nebula.widgets.nattable.layer.stack.DefaultBodyLayerStack;
+import org.eclipse.nebula.widgets.nattable.selection.RowSelectionModel;
+import org.eclipse.nebula.widgets.nattable.ui.binding.UiBindingRegistry;
+import org.eclipse.nebula.widgets.nattable.ui.matcher.MouseEventMatcher;
+import org.eclipse.nebula.widgets.nattable.ui.menu.PopupMenuAction;
+import org.eclipse.nebula.widgets.nattable.ui.menu.PopupMenuBuilder;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Menu;
 
 import ca.odell.glazedlists.BasicEventList;
 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
@@ -116,6 +126,9 @@ public class BulkEditorE4 implements IPartContentHasDetails, IConversationEnable
 
     private Composite bottomComposite;
 
+    @Inject
+    private EMenuService menuService;
+
     @Inject
     public BulkEditorE4() {
        }
@@ -220,7 +233,7 @@ public class BulkEditorE4 implements IPartContentHasDetails, IConversationEnable
         propertyToLabels.put(getEditorInput().getName(), getEditorInput().getName());
         propertyToLabels.put(TYPE_PROPERTY, TYPE_PROPERTY);
         String[] propertyNames = new String[] { getEditorInput().getName(), TYPE_PROPERTY };
-        IDataProvider bodyDataProvider = new ListDataProvider<CdmBase>(list,
+        ListDataProvider bodyDataProvider = new ListDataProvider<CdmBase>(list,
                 new BulkEditorPropertyAccessor(getEditorInput()));
 
 
@@ -249,13 +262,56 @@ public class BulkEditorE4 implements IPartContentHasDetails, IConversationEnable
                 rowHeaderLayer, cornerLayer);
 
         dataLayer.setColumnPercentageSizing(true);
-        NatTable natTable = new NatTable(bottomComposite, gridLayer);
+        natTable = new NatTable(bottomComposite, gridLayer, false);
+
+        //create context menu
+        menuService.registerContextMenu(natTable, "eu.etaxonomy.taxeditor.bulkeditor.popupmenu.bulkeditor"); //$NON-NLS-1$
+        // get the menu registered by EMenuService
+        final Menu e4Menu = natTable.getMenu();
+
+        // remove the menu reference from NatTable instance
+        natTable.setMenu(null);
+
+        //add default configuration because autoconfigure is set to false in constructor
+        natTable.addConfiguration(new DefaultNatTableStyleConfiguration());
+        natTable.addConfiguration(
+                new AbstractUiBindingConfiguration() {
+
+            @Override
+            public void configureUiBindings(
+                    UiBindingRegistry uiBindingRegistry) {
+                // add NatTable menu items
+                // and register the DisposeListener
+                new PopupMenuBuilder(natTable, e4Menu)
+                    .build();
+
+                // register the UI binding
+                uiBindingRegistry.registerMouseDownBinding(
+                        new MouseEventMatcher(
+                                SWT.NONE,
+                                GridRegion.BODY,
+                                MouseEventMatcher.RIGHT_BUTTON),
+                        new PopupMenuAction(e4Menu));
+            }
+        });
+
+        natTable.configure();
         GridDataFactory.fillDefaults().grab(true, true).applyTo(natTable);
+
+        //full row selection
+        bodyLayer.getSelectionLayer().setSelectionModel(new RowSelectionModel<CdmBase>(bodyLayer.getSelectionLayer(), bodyDataProvider, new IRowIdAccessor<CdmBase>() {
+
+            @Override
+            public Serializable getRowId(CdmBase rowObject) {
+                return list.indexOf(rowObject);
+            }
+
+        }));
        }
 
        /** {@inheritDoc} */
        @PostConstruct
-       public void createPartControl(Composite parent, EMenuService menuService) {
+       public void createPartControl(Composite parent) {
                parent.setLayout(new GridLayout());
 
                topComposite = new Composite(parent, SWT.NONE);
@@ -278,7 +334,6 @@ public class BulkEditorE4 implements IPartContentHasDetails, IConversationEnable
 
         //create context menu
 //        menuService.registerContextMenu(viewer.getControl(), "eu.etaxonomy.taxeditor.bulkeditor.popupmenu.bulkeditor"); //$NON-NLS-1$
-
        }
 
        @Override