Bug 539188 - E4 model editor - Allow multi deletion in the fragment
editor

URL: https://bugs.eclipse.org/bugs/show_bug.cgi?id=539188

Add delete menu entry when >1 item selected

Change-Id: I4af57e3245815c1f054bbc5f826711af759b5821
Signed-off-by: bkuntz <benedikt.kuntz@airbus.com>
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/ModelEditor.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/ModelEditor.java
index 35fab8f..cb62542 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/ModelEditor.java
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/ModelEditor.java
@@ -28,6 +28,7 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
@@ -627,6 +628,7 @@
 			final int noSelected = listOfSelections.size();
 
 			boolean addSeparator = false;
+			// single selection
 			if (!s.isEmpty() && noSelected == 1) {
 				List<Action> actions;
 				if (s.getFirstElement() instanceof VirtualEntry) {
@@ -694,23 +696,32 @@
 						manager.add(menu2);
 					}
 
-					if (o.eContainer() != null) {
-						addSeparator = true;
-						manager.add(new Action(messages.ModelEditor_Delete, ImageDescriptor
-								.createFromImage(resourcePool.getImageUnchecked(ResourceProvider.IMG_Obj16_cross))) {
-							@Override
-							public void run() {
-								final Command cmd = DeleteCommand.create(modelProvider.getEditingDomain(), o);
-								if (cmd.canExecute()) {
-									modelProvider.getEditingDomain().getCommandStack().execute(cmd);
-								}
-							}
-						});
-					}
 				}
 			}
-			// multi selection
+
+			// single & multi selection
 			if (noSelected > 0) {
+
+				// add delete entry if there are no virtual entries in selection all selected
+				// elements have a container
+				if (listOfSelections.stream().noneMatch(VirtualEntry.class::isInstance)
+						&& listOfSelections.stream().filter(EObject.class::isInstance).map(EObject.class::cast)
+						.map(EObject::eContainer).allMatch(Objects::nonNull)) {
+					addSeparator = true;
+					manager.add(new Action(messages.ModelEditor_Delete, ImageDescriptor
+							.createFromImage(resourcePool.getImageUnchecked(ResourceProvider.IMG_Obj16_cross))) {
+						@Override
+						public void run() {
+							final CompoundCommand cmd = new CompoundCommand();
+							EditingDomain editingDomain = modelProvider.getEditingDomain();
+							listOfSelections.forEach(o -> cmd.append(DeleteCommand.create(editingDomain, o)));
+							if (cmd.canExecute() && !cmd.isEmpty()) {
+								editingDomain.getCommandStack().execute(cmd);
+							}
+						}
+					});
+				}
+
 				if (!isModelFragment() && modelExtractor != null) {
 					manager.add(new Action(messages.ModelEditor_ExtractFragment, ImageDescriptor
 							.createFromImage(resourcePool.getImageUnchecked(ResourceProvider.IMG_ModelFragments))) {
@@ -763,6 +774,7 @@
 					});
 				}
 
+
 			}
 
 			final IExtensionRegistry registry = RegistryFactory.getRegistry();
@@ -2070,7 +2082,7 @@
 			case TAB_FORM:
 				// make sure tree node has been instantiated
 				final ObservableListTreeContentProvider<?> provider = (ObservableListTreeContentProvider<?>) viewer
-						.getContentProvider();
+				.getContentProvider();
 				getFirstMatchingItem(object, provider, provider.getChildren(viewer.getInput()));
 
 				viewer.reveal(object);