Skip to content
Snippets Groups Projects
Commit 38a12ae5 authored by Alexander Diewald's avatar Alexander Diewald
Browse files

Common.UI/JFX: Support lists in Tables

parent 6abe0e14
Branches 3870_delegating_factories
No related tags found
1 merge request!1263541
Showing with 221 additions and 3 deletions
DynamicTreeTableNameProvider.java 836a441e9ae6e65296c8c1426bcb76fb173254c9 YELLOW
ModelElementTreeViewer.java 9c7637313b0ce4d70566ebb4f90dfca0d9931d09 GREEN ModelElementTreeViewer.java 9c7637313b0ce4d70566ebb4f90dfca0d9931d09 GREEN
/*-------------------------------------------------------------------------+
| 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;
}
}
/*******************************************************************************
* 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();
}
}
/*******************************************************************************
* 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();
}
}
...@@ -24,7 +24,7 @@ import javafx.scene.control.TreeItem; ...@@ -24,7 +24,7 @@ import javafx.scene.control.TreeItem;
* {@link TreeItem} with support for dynamic children using the * {@link TreeItem} with support for dynamic children using the
* {@link DynamicTreeItem#update()} method. * {@link DynamicTreeItem#update()} method.
*/ */
public class DynamicTreeItem<T> extends TreeItem<T> { public class DynamicTreeItem<T> extends TreeItem<T> implements IDynamicItem {
/** The viewer. */ /** The viewer. */
private DynamicTreeViewerBase<T> viewer; private DynamicTreeViewerBase<T> viewer;
...@@ -34,7 +34,8 @@ public class DynamicTreeItem<T> extends TreeItem<T> { ...@@ -34,7 +34,8 @@ public class DynamicTreeItem<T> extends TreeItem<T> {
this.viewer = viewer; this.viewer = viewer;
} }
/** Updates the children of this item from the underlying content model. */ /** {@inheritDoc} */
@Override
public void update() { public void update() {
// remember expanded state of children // remember expanded state of children
HashMap<T, TreeItem<T>> expanded = new HashMap<>(); HashMap<T, TreeItem<T>> expanded = new HashMap<>();
......
...@@ -17,6 +17,8 @@ package org.fortiss.tooling.common.ui.javafx.control.treetableview; ...@@ -17,6 +17,8 @@ package org.fortiss.tooling.common.ui.javafx.control.treetableview;
import static java.lang.Integer.MAX_VALUE; import static java.lang.Integer.MAX_VALUE;
import java.util.Collection;
import javafx.beans.property.SimpleObjectProperty; import javafx.beans.property.SimpleObjectProperty;
import javafx.scene.control.SelectionMode; import javafx.scene.control.SelectionMode;
import javafx.scene.control.TreeItem; import javafx.scene.control.TreeItem;
...@@ -45,6 +47,53 @@ public final class DynamicTreeTableViewer<T> extends DynamicTreeViewerBase<T> { ...@@ -45,6 +47,53 @@ public final class DynamicTreeTableViewer<T> extends DynamicTreeViewerBase<T> {
/** The UI provider of this tree-table. */ /** The UI provider of this tree-table. */
private final DynamicTreeTableUIProviderBase<T> uiProvider; 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. */ /** Constructor. */
public DynamicTreeTableViewer(TreeTableView<T> view, T root, boolean showRoot, int revealLevel, public DynamicTreeTableViewer(TreeTableView<T> view, T root, boolean showRoot, int revealLevel,
DynamicTreeContentProviderBase<T> contentProvider, DynamicTreeContentProviderBase<T> contentProvider,
...@@ -102,7 +151,7 @@ public final class DynamicTreeTableViewer<T> extends DynamicTreeViewerBase<T> { ...@@ -102,7 +151,7 @@ public final class DynamicTreeTableViewer<T> extends DynamicTreeViewerBase<T> {
/** Updates the viewer content. */ /** Updates the viewer content. */
public void update() { public void update() {
// wild cast works: see constructor // wild cast works: see constructor
DynamicTreeItem<T> rootItem = (DynamicTreeItem<T>)view.getRoot(); IDynamicItem rootItem = (IDynamicItem)view.getRoot();
rootItem.update(); rootItem.update();
view.refresh(); view.refresh();
} }
......
/*-------------------------------------------------------------------------+
| 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();
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment