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 3e45f94c4093ed5ace0c18f9768a45acbddc7f9a..941a0a2c0f1469623c5b258ec97002ce683449e6 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,2 @@ +DynamicTreeTableNameProvider.java 836a441e9ae6e65296c8c1426bcb76fb173254c9 YELLOW ModelElementTreeViewer.java 9c7637313b0ce4d70566ebb4f90dfca0d9931d09 GREEN diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/javafx/control/treetableview/DynamicTreeTableNameProvider.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/javafx/control/treetableview/DynamicTreeTableNameProvider.java new file mode 100644 index 0000000000000000000000000000000000000000..836a441e9ae6e65296c8c1426bcb76fb173254c9 --- /dev/null +++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/javafx/control/treetableview/DynamicTreeTableNameProvider.java @@ -0,0 +1,37 @@ +/*-------------------------------------------------------------------------+ +| 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.base.ui.javafx.control.treetableview; + +import org.fortiss.tooling.common.ui.javafx.control.treetableview.DynamicTreeTableUIProviderBase; +import org.fortiss.tooling.kernel.model.INamedElement; + +/** + * Extendible {@link DynamicTreeTableUIProviderBase} providing the names of elements in the first + * column. + * + * @author diewald + */ +public class DynamicTreeTableNameProvider<T extends INamedElement> + extends DynamicTreeTableUIProviderBase<T> { + /** {@inheritDoc} */ + @Override + public String getLabel(T element, int column) { + if(column == 0) { + return element.getName(); + } + return null; + } +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..5c6179c9772f92ebf3117bae8743fd4bd3237dfb --- /dev/null +++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicList.java @@ -0,0 +1,64 @@ +/******************************************************************************* + * Copyright (c) 2016, 2018 fortiss GmbH. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v2.0 which is available at + * http://www.eclipse.org/legal/epl-v20.html + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Florian Hoelzl (fortiss GmbH) - initial implementation + * Alexander Diewald (fortiss GmbH) - backport to AF3 & Integration + * improvements + * + *******************************************************************************/ +package org.fortiss.tooling.common.ui.javafx.control.treetableview; + +import java.util.Collection; +import java.util.HashMap; + +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 { + /** The viewer. */ + private DynamicTreeViewerBase<T> viewer; + + /** Constructor. */ + @SuppressWarnings("unchecked") + public DynamicList(Collection<T> data, DynamicTreeViewerBase<T> viewer) { + super((T)data); + this.viewer = viewer; + } + + /** {@inheritDoc} */ + @Override + public void update() { + // remember expanded state of children + HashMap<T, TreeItem<T>> expanded = new HashMap<>(); + for(TreeItem<T> c : getChildren()) { + if(c.isExpanded()) { + expanded.put(c.getValue(), c); + } + } + // 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); + getChildren().add(dti); + dti.update(); + } + } + + /** {@inheritDoc} */ + @Override + public boolean isLeaf() { + Collection<? extends Object> children = viewer.getContentProvider().getChildren(getValue()); + return children == null || children.isEmpty(); + } +} diff --git a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicListContentProvider.java b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicListContentProvider.java new file mode 100644 index 0000000000000000000000000000000000000000..817cba44f246a361207a88ef9a4e1869215803f7 --- /dev/null +++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicListContentProvider.java @@ -0,0 +1,37 @@ +/******************************************************************************* + * Copyright (c) 2016, 2018 fortiss GmbH. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v2.0 which is available at + * http://www.eclipse.org/legal/epl-v20.html + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Florian Hoelzl (fortiss GmbH) - initial implementation + * Alexander Diewald (fortiss GmbH) - backport to AF3 & Integration + * improvements + * + *******************************************************************************/ +package org.fortiss.tooling.common.ui.javafx.control.treetableview; + +import static java.util.Collections.emptyList; + +import java.util.Collection; + +/** + * Base class for implementing tree content providers used in {@link DynamicTreeViewer} and + * {@link DynamicTreeTableViewer}. + */ +public class DynamicListContentProvider<T> extends DynamicTreeContentProviderBase<T> { + /** Returns the children of the given parent in the tree. */ + @SuppressWarnings("unchecked") + @Override + protected Collection<T> getChildren(T parent) { + // Pseudo-cast... + if(parent instanceof Collection) { + return (Collection<T>)parent; + } + return emptyList(); + } +} 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 75dc5534b119ffdb3c10a65810c2a0f330b7955e..eb8b5eb58f17f2cdc55d4cb49b22518d9eaba2cf 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,7 +24,7 @@ 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> { +public class DynamicTreeItem<T> extends TreeItem<T> implements IDynamicItem { /** The viewer. */ private DynamicTreeViewerBase<T> viewer; @@ -34,7 +34,8 @@ public class DynamicTreeItem<T> extends TreeItem<T> { this.viewer = viewer; } - /** Updates the children of this item from the underlying content model. */ + /** {@inheritDoc} */ + @Override public void update() { // remember expanded state of children HashMap<T, TreeItem<T>> expanded = new HashMap<>(); 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 5e58a31a63f8e56d8c8e69e2c4d095809bc46bf1..3879aab51ac30498d8fb123c72e1ffca0445c477 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 @@ -17,6 +17,8 @@ package org.fortiss.tooling.common.ui.javafx.control.treetableview; import static java.lang.Integer.MAX_VALUE; +import java.util.Collection; + import javafx.beans.property.SimpleObjectProperty; import javafx.scene.control.SelectionMode; import javafx.scene.control.TreeItem; @@ -45,6 +47,53 @@ public final class DynamicTreeTableViewer<T> extends DynamicTreeViewerBase<T> { /** The UI provider of this tree-table. */ private final DynamicTreeTableUIProviderBase<T> uiProvider; + /** Constructor. */ + 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); + } + /** Constructor. */ public DynamicTreeTableViewer(TreeTableView<T> view, T root, boolean showRoot, int revealLevel, DynamicTreeContentProviderBase<T> contentProvider, @@ -102,7 +151,7 @@ public final class DynamicTreeTableViewer<T> extends DynamicTreeViewerBase<T> { /** Updates the viewer content. */ public void update() { // wild cast works: see constructor - DynamicTreeItem<T> rootItem = (DynamicTreeItem<T>)view.getRoot(); + IDynamicItem rootItem = (IDynamicItem)view.getRoot(); rootItem.update(); view.refresh(); } diff --git a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/IDynamicItem.java b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/IDynamicItem.java new file mode 100644 index 0000000000000000000000000000000000000000..083d02459e7ec33542d9910c04abe2581e0b5422 --- /dev/null +++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/IDynamicItem.java @@ -0,0 +1,29 @@ +/*-------------------------------------------------------------------------+ +| 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; + +/** + * Common methods of dynamic {@link TreeItem}s of lists and tables. + * + * @author diewald + */ +public interface IDynamicItem { + + /** Updates the children of this item from the underlying content model. */ + public void update(); +}