From ba964702ea5012995f1a3981509bfe80478c3b99 Mon Sep 17 00:00:00 2001
From: Simon Barner <barner@fortiss.org>
Date: Wed, 10 Apr 2019 17:34:38 +0200
Subject: [PATCH] Refactor ModelElementTreeViewer to enable use in another
 scenario

* Restrict input to INamedElement, only
* Add expandItem()
* Define ModelElementUIProvider as explicit (inner) type
  * Enable subclassing if needed
  * Use model element handler to obtain name

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

Signed-off-by: Simon Barner <barner@fortiss.org>
---
 .../ui/javafx/control/treetableview/.ratings  |  2 +-
 .../treetableview/ModelElementTreeViewer.java | 79 +++++++++++--------
 2 files changed, 46 insertions(+), 35 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 a9e7b2649..7b90b5dde 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 8a555fc12eb6c0531f6334fdc61e9abf52ff784d YELLOW
+ModelElementTreeViewer.java 9c7637313b0ce4d70566ebb4f90dfca0d9931d09 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 8a555fc12..9c7637313 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
@@ -16,6 +16,7 @@
 package org.fortiss.tooling.base.ui.javafx.control.treetableview;
 
 import static javafx.embed.swt.SWTFXUtils.toFXImage;
+import static org.fortiss.tooling.kernel.ui.util.KernelUIUtils.getName;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -24,9 +25,10 @@ import org.fortiss.tooling.base.model.element.IHierarchicElement;
 import org.fortiss.tooling.base.model.element.IModelElement;
 import org.fortiss.tooling.common.ui.javafx.AF3FXViewPart;
 import org.fortiss.tooling.common.ui.javafx.control.treetableview.DynamicTreeContentProviderBase;
+import org.fortiss.tooling.common.ui.javafx.control.treetableview.DynamicTreeItem;
 import org.fortiss.tooling.common.ui.javafx.control.treetableview.DynamicTreeUIProviderBase;
 import org.fortiss.tooling.common.ui.javafx.control.treetableview.DynamicTreeViewer;
-import org.fortiss.tooling.kernel.model.INamedCommentedElement;
+import org.fortiss.tooling.kernel.model.INamedElement;
 import org.fortiss.tooling.kernel.ui.service.IModelElementHandlerService;
 
 import javafx.scene.Node;
@@ -39,18 +41,48 @@ import javafx.scene.image.ImageView;
 /**
  * This class is a support fragment for creating tree views in JavaFX Controls. It provides the view
  * counter part of a {@link DynamicTreeContentProviderBase}. The content provider is responsible
- * for selecting elements from a base model and ordering them acc. to a custom defined structure.
+ * for selecting elements from a base model and ordering them according to a custom defined
+ * structure.
  * These two fragments have to be combined in a JavaFX controller inheriting from the base class
  * {@link AF3FXViewPart}.
  * <p>
  * TreeViewer that constructs a DynamicTreeViewer whose UI provider uses the methods and kernel
- * services for {@link IHierarchicElement}s and {@link INamedCommentedElement}s.
+ * services for {@link INamedElement}s.
  * The Viewer uses a composition principle where a client must provide a {@link TreeView} (JavaFX),
  * a root element (AF3), and a content provider that selects the elements to be displayed.
  * 
  * @author diewald
  */
-public class ModelElementTreeViewer<T extends IModelElement & INamedCommentedElement> {
+public class ModelElementTreeViewer<T extends INamedElement> {
+
+	/** {@link DynamicTreeUIProviderBase} for named (and commented) {@link IModelElement}s . */
+	protected class ModelElementUIProvider extends DynamicTreeUIProviderBase<T> {
+		/** {@inheritDoc} */
+		@Override
+		public String getLabel(T element) {
+			return getName(element);
+		}
+
+		/** {@inheritDoc} */
+		@Override
+		public Node getIconNode(T element) {
+			org.eclipse.swt.graphics.Image icon =
+					IModelElementHandlerService.getInstance().getIcon(element);
+			if(icon != null) {
+				Image fxImage = toFXImage(icon.getImageData(), null);
+				return new ImageView(fxImage);
+			}
+			return null;
+		}
+
+		/** {@inheritDoc} */
+		@Override
+		public ContextMenu createContextMenu(T element) {
+			ContextMenu menu = new ContextMenu();
+			contextMenuEntries.forEach(entry -> menu.getItems().add(entry));
+			return menu;
+		}
+	}
 
 	/** References the constructed {@link DynamicTreeViewer} "controller". */
 	protected DynamicTreeViewer<T> dynTreeViewer;
@@ -64,7 +96,7 @@ public class ModelElementTreeViewer<T extends IModelElement & INamedCommentedEle
 	/** Constructor. */
 	public ModelElementTreeViewer(TreeView<T> treeView, T modelRoot,
 			DynamicTreeContentProviderBase<T> contentProvider) {
-		DynamicTreeUIProviderBase<T> uiProvider = createContentUIProvider();
+		DynamicTreeUIProviderBase<T> uiProvider = createUIProvider();
 		dynTreeViewer =
 				new DynamicTreeViewer<T>(treeView, modelRoot, true, 0, contentProvider, uiProvider);
 	}
@@ -76,35 +108,8 @@ public class ModelElementTreeViewer<T extends IModelElement & INamedCommentedEle
 	 * 
 	 * @return The constructed UI Provider.
 	 */
-	protected DynamicTreeUIProviderBase<T> createContentUIProvider() {
-		return new DynamicTreeUIProviderBase<T>() {
-
-			/** {@inheritDoc} */
-			@Override
-			public String getLabel(T element) {
-				return element.getName();
-			}
-
-			/** {@inheritDoc} */
-			@Override
-			public Node getIconNode(T element) {
-				org.eclipse.swt.graphics.Image icon =
-						IModelElementHandlerService.getInstance().getIcon(element);
-				if(icon != null) {
-					Image fxImage = toFXImage(icon.getImageData(), null);
-					return new ImageView(fxImage);
-				}
-				return null;
-			}
-
-			/** {@inheritDoc} */
-			@Override
-			public ContextMenu createContextMenu(T element) {
-				ContextMenu menu = new ContextMenu();
-				contextMenuEntries.forEach(entry -> menu.getItems().add(entry));
-				return menu;
-			}
-		};
+	protected DynamicTreeUIProviderBase<T> createUIProvider() {
+		return new ModelElementUIProvider();
 	}
 
 	/**
@@ -123,4 +128,10 @@ public class ModelElementTreeViewer<T extends IModelElement & INamedCommentedEle
 	public void update() {
 		dynTreeViewer.update();
 	}
+
+	/** Expands the tree down to the given value. */
+	public void expandItem(T value) {
+		DynamicTreeItem<T> item = dynTreeViewer.findItem(value);
+		dynTreeViewer.expandItem(item);
+	}
 }
-- 
GitLab