From b87b5ff55ea26a5837008c5d6059b12c62fdb785 Mon Sep 17 00:00:00 2001
From: Alexander Diewald <diewald@fortiss.org>
Date: Sun, 9 Aug 2020 17:39:59 +0200
Subject: [PATCH] JFX Trees: Add List & Stream Support to TreeViews

Issue-Ref: 3541
Issue-Url: https://af3-developer.fortiss.org/issues/3541
Signed-off-by: Alexander Diewald <diewald@fortiss.org>
---
 .../ui/javafx/control/treetableview/.ratings  |  2 +-
 .../treetableview/ModelElementTreeViewer.java |  4 +-
 .../ui/javafx/control/treetableview/.ratings  |  4 +-
 .../DynamicTreeContentProviderBase.java       |  9 +++-
 .../treetableview/DynamicTreeViewer.java      | 54 +++++++++++++------
 5 files changed, 51 insertions(+), 22 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 941a0a2c0..060717530 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,2 +1,2 @@
 DynamicTreeTableNameProvider.java 836a441e9ae6e65296c8c1426bcb76fb173254c9 YELLOW
-ModelElementTreeViewer.java 9c7637313b0ce4d70566ebb4f90dfca0d9931d09 GREEN
+ModelElementTreeViewer.java 52cc8d0da50af8211de741eddc4d345b76e316fa 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 9c7637313..52cc8d0da 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
@@ -25,7 +25,7 @@ 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.DynamicTreeItemBase;
 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.INamedElement;
@@ -131,7 +131,7 @@ public class ModelElementTreeViewer<T extends INamedElement> {
 
 	/** Expands the tree down to the given value. */
 	public void expandItem(T value) {
-		DynamicTreeItem<T> item = dynTreeViewer.findItem(value);
+		DynamicTreeItemBase<T> item = dynTreeViewer.findItem(value);
 		dynTreeViewer.expandItem(item);
 	}
 }
diff --git a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/.ratings b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/.ratings
index 4aca8284b..8150b614d 100644
--- a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/.ratings
+++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/.ratings
@@ -1,13 +1,13 @@
 DynamicList.java 786300e2e914826da239329d190abea1710478ea YELLOW
 DynamicListContentProvider.java 817cba44f246a361207a88ef9a4e1869215803f7 YELLOW
 DynamicStreamContentProvider.java f46e91400609cba54793dd240be0fe2aa0d5cced YELLOW
-DynamicTreeContentProviderBase.java 941f6ce923d08638bdea08b1c80ec6eb4d1220be YELLOW
+DynamicTreeContentProviderBase.java 0f6e0a6894752d135847608bc45efa504972bb28 YELLOW
 DynamicTreeItem.java 7486071d20e896d6ca9a9101bf105caccf3656d0 YELLOW
 DynamicTreeItemBase.java d883066ecc181120302ca32f328538de7a45b093 YELLOW
 DynamicTreeTableUIProviderBase.java f78c0f8b52fbc939166b3f94f7f6006cc0f4d32b GREEN
 DynamicTreeTableViewer.java 129fdcd259e5b7f2528dfeb407676528dcc694be YELLOW
 DynamicTreeUIProviderBase.java e9b68607683de279d0cb8712a28dc131c5c33ece GREEN
-DynamicTreeViewer.java 7b22b9a99b7d34bfffdadd99db630bb683187d7f YELLOW
+DynamicTreeViewer.java 8c20c0941bd299afce1cf237c8e29e21821c2631 YELLOW
 DynamicTreeViewerBase.java a2013538b62d86f6a09efdf2cd78babac2072484 GREEN
 IDoubleClickHandler.java 447f7769dead9a106b3ea3139ef0da51eb0b9a89 GREEN
 IDynamicItem.java 083d02459e7ec33542d9910c04abe2581e0b5422 YELLOW
diff --git a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeContentProviderBase.java b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeContentProviderBase.java
index 941f6ce92..0f6e0a689 100644
--- a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeContentProviderBase.java
+++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeContentProviderBase.java
@@ -77,8 +77,15 @@ public abstract class DynamicTreeContentProviderBase<T> {
 	}
 
 	/** Returns the filtered children of the given element. */
