From 52d56c8220a17d7b06d812679d35cbed1de19dc0 Mon Sep 17 00:00:00 2001
From: Simon Barner <barner@fortiss.org>
Date: Wed, 21 Nov 2018 16:19:02 +0100
Subject: [PATCH] Add IListPropertySection::canRemoveModelListElement()

Issue-Ref: 3470
Issue-Url: https://af3-developer.fortiss.org/issues/3470

Signed-off-by: Simon Barner <barner@fortiss.org>
---
 .../tooling/kernel/ui/extension/base/.ratings   |  4 ++--
 .../base/EReferenceListPropertySectionBase.java | 17 ++++++++++++-----
 .../ui/extension/base/IListPropertySection.java |  3 +++
 3 files changed, 17 insertions(+), 7 deletions(-)

diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/.ratings b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/.ratings
index 952d7ac1b..76a9001c4 100644
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/.ratings
+++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/.ratings
@@ -2,10 +2,10 @@ ConstraintUIBases.java 3676a600e0866091db9798763c6eee97eec5b55b GREEN
 ContextMenuSubMenuContributorBase.java 6275d96fe8690d9d4744bcbaef3c7d14ba8e30ff GREEN
 DialogMessageHandler.java 8714da09a777c8557de0a5c48ff68c340f9fa91d GREEN
 EObjectActionBase.java 4ef9f8be59e64d4838acc9e268d418ba5d94fa1a GREEN
-EReferenceListPropertySectionBase.java bbc5f6851842a9cb0af5e9898d9c6e197a36312a YELLOW
+EReferenceListPropertySectionBase.java 7390dd7bfdc979e8ff0c5c30c67ab7b6c9d70c92 YELLOW
 EReferencePropertySectionBase.java 0548da6778516003257f59d0b4c2b60d458be3b6 YELLOW
 EditorBase.java 9c09fff92945256bb8680992ae7bb2c78f47b150 GREEN
-IListPropertySection.java a093a8a625d291b8adecec5082e32748a2d99f9e YELLOW
+IListPropertySection.java 8bb00fe7959583e794ff9437b7a77404c9a9e70f YELLOW
 ModelEditorBindingBase.java 4c5ac569c0b6e7678fc8191096b26dfd09fdcb98 GREEN
 ModelElementHandlerBase.java 384727748f125c9d43f19d9c0eba4ba1be5a7a26 GREEN
 MultiEObjectActionBase.java 9e237d8ea640c4194e4877af4a9cfce88698e543 GREEN
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/EReferenceListPropertySectionBase.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/EReferenceListPropertySectionBase.java
index bbc5f6851..7390dd7bf 100644
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/EReferenceListPropertySectionBase.java
+++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/EReferenceListPropertySectionBase.java
@@ -97,7 +97,9 @@ public abstract class EReferenceListPropertySectionBase<I extends EObject, R ext
 					// refresh() does not work here. It is based on isRemoveButtonEnabled(), that
 					// queries the selection of the 'listViewer' has not been updated yet. When this
 					// listener is triggered, only the 'event' already contains the new selection.
-					removeButton.setEnabled(getFirstSelectedElement(event.getSelection()) != null);
+					R selectedElement = getFirstSelectedElement(event.getSelection());
+					removeButton.setEnabled(selectedElement != null && section
+							.canRemoveModelListElement(section.getSectionInput(), selectedElement));
 				}
 			});
 
@@ -170,7 +172,9 @@ public abstract class EReferenceListPropertySectionBase<I extends EObject, R ext
 		 * </p>
 		 */
 		protected boolean isRemoveButtonEnabled() {
-			return getFirstSelectedElement(listViewer.getSelection()) != null;
+			R selectedElement = getFirstSelectedElement(listViewer.getSelection());
+			return selectedElement != null &&
+					section.canRemoveModelListElement(section.getSectionInput(), selectedElement);
 		}
 
 		/** Refreshes the input and the enabled state of the controls. */
@@ -245,9 +249,12 @@ public abstract class EReferenceListPropertySectionBase<I extends EObject, R ext
 	@Override
 	protected final EObject getModelValue(I input) {
 		List<R> elements = getValues(input);
-		// The value selected in the combo box is not directly stored in the model (see
-		// setModelValue()). Hence, instead of retrieving a value for the model from the combobox,
-		// by default the first element is selected.
+		if(elements.contains(selectedElement)) {
+			return selectedElement;
+		}
+
+		// In the currently selected element is not in the list of available elements, default to
+		// the first element in the list
 		selectedElement = elements.isEmpty() ? null : elements.get(0);
 		return selectedElement;
 	}
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/IListPropertySection.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/IListPropertySection.java
index a093a8a62..8bb00fe79 100644
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/IListPropertySection.java
+++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/IListPropertySection.java
@@ -36,6 +36,9 @@ public interface IListPropertySection<I extends EObject, R extends EObject> {
 	/** Removes the given {@code element} from the edited {@link EReference} list. */
 	public void removeModelListElement(I input, R element);
 
+	/** Predicate if the given {@code element} may be removed from the list. */
+	public boolean canRemoveModelListElement(I input, R element);
+
 	/** Returns the currently selected element of the viewer used to edit the element list. */
 	public R getSelectedElement();
 
-- 
GitLab