From 7d39c25b1c09cb8500d950db0e671048a9702d35 Mon Sep 17 00:00:00 2001 From: Johannes Eder <eder@fortiss.org> Date: Wed, 10 Jun 2020 16:40:59 +0200 Subject: [PATCH] Impl of generic Checkbox column for TableTreeViewers Issue-Ref: 4029 Issue-Url: https://af3-developer.fortiss.org/issues/4029 Signed-off-by: Johannes Eder <eder@fortiss.org> --- .../ui/javafx/control/treetableview/.ratings | 4 +- .../DynamicTreeTableUIProviderBase.java | 52 ++++++++++++++++++- .../treetableview/DynamicTreeTableViewer.java | 18 +++++++ 3 files changed, 71 insertions(+), 3 deletions(-) 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 906ccdc1e..7d6d9a66e 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,7 +1,7 @@ DynamicTreeContentProviderBase.java 6760a6dc5721175b1dada8f30fd9da05f7bcc4b3 GREEN DynamicTreeItem.java 75dc5534b119ffdb3c10a65810c2a0f330b7955e GREEN -DynamicTreeTableUIProviderBase.java ea7de1e0fd824b61b46010d2317f93422bab6144 GREEN -DynamicTreeTableViewer.java 431ac62cbd6ad7df25852fce1b5a62a05ba510e3 GREEN +DynamicTreeTableUIProviderBase.java 928ef4fd5d6171c43d31ea628ded7e338469f5a8 YELLOW +DynamicTreeTableViewer.java 5e58a31a63f8e56d8c8e69e2c4d095809bc46bf1 YELLOW DynamicTreeUIProviderBase.java e9b68607683de279d0cb8712a28dc131c5c33ece GREEN DynamicTreeViewer.java 725f41f4fb4b6bfa813f010fb9083ab02eea164a GREEN DynamicTreeViewerBase.java a2013538b62d86f6a09efdf2cd78babac2072484 GREEN diff --git a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeTableUIProviderBase.java b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeTableUIProviderBase.java index ea7de1e0f..928ef4fd5 100644 --- a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeTableUIProviderBase.java +++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeTableUIProviderBase.java @@ -15,12 +15,16 @@ package org.fortiss.tooling.common.ui.javafx.control.treetableview; import static org.apache.commons.lang3.SystemUtils.IS_OS_LINUX; +import javafx.beans.property.SimpleBooleanProperty; +import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableValue; import javafx.scene.Node; import javafx.scene.control.ContextMenu; import javafx.scene.control.TextField; import javafx.scene.control.TreeItem; import javafx.scene.control.TreeTableCell; import javafx.scene.control.TreeTableColumn; +import javafx.scene.control.cell.CheckBoxTreeTableCell; import javafx.scene.control.cell.TextFieldTreeTableCell; import javafx.scene.input.Dragboard; import javafx.scene.input.KeyCode; @@ -111,7 +115,7 @@ public abstract class DynamicTreeTableUIProviderBase<T> { * @param value * the edited value */ - public void updateValue(T element, int column, String value) { + public void updateValue(T element, int column, Object value) { // ignored, since not editable } @@ -150,6 +154,44 @@ public abstract class DynamicTreeTableUIProviderBase<T> { }); } + /** Applies a checkbox editing support to the given checkbox column. */ + /* package */ final void applyToCheckboxColumn(int i, TreeTableColumn<T, Boolean> column) { + if(!isEditable(i)) { + column.setEditable(false); + column.setOnEditCommit(null); + return; + } + column.setEditable(true); + // setOnEditCommit() does not work for CheckBoxTreeTableCell. This is why a custom + // CellValueFactory has to be set here + column.setCellValueFactory(new Callback<TreeTableColumn.CellDataFeatures<T, Boolean>, // + ObservableValue<Boolean>>() { + + @Override + public ObservableValue<Boolean> + call(TreeTableColumn.CellDataFeatures<T, Boolean> param) { + TreeItem<T> treeItem = param.getValue(); + T value = treeItem.getValue(); + String label = getLabel(value, i); + boolean b = Boolean.valueOf(label); + SimpleBooleanProperty booleanProp = new SimpleBooleanProperty(b); + + // equal behavior to setOnEditCommit() + booleanProp.addListener(new ChangeListener<Boolean>() { + + @Override + public void changed(ObservableValue<? extends Boolean> observable, + Boolean oldValue, Boolean newValue) { + updateValue(value, i, newValue); + column.getTreeTableView().refresh(); + } + }); + return booleanProp; + } + }); + column.setCellFactory(createEditableCheckboxCellFactory()); + } + /** Creates a cell factory for editable cells. */ private Callback<TreeTableColumn<T, String>, TreeTableCell<T, String>> createEditableCellFactory(int colIndex) { @@ -158,6 +200,14 @@ public abstract class DynamicTreeTableUIProviderBase<T> { }; } + /** Creates a cell factory for editable cells. */ + private Callback<TreeTableColumn<T, Boolean>, TreeTableCell<T, Boolean>> + createEditableCheckboxCellFactory() { + return param -> { + return new CheckBoxTreeTableCell<T, Boolean>(); + }; + } + /** Custom table cell implementation to allow on key released validation. */ private class MyTextFieldTreeTableCell extends TextFieldTreeTableCell<T, String> { /** The column index of this cell. */ 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 431ac62cb..5e58a31a6 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 @@ -24,6 +24,7 @@ import javafx.scene.control.TreeTableColumn; import javafx.scene.control.TreeTableRow; import javafx.scene.control.TreeTableView; import javafx.scene.control.TreeTableView.TreeTableViewSelectionModel; +import javafx.scene.control.cell.CheckBoxTreeTableCell; import javafx.scene.input.TransferMode; import javafx.util.Callback; @@ -147,6 +148,23 @@ public final class DynamicTreeTableViewer<T> extends DynamicTreeViewerBase<T> { return column; } + /** + * Adds a boolean checkbox column to the table part of the view. The labels, context menus and + * icons are shown as defined in the {@link DynamicTreeTableUIProviderBase}. + * + * <b>IMPORTANT</b>: the getLabel method of the uiProvider must return the boolean string "true" + * or "false" in order to work correctly + */ + public TreeTableColumn<T, Boolean> addCheckboxColumn(String headerLabel, int prefWidth) { + int num = view.getColumns().size(); + TreeTableColumn<T, Boolean> column = new TreeTableColumn<>(headerLabel); + column.setPrefWidth(prefWidth); + column.setCellFactory(CheckBoxTreeTableCell.forTreeTableColumn(column)); + uiProvider.applyToCheckboxColumn(num, column); + view.getColumns().add(column); + return column; + } + /** * Adds a column to the table part of the view. The labels, context menus and icons are shown as * defined in the {@link DynamicTreeTableUIProviderBase}. -- GitLab