From 5ff9f14266acb47c1513b84e001d81b984c0820e Mon Sep 17 00:00:00 2001
From: Simon Barner <barner@fortiss.org>
Date: Tue, 21 Sep 2021 09:14:18 +0200
Subject: [PATCH] Annotation View: Display value of EReference annotations

Issue-Ref: 4092
Issue-Url: https://git.fortiss.org/af3/af3/-/issues/4092

Signed-off-by: Simon Barner <barner@fortiss.org>
---
 .../base/ui/annotation/view/fx/.ratings       |  4 +--
 .../fx/AnnotationTreeTableUIProvider.java     | 31 +++++++++++++++++--
 .../view/fx/AnnotationsFXUtils.java           | 18 +++++++++++
 3 files changed, 48 insertions(+), 5 deletions(-)

diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/annotation/view/fx/.ratings b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/annotation/view/fx/.ratings
index a53b1308c..e7cd505cf 100644
--- a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/annotation/view/fx/.ratings
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/annotation/view/fx/.ratings
@@ -1,6 +1,6 @@
 AnnotationFxViewPart.java ca1548c49aa3842a9436262531464ba345b83688 GREEN
-AnnotationTreeTableUIProvider.java 85dfcf003c79d45f82c901b0f3f6bb30db59effa GREEN
+AnnotationTreeTableUIProvider.java 9efdeb7261cafe9dfe763daf20af186c906c3ec3 YELLOW
 AnnotationViewFXController.java 7d62ea076e87b14c4916935d3466168503c83c6f YELLOW
-AnnotationsFXUtils.java 754152735e037da59a4c40fa045602c3ed85a40f GREEN
+AnnotationsFXUtils.java e180d593b69b1e4b90adf83ba47753b29f9d6ff8 YELLOW
 ColumnHandle.java 7b0fe536d4eb9faa63c4d812f0c078cf83d0fd42 GREEN
 FXAnnotationFilterContentProvider.java ca4587ef5dce1288ee4d7bf3bea5bd544ce6b89e GREEN
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/annotation/view/fx/AnnotationTreeTableUIProvider.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/annotation/view/fx/AnnotationTreeTableUIProvider.java
index 85dfcf003..9efdeb726 100644
--- a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/annotation/view/fx/AnnotationTreeTableUIProvider.java
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/annotation/view/fx/AnnotationTreeTableUIProvider.java
@@ -15,11 +15,17 @@
 +--------------------------------------------------------------------------*/
 package org.fortiss.tooling.base.ui.annotation.view.fx;
 
+import static java.util.stream.Collectors.joining;
 import static org.fortiss.tooling.base.ui.annotation.view.fx.AnnotationsFXUtils.SELECTED_ANNOTATION_BACKGROUND_COLOR;
 import static org.fortiss.tooling.base.ui.annotation.view.fx.AnnotationsFXUtils.getBackgroundColorForEntry;
+import static org.fortiss.tooling.base.ui.annotation.view.fx.AnnotationsFXUtils.getValueLabel;
 
+import java.util.Collection;
+
+import org.eclipse.emf.ecore.EObject;
 import org.fortiss.tooling.base.annotation.AnnotationEntry;
 import org.fortiss.tooling.base.annotation.IAnnotationValueService;
+import org.fortiss.tooling.base.annotation.valueprovider.EStructuralFeatureDescriptor;
 import org.fortiss.tooling.base.annotation.valueprovider.IAnnotationValueProvider;
 import org.fortiss.tooling.base.model.element.IAnnotatedSpecification;
 import org.fortiss.tooling.base.model.element.IModelElement;
@@ -62,13 +68,32 @@ import javafx.scene.paint.Color;
 						this.viewController.colIdxAnnotationMap.get(column)
 								.getAnnotatedSpecificationType();
 
+				IAnnotationValueProvider<IAnnotatedSpecification> valueProvider =
+						entry.getAnnotationValueProvider(columnSpecType);
+				EStructuralFeatureDescriptor eStructuralFeatureDescriptor = valueProvider != null
+						? valueProvider.getEStructuralFeatureDescriptor() : null;
 				Object specificationValue = entry.getSpecificationValue(columnSpecType);
-				if(specificationValue != null) {
-					return specificationValue.toString();
+				if(specificationValue instanceof Collection) {
+					Collection<?> values = (Collection<?>)specificationValue;
+					return "[" + values.stream().map(o -> getLabel(o, eStructuralFeatureDescriptor))
+							.collect(joining(", ")) + "]";
+				} else if(specificationValue != null) {
+					return getLabel(specificationValue, eStructuralFeatureDescriptor);
 				}
 
 				return "";
 		}
+
+	}
+
+	/** Returns a label for the given value. */
+	private String getLabel(Object value,
+			EStructuralFeatureDescriptor eStructuralFeatureDescriptor) {
+		EObject root = null;
+		if(value instanceof IModelElement) {
+			root = eStructuralFeatureDescriptor.getValueRootElement((IModelElement)value);
+		}
+		return getValueLabel(value, root);
 	}
 
 	/** {@inheritDoc} */
@@ -91,7 +116,7 @@ import javafx.scene.paint.Color;
 	@Override
 	public void updateValue(AnnotationEntry element, int column, Object value) {
 		IAnnotatedSpecification spec = getAnnotation(column, element);
-		this.viewController.setAnnotationEntryValue(spec, element, (String)value);
+		this.viewController.setAnnotationEntryValue(spec, element, value);
 
 		super.updateValue(element, column, value);
 	}
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/annotation/view/fx/AnnotationsFXUtils.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/annotation/view/fx/AnnotationsFXUtils.java
index 754152735..e180d593b 100644
--- a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/annotation/view/fx/AnnotationsFXUtils.java
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/annotation/view/fx/AnnotationsFXUtils.java
@@ -20,11 +20,15 @@ import static javafx.scene.paint.Color.LIGHTGREY;
 import static javafx.scene.paint.Color.LIGHTSEAGREEN;
 import static javafx.scene.paint.Color.WHITE;
 import static org.eclipse.swt.widgets.Display.getCurrent;
+import static org.fortiss.tooling.kernel.utils.KernelModelElementUtils.computeFullyQualifiedName;
+import static org.fortiss.tooling.kernel.utils.KernelModelElementUtils.computeRelativeName;
 
+import org.eclipse.emf.ecore.EObject;
 import org.eclipse.swt.graphics.Device;
 import org.fortiss.tooling.base.annotation.AnnotationEntry;
 import org.fortiss.tooling.base.annotation.valueprovider.IAnnotationValueProvider;
 import org.fortiss.tooling.base.model.element.IAnnotatedSpecification;
+import org.fortiss.tooling.kernel.model.INamedElement;
 
 import javafx.scene.paint.Color;
 
@@ -132,4 +136,18 @@ public class AnnotationsFXUtils {
 		int blue = (int)color.getBlue();
 		return new org.eclipse.swt.graphics.Color(device, red, green, blue);
 	}
+
+	/**
+	 * Returns the label for a value shown in the annotation view. For values of EReferences, the
+	 * hierarchical name of the value relative to the given {@code root} model element is returned.
+	 */
+	public static String getValueLabel(Object modelELement, EObject root) {
+		if(modelELement instanceof INamedElement) {
+			if(root instanceof INamedElement) {
+				return computeRelativeName((INamedElement)root, (INamedElement)modelELement);
+			}
+			return computeFullyQualifiedName((INamedElement)modelELement);
+		}
+		return modelELement.toString();
+	}
 }
-- 
GitLab