From 3ec4a1a626a558c41dee0488f3b6099af190f088 Mon Sep 17 00:00:00 2001 From: Alexander Diewald <diewald@fortiss.org> Date: Fri, 24 Jul 2020 11:10:48 +0200 Subject: [PATCH] Common.UI JFX: Support for Stream-based 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 | 5 ++- .../control/treetableview/DynamicList.java | 15 ++++++- .../DynamicStreamContentProvider.java | 42 +++++++++++++++++++ .../treetableview/DynamicTreeTableViewer.java | 18 +++++++- 4 files changed, 76 insertions(+), 4 deletions(-) create mode 100644 org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicStreamContentProvider.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 238e57e7d..c685e5bd0 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,10 +1,11 @@ -DynamicList.java 6206ef9150c1f4bf07102820ae2a647ec3fb882b YELLOW +DynamicList.java 786300e2e914826da239329d190abea1710478ea YELLOW DynamicListContentProvider.java 817cba44f246a361207a88ef9a4e1869215803f7 YELLOW +DynamicStreamContentProvider.java f46e91400609cba54793dd240be0fe2aa0d5cced YELLOW DynamicTreeContentProviderBase.java 6760a6dc5721175b1dada8f30fd9da05f7bcc4b3 GREEN DynamicTreeItem.java 7486071d20e896d6ca9a9101bf105caccf3656d0 YELLOW DynamicTreeItemBase.java d883066ecc181120302ca32f328538de7a45b093 YELLOW DynamicTreeTableUIProviderBase.java f78c0f8b52fbc939166b3f94f7f6006cc0f4d32b GREEN -DynamicTreeTableViewer.java 048e242856e2ac56969711d2698bdbb2c4235704 YELLOW +DynamicTreeTableViewer.java 8ce7fdb68560aab27bc2dbe4d3c52c4447cd8906 YELLOW DynamicTreeUIProviderBase.java e9b68607683de279d0cb8712a28dc131c5c33ece GREEN DynamicTreeViewer.java 7b22b9a99b7d34bfffdadd99db630bb683187d7f YELLOW DynamicTreeViewerBase.java a2013538b62d86f6a09efdf2cd78babac2072484 GREEN 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 6206ef915..786300e2e 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 @@ -17,6 +17,8 @@ package org.fortiss.tooling.common.ui.javafx.control.treetableview; import java.util.Collection; import java.util.HashMap; +import java.util.function.Supplier; +import java.util.stream.Stream; import javafx.scene.control.TreeItem; @@ -28,7 +30,18 @@ public class DynamicList<T> extends DynamicTreeItemBase<T> { /** The viewer. */ private DynamicTreeContentProviderBase<T> contentProvider; - /** Constructor. */ + /** + * Constructor. The given {@link Supplier} is queried on updates to retrieve a recent list of + * elements to display. + */ + @SuppressWarnings("unchecked") + public DynamicList(Supplier<Stream<T>> data, + DynamicStreamContentProvider<T, Supplier<Stream<T>>> contentProvider) { + super((T)data); + this.contentProvider = contentProvider; + } + + /** Constructor. The given collection must be updated by the initializer to reflect changes. */ @SuppressWarnings("unchecked") public DynamicList(Collection<T> data, DynamicTreeContentProviderBase<T> contentProvider) { super((T)data); diff --git a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicStreamContentProvider.java b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicStreamContentProvider.java new file mode 100644 index 000000000..f46e91400 --- /dev/null +++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicStreamContentProvider.java @@ -0,0 +1,42 @@ +/*-------------------------------------------------------------------------+ +| 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 static java.util.Collections.emptyList; +import static java.util.stream.Collectors.toList; + +import java.util.Collection; +import java.util.function.Supplier; +import java.util.stream.Stream; + +/** + * Content provider whose element list is dynamically retrieved from a supplier. + * + * @author diewald + */ +public class DynamicStreamContentProvider<T, S extends Supplier<Stream<T>>> + extends DynamicTreeContentProviderBase<T> { + + /** {@inheritDoc} */ + @Override + protected Collection<? extends T> getChildren(T parent) { + if(parent instanceof Supplier) { + @SuppressWarnings("unchecked") Supplier<Stream<T>> supp = ((S)parent); + return supp.get().collect(toList()); + } + return emptyList(); + } +} 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 048e24285..8ce7fdb68 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 @@ -18,6 +18,8 @@ package org.fortiss.tooling.common.ui.javafx.control.treetableview; import static java.lang.Integer.MAX_VALUE; import java.util.Collection; +import java.util.function.Supplier; +import java.util.stream.Stream; import javafx.beans.property.SimpleObjectProperty; import javafx.scene.control.SelectionMode; @@ -47,7 +49,21 @@ public final class DynamicTreeTableViewer<T> extends DynamicTreeViewerBase<T> { /** The UI provider of this tree-table. */ private final DynamicTreeTableUIProviderBase<T> uiProvider; - /** Constructor. */ + /** + * Constructor. The given {@link Supplier} is queried on updates to obtain a list of elements to + * display. + */ + public DynamicTreeTableViewer(TreeTableView<T> view, Supplier<Stream<T>> listFctn, + DynamicStreamContentProvider<T, Supplier<Stream<T>>> contentProvider, + DynamicTreeTableUIProviderBase<T> uiProvider) { + this(view, new DynamicList<T>(listFctn, contentProvider), false, 0, contentProvider, + uiProvider); + } + + /** + * Constructor. The given input collection must be updated by the caller such that changes are + * reflected in the corresponding {@link TreeTableView}. + */ public DynamicTreeTableViewer(TreeTableView<T> view, Collection<T> list, DynamicListContentProvider<T> contentProvider, DynamicTreeTableUIProviderBase<T> uiProvider) { -- GitLab