From 9cf9f5de858a91cdc7335ba4ef001a804829e5c5 Mon Sep 17 00:00:00 2001
From: Alexander Diewald <diewald@fortiss.org>
Date: Fri, 24 Jul 2020 09:59:49 +0200
Subject: [PATCH] Common.UI JFX: Commonize constructors of TreeTables

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  |  9 +--
 .../control/treetableview/DynamicList.java    | 15 ++---
 .../treetableview/DynamicTreeItem.java        | 15 ++---
 .../treetableview/DynamicTreeItemBase.java    | 31 +++++++++
 .../treetableview/DynamicTreeTableViewer.java | 66 +++++--------------
 .../treetableview/DynamicTreeViewer.java      |  2 +-
 6 files changed, 68 insertions(+), 70 deletions(-)
 create mode 100644 org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeItemBase.java

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 2a3119126..f19dcc6e3 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,11 +1,12 @@
-DynamicList.java 5c6179c9772f92ebf3117bae8743fd4bd3237dfb YELLOW
+DynamicList.java 7b5b1ce48c93292d9ee79ed58792d1157687ca3c YELLOW
 DynamicListContentProvider.java 817cba44f246a361207a88ef9a4e1869215803f7 YELLOW
 DynamicTreeContentProviderBase.java 6760a6dc5721175b1dada8f30fd9da05f7bcc4b3 GREEN
-DynamicTreeItem.java eb8b5eb58f17f2cdc55d4cb49b22518d9eaba2cf YELLOW
+DynamicTreeItem.java 53bb2886186c7cda1c3e1a9340b3df622089ff16 YELLOW
+DynamicTreeItemBase.java d883066ecc181120302ca32f328538de7a45b093 YELLOW
 DynamicTreeTableUIProviderBase.java f78c0f8b52fbc939166b3f94f7f6006cc0f4d32b GREEN
-DynamicTreeTableViewer.java 3879aab51ac30498d8fb123c72e1ffca0445c477 YELLOW
+DynamicTreeTableViewer.java 048e242856e2ac56969711d2698bdbb2c4235704 YELLOW
 DynamicTreeUIProviderBase.java e9b68607683de279d0cb8712a28dc131c5c33ece GREEN
-DynamicTreeViewer.java 725f41f4fb4b6bfa813f010fb9083ab02eea164a GREEN
+DynamicTreeViewer.java 7b22b9a99b7d34bfffdadd99db630bb683187d7f 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/DynamicList.java b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicList.java
index 5c6179c97..7b5b1ce48 100644
--- a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicList.java
+++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicList.java
@@ -24,15 +24,15 @@ import javafx.scene.control.TreeItem;
  * {@link TreeItem} with support for dynamic children using the
  * {@link DynamicList#update()} method.
  */
-public class DynamicList<T> extends TreeItem<T> implements IDynamicItem {
+public class DynamicList<T> extends DynamicTreeItemBase<T> {
 	/** The viewer. */
-	private DynamicTreeViewerBase<T> viewer;
+	private DynamicTreeContentProviderBase<T> contentProvider;
 
 	/** Constructor. */
 	@SuppressWarnings("unchecked")
-	public DynamicList(Collection<T> data, DynamicTreeViewerBase<T> viewer) {
+	public DynamicList(Collection<T> data, DynamicTreeContentProviderBase<T> contentProvider) {
 		super((T)data);
-		this.viewer = viewer;
+		this.contentProvider = contentProvider;
 	}
 
 	/** {@inheritDoc} */
@@ -47,9 +47,8 @@ public class DynamicList<T> extends TreeItem<T> implements IDynamicItem {
 		}
 		// get list of children and create tree items
 		getChildren().clear();
-		DynamicTreeContentProviderBase<T> cp = viewer.getContentProvider();
-		for(T element : cp.getFilteredSortedChildren(getValue())) {
-			DynamicTreeItem<T> dti = new DynamicTreeItem<T>(element, viewer);
+		for(T element : contentProvider.getFilteredSortedChildren(getValue())) {
+			DynamicTreeItem<T> dti = new DynamicTreeItem<T>(element, contentProvider);
 			getChildren().add(dti);
 			dti.update();
 		}
@@ -58,7 +57,7 @@ public class DynamicList<T> extends TreeItem<T> implements IDynamicItem {
 	/** {@inheritDoc} */
 	@Override
 	public boolean isLeaf() {
-		Collection<? extends Object> children = viewer.getContentProvider().getChildren(getValue());
+		Collection<? extends Object> children = contentProvider.getChildren(getValue());
 		return children == null || children.isEmpty();
 	}
 }
diff --git a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeItem.java b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeItem.java
index eb8b5eb58..53bb28861 100644
--- a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeItem.java
+++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeItem.java
@@ -24,14 +24,14 @@ import javafx.scene.control.TreeItem;
  * {@link TreeItem} with support for dynamic children using the
  * {@link DynamicTreeItem#update()} method.
  */
-public class DynamicTreeItem<T> extends TreeItem<T> implements IDynamicItem {
+public class DynamicTreeItem<T> extends DynamicTreeItemBase<T> {
 	/** The viewer. */
-	private DynamicTreeViewerBase<T> viewer;
+	private DynamicTreeContentProviderBase<T> contentProvider;
 
 	/** Constructor. */
-	public DynamicTreeItem(T data, DynamicTreeViewerBase<T> viewer) {
+	public DynamicTreeItem(T data, DynamicTreeContentProviderBase<T> viewer) {
 		super(data);
-		this.viewer = viewer;
+		this.contentProvider = viewer;
 	}
 
 	/** {@inheritDoc} */
@@ -46,13 +46,12 @@ public class DynamicTreeItem<T> extends TreeItem<T> implements IDynamicItem {
 		}
 		// get list of children and create tree items
 		getChildren().clear();
-		DynamicTreeContentProviderBase<T> cp = viewer.getContentProvider();
-		for(T element : cp.getFilteredSortedChildren(getValue())) {
+		for(T element : contentProvider.getFilteredSortedChildren(getValue())) {
 			DynamicTreeItem<T> dti;
 			if(expanded.containsKey(element)) {
 				dti = (DynamicTreeItem<T>)expanded.get(element);
 			} else {
-				dti = new DynamicTreeItem<T>(element, viewer);
+				dti = new DynamicTreeItem<T>(element, contentProvider);
 			}
 			getChildren().add(dti);
 			dti.update();
@@ -62,7 +61,7 @@ public class DynamicTreeItem<T> extends TreeItem<T> implements IDynamicItem {
 	/** {@inheritDoc} */
 	@Override
 	public boolean isLeaf() {
-		Collection<? extends Object> children = viewer.getContentProvider().getChildren(getValue());
+		Collection<? extends Object> children = contentProvider.getChildren(getValue());
 		return children == null || children.isEmpty();
 	}
 }
diff --git a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeItemBase.java b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeItemBase.java
new file mode 100644
index 000000000..d883066ec
--- /dev/null
+++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeItemBase.java
@@ -0,0 +1,31 @@
+/*-------------------------------------------------------------------------+
+| Copyright 2020 fortiss GmbH                                              |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.tooling.common.ui.javafx.control.treetableview;
+
+import javafx.scene.control.TreeItem;
+
+/**
+ * Base class for dynamic {@link TreeItem}s.
+ * 
+ * @author diewald
+ */
+public abstract class DynamicTreeItemBase<T> extends TreeItem<T> implements IDynamicItem {
+
+	/** Constructor. */
+	public DynamicTreeItemBase(T data) {
+		super(data);
+	}
+}
diff --git a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeTableViewer.java b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeTableViewer.java
index 3879aab51..048e24285 100644
--- a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeTableViewer.java
+++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeTableViewer.java
@@ -51,58 +51,33 @@ public final class DynamicTreeTableViewer<T> extends DynamicTreeViewerBase<T> {
 	public DynamicTreeTableViewer(TreeTableView<T> view, Collection<T> list,
 			DynamicListContentProvider<T> contentProvider,
 			DynamicTreeTableUIProviderBase<T> uiProvider) {
-		super(view, contentProvider);
-		this.uiProvider = uiProvider;
-		// construct view
-		this.view = view;
-		DynamicList<T> rootItem = new DynamicList<T>(list, this);
-		view.setRoot(rootItem);
-		view.setShowRoot(false);
-		view.setEditable(true);
-		view.setRowFactory(new Callback<TreeTableView<T>, TreeTableRow<T>>() {
-			@Override
-			public TreeTableRow<T> call(TreeTableView<T> param) {
-				final TreeTableRow<T> row = new TreeTableRow<T>();
-				row.setOnDragOver(evt -> {
-					T item = row.getItem();
-					if(uiProvider.dragOver(item, evt.getDragboard())) {
-						evt.acceptTransferModes(TransferMode.ANY);
-						evt.consume();
-					}
-				});
-				row.setOnDragDropped(evt -> {
-					T item = row.getItem();
-					if(uiProvider.dropClipboardContent(item, evt.getDragboard())) {
-						evt.setDropCompleted(true);
-						evt.consume();
-					}
-				});
-				return row;
-			}
-		});
-
-		TreeTableViewSelectionModel<T> selectionModel = view.getSelectionModel();
-		selectionModel.setSelectionMode(SelectionMode.MULTIPLE);
-		selectionModel.selectedItemProperty().addListener((obs, oVal, nVal) -> {
-			T ov = (oVal != null) ? oVal.getValue() : null;
-			T nv = (nVal != null) ? nVal.getValue() : null;
-			uiProvider.select(ov, nv);
-		});
-
-		rootItem.update();
-		// expand to reveal (+1 if root node is not shown
-		expandItem(rootItem, 1);
+		this(view, new DynamicList<T>(list, contentProvider), false, 0, contentProvider,
+				uiProvider);
 	}
 
 	/** Constructor. */
 	public DynamicTreeTableViewer(TreeTableView<T> view, T root, boolean showRoot, int revealLevel,
 			DynamicTreeContentProviderBase<T> contentProvider,
 			DynamicTreeTableUIProviderBase<T> uiProvider) {
+		this(view, new DynamicTreeItem<T>(root, contentProvider), showRoot, revealLevel,
+				contentProvider, uiProvider);
+	}
+
+	/** Constructor. */
+	public DynamicTreeTableViewer(T root, boolean showRoot, int revealLevel,
+			DynamicTreeContentProviderBase<T> contentProvider,
+			DynamicTreeTableUIProviderBase<T> uiProvider) {
+		this(new TreeTableView<T>(), root, showRoot, revealLevel, contentProvider, uiProvider);
+	}
+
+	/** Constructor. */
+	public DynamicTreeTableViewer(TreeTableView<T> view, DynamicTreeItemBase<T> rootItem,
+			boolean showRoot, int revealLevel, DynamicTreeContentProviderBase<T> contentProvider,
+			DynamicTreeTableUIProviderBase<T> uiProvider) {
 		super(view, contentProvider);
 		this.uiProvider = uiProvider;
 		// construct view
 		this.view = view;
-		DynamicTreeItem<T> rootItem = new DynamicTreeItem<T>(root, this);
 		view.setRoot(rootItem);
 		view.setShowRoot(showRoot);
 		view.setEditable(true);
@@ -141,13 +116,6 @@ public final class DynamicTreeTableViewer<T> extends DynamicTreeViewerBase<T> {
 		expandItem(rootItem, showRoot ? revealLevel : revealLevel + 1);
 	}
 
-	/** Constructor. */
-	public DynamicTreeTableViewer(T root, boolean showRoot, int revealLevel,
-			DynamicTreeContentProviderBase<T> contentProvider,
-			DynamicTreeTableUIProviderBase<T> uiProvider) {
-		this(new TreeTableView<T>(), root, showRoot, revealLevel, contentProvider, uiProvider);
-	}
-
 	/** Updates the viewer content. */
 	public void update() {
 		// wild cast works: see constructor
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 725f41f4f..7b22b9a99 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
@@ -52,7 +52,7 @@ public final class DynamicTreeViewer<T> extends DynamicTreeViewerBase<T> {
 		this.uiProvider = uiProvider;
 		// construct view
 		this.view = view;
-		rootItem = new DynamicTreeItem<T>(root, this);
+		rootItem = new DynamicTreeItem<T>(root, contentProvider);
 		view.setRoot(rootItem);
 		view.setShowRoot(showRoot);
 		configureCellFactory();
-- 
GitLab