From c7db12faeeb355d617bf6a3ce05915365ea03939 Mon Sep 17 00:00:00 2001
From: Alexander Diewald <diewald@fortiss.org>
Date: Wed, 6 Mar 2019 14:49:31 +0100
Subject: [PATCH] CR: YELLOW

Issue-Ref: 3482
Issue-Url: https://af3-developer.fortiss.org/issues/3482
Signed-off-by: Alexander Diewald <diewald@fortiss.org>
---
 .../ui/javafx/control/treetableview/.ratings  |  2 +-
 .../treetableview/ModelElementTreeViewer.java | 41 +++++++++++++------
 2 files changed, 29 insertions(+), 14 deletions(-)

diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/javafx/control/treetableview/.ratings b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/javafx/control/treetableview/.ratings
index fa2968f9f..294b7631f 100644
--- a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/javafx/control/treetableview/.ratings
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/javafx/control/treetableview/.ratings
@@ -1 +1 @@
-ModelElementTreeViewer.java 44744e6b11264547bd6b05a84a427948bf919969 RED
+ModelElementTreeViewer.java 6eb558c8d5a0eaf3df55aa1091586cd1faefecb1 YELLOW
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/javafx/control/treetableview/ModelElementTreeViewer.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/javafx/control/treetableview/ModelElementTreeViewer.java
index 44744e6b1..6eb558c8d 100644
--- a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/javafx/control/treetableview/ModelElementTreeViewer.java
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/javafx/control/treetableview/ModelElementTreeViewer.java
@@ -17,6 +17,9 @@ package org.fortiss.tooling.base.ui.javafx.control.treetableview;
 
 import static javafx.embed.swt.SWTFXUtils.toFXImage;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.fortiss.tooling.base.model.element.IHierarchicElement;
 import org.fortiss.tooling.base.model.element.IModelElement;
 import org.fortiss.tooling.common.ui.javafx.control.treetableview.DynamicTreeContentProviderBase;
@@ -27,6 +30,7 @@ import org.fortiss.tooling.kernel.ui.service.IModelElementHandlerService;
 
 import javafx.scene.Node;
 import javafx.scene.control.ContextMenu;
+import javafx.scene.control.MenuItem;
 import javafx.scene.control.TreeView;
 import javafx.scene.image.Image;
 import javafx.scene.image.ImageView;
@@ -45,6 +49,12 @@ public class ModelElementTreeViewer<T extends IModelElement & INamedCommentedEle
 	/** References the constructed {@link DynamicTreeViewer} "controller". */
 	protected DynamicTreeViewer<T> dynTreeViewer;
 
+	/**
+	 * List of context menu entries that supplied by clients (see
+	 * {@link #addContextMenuEntry(MenuItem)}).
+	 */
+	protected List<MenuItem> contextMenuEntries = new ArrayList<>();
+
 	/** Constructor. */
 	public ModelElementTreeViewer(TreeView<T> treeView, T modelRoot,
 			DynamicTreeContentProviderBase<T> contentProvider) {
@@ -57,9 +67,6 @@ public class ModelElementTreeViewer<T extends IModelElement & INamedCommentedEle
 	 * Creates a default UI provider for {@link DynamicTreeViewer}s that present
 	 * {@link IHierarchicElement}s. It also uses the {@link IModelElementHandlerService} for a nicer
 	 * visual appearance.
-	 * <p>
-	 * TODO(SB, unclear)
-	 * Externalizing this method into a class when subclassing seems appropriate.
 	 * 
 	 * @return The constructed UI Provider.
 	 */
@@ -88,18 +95,26 @@ public class ModelElementTreeViewer<T extends IModelElement & INamedCommentedEle
 			@Override
 			public ContextMenu createContextMenu(T element) {
 				ContextMenu menu = new ContextMenu();
-				// TODO (3209): Add sensible default operations for AF3 elements, if they are
-				// needed. Otherwise, use a list provided by subclasses that defines the menu items
-				// and their order. The code below is taken from SystemFOCUS and shall serve as a
-				// reference.
-				// MenuItem item = new MenuItem("Delete '" + getLabel(element) + "'.");
-				// item.setOnAction(event -> {
-				// new DeleteOperation(element).delete();
-				// viewer.update();
-				// });
-				// menu.getItems().add(item);
+				contextMenuEntries.forEach(entry -> menu.getItems().add(entry));
 				return menu;
 			}
 		};
 	}
+
+	/**
+	 * Method to define context {@link MenuItem}s for items of the underlying content. The given
+	 * function may use the selected element (given as a parameter to the function) to define
+	 * dynamic behavior.
+	 *
+	 * @param menuItem
+	 *            {@link MenuItem} and its logic to be added to the context menu.
+	 */
+	public void addContextMenuEntry(MenuItem menuItem) {
+		contextMenuEntries.add(menuItem);
+	}
+
+	/** Update the internal viewer. */
+	public void update() {
+		dynTreeViewer.update();
+	}
 }
-- 
GitLab