+	@SuppressWarnings("unchecked")
 	public final Collection<? extends T> getFilteredSortedChildren(T parent) {
-		Collection<? extends T> l = getChildren(parent);
+		Collection<? extends T> l = null;
+		if(parent instanceof Collection) {
+			l = (Collection<T>)parent;
+		} else {
+			l = getChildren(parent);
+		}
+
 		if(l == null) {
 			return emptyList();
 		}
diff --git a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeViewer.java b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeViewer.java
index 7b22b9a99..8c20c0941 100644
--- a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeViewer.java
+++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeViewer.java
@@ -17,10 +17,13 @@ package org.fortiss.tooling.common.ui.javafx.control.treetableview;
 
 import static org.apache.commons.lang3.SystemUtils.IS_OS_LINUX;
 
+import java.util.Collection;
+
 import javafx.beans.value.ChangeListener;
 import javafx.scene.control.ContextMenu;
 import javafx.scene.control.TreeCell;
 import javafx.scene.control.TreeItem;
+import javafx.scene.control.TreeTableView;
 import javafx.scene.control.TreeView;
 import javafx.scene.input.ClipboardContent;
 import javafx.scene.input.DragEvent;
@@ -38,21 +41,47 @@ public final class DynamicTreeViewer<T> extends DynamicTreeViewerBase<T> {
 	/** The {@link TreeView} control to be managed. */
 	private final TreeView<T> view;
 	/** {@link TreeItem} constructed for the root object. */
-	private final DynamicTreeItem<T> rootItem;
+	private final DynamicTreeItemBase<T> rootItem;
 	/** The UI provider implementation. */
 	private final DynamicTreeUIProviderBase<T> uiProvider;
 	/** The selection change listener. */
 	private ChangeListener<Object> selectionChangeListener = null;
 
+	/**
+	 * Constructor. The given input collection must be updated by the caller such that changes are
+	 * reflected in the corresponding {@link TreeTableView}.
+	 */
+	public DynamicTreeViewer(TreeView<T> view, Collection<T> list,
+			DynamicListContentProvider<T> contentProvider,
+			DynamicTreeUIProviderBase<T> uiProvider) {
+		this(view, new DynamicList<T>(list, contentProvider), false, 0, contentProvider,
+				uiProvider);
+	}
+
 	/** Constructor. */
 	public DynamicTreeViewer(TreeView<T> view, T root, boolean showRoot, int revealLevel,
 			DynamicTreeContentProviderBase<T> contentProvider,
 			DynamicTreeUIProviderBase<T> uiProvider) {
+		this(view, new DynamicTreeItem<T>(root, contentProvider), showRoot, revealLevel,
+				contentProvider, uiProvider);
+	}
+
+	/** Constructor. */
+	public DynamicTreeViewer(T root, boolean showRoot, int revealLevel,
+			DynamicTreeContentProviderBase<T> contentProvider,
+			DynamicTreeUIProviderBase<T> uiProvider) {
+		this(new TreeView<T>(), root, showRoot, revealLevel, contentProvider, uiProvider);
+	}
+
+	/** Constructor. */
+	public DynamicTreeViewer(TreeView<T> view, DynamicTreeItemBase<T> rootItem, boolean showRoot,
+			int revealLevel, DynamicTreeContentProviderBase<T> contentProvider,
+			DynamicTreeUIProviderBase<T> uiProvider) {
 		super(view, contentProvider);
 		this.uiProvider = uiProvider;
 		// construct view
 		this.view = view;
-		rootItem = new DynamicTreeItem<T>(root, contentProvider);
+		this.rootItem = rootItem;
 		view.setRoot(rootItem);
 		view.setShowRoot(showRoot);
 		configureCellFactory();
@@ -68,36 +97,29 @@ public final class DynamicTreeViewer<T> extends DynamicTreeViewerBase<T> {
 		expandItem(rootItem, showRoot ? revealLevel : revealLevel + 1);
 	}
 
-	/** Constructor. */
-	public DynamicTreeViewer(T root, boolean showRoot, int revealLevel,
-			DynamicTreeContentProviderBase<T> contentProvider,
-			DynamicTreeUIProviderBase<T> uiProvider) {
-		this(new TreeView<T>(), root, showRoot, revealLevel, contentProvider, uiProvider);
-	}
-
 	/** Updates the tree view. */
 	public void update() {
 		// wild cast works: see constructor
-		DynamicTreeItem<T> rootItem = (DynamicTreeItem<T>)view.getRoot();
+		DynamicTreeItemBase<T> rootItem = (DynamicTreeItemBase<T>)view.getRoot();
 		rootItem.update();
 	}
 
 	/** Sets the selection of this tree view. */
 	public void setSelection(Object value) {
 		// wild cast works: see constructor
-		DynamicTreeItem<T> rootItem = (DynamicTreeItem<T>)view.getRoot();
-		DynamicTreeItem<T> item = findItem(rootItem, value);
+		DynamicTreeItemBase<T> rootItem = (DynamicTreeItemBase<T>)view.getRoot();
+		DynamicTreeItemBase<T> item = findItem(rootItem, value);
 		int row = view.getRow(item);
 		view.getSelectionModel().select(row);
 	}
 
 	/** Searches the {@link DynamicTreeItem} for the given value from the root. */
-	public DynamicTreeItem<T> findItem(T value) {
+	public DynamicTreeItemBase<T> findItem(T value) {
 		return findItem(rootItem, value);
 	}
 
 	/** Searches the {@link DynamicTreeItem} for the given value. */
-	public DynamicTreeItem<T> findItem(DynamicTreeItem<T> item, Object value) {
+	public DynamicTreeItemBase<T> findItem(DynamicTreeItemBase<T> item, Object value) {
 		if(item == null || value == null || item.getValue() == null) {
 			return null;
 		}
@@ -105,8 +127,8 @@ public final class DynamicTreeViewer<T> extends DynamicTreeViewerBase<T> {
 			return item;
 		}
 		for(TreeItem<T> subItem : item.getChildren()) {
-			if(subItem instanceof DynamicTreeItem) {
-				DynamicTreeItem<T> i = findItem((DynamicTreeItem<T>)subItem, value);
+			if(subItem instanceof DynamicTreeItemBase) {
+				DynamicTreeItemBase<T> i = findItem((DynamicTreeItemBase<T>)subItem, value);
 				if(i != null) {
 					return i;
 				}
-- 
GitLab