Skip to content
Snippets Groups Projects
Commit a7926244 authored by Florian Hölzl's avatar Florian Hölzl
Browse files

Kernel: DynamicTreeTableUIProvider now supports the editing of cells.

parent 78ed91eb
No related branches found
No related tags found
1 merge request!863907
DynamicTreeContentProviderBase.java dff437afeaf7486af05460fa54eca4fa61d7eae6 GREEN
DynamicTreeItem.java afc105cf5acf3d2506d89e0892555100c234ce5b GREEN
DynamicTreeTableUIProviderBase.java fd9fce19a65eb1006ceacb0d869bbe90a8c578b3 GREEN
DynamicTreeTableViewer.java 4f278387dd90542adc07bf0da12e92d4eaad79c4 GREEN
DynamicTreeTableUIProviderBase.java e1bd00b999db856f5b928f6edd1a11d6aa9f4a83 YELLOW
DynamicTreeTableViewer.java 4eb55f9b0b0bb3c9198fe192d43f3bcb29643f12 YELLOW
DynamicTreeUIProviderBase.java 56fe4df4577b35f1e5e6e4c4be189b706c852d52 GREEN
DynamicTreeViewer.java da5e24ae57777a482d8e12c8262513d8143bfa93 GREEN
DynamicTreeViewerBase.java 47124c847de322a0ae26eb7a114f85ce4bd02d7e GREEN
......
......@@ -13,14 +13,19 @@
*******************************************************************************/
package org.fortiss.tooling.common.ui.javafx.control.treetableview;
import static javafx.scene.control.cell.TextFieldTreeTableCell.forTreeTableColumn;
import javafx.scene.Node;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.TreeTableCell;
import javafx.scene.control.TreeTableColumn;
import javafx.util.Callback;
/**
* This UI provider is responsible to return the label, the icon, and the context menu for each cell
* in the {@link DynamicTreeTableViewer} based on the data object and the column.
*/
public abstract class DynamicTreeTableUIProviderBase {
public abstract class DynamicTreeTableUIProviderBase<T> {
/**
* @param element
* the element to be displayed in the current row
......@@ -28,7 +33,7 @@ public abstract class DynamicTreeTableUIProviderBase {
* the current column
* @return the label to be displayed in the given column
*/
public String getLabel(Object element, int column) {
public String getLabel(T element, int column) {
return "";
}
......@@ -39,7 +44,7 @@ public abstract class DynamicTreeTableUIProviderBase {
* the current column
* @return the node to be displayed as the icon in the given column
*/
public Node getIconNode(Object element, int column) {
public Node getIconNode(T element, int column) {
return null;
}
......@@ -50,7 +55,80 @@ public abstract class DynamicTreeTableUIProviderBase {
* the current column
* @return the context menu in the given column
*/
public ContextMenu createContextMenu(Object element, int column) {
public ContextMenu createContextMenu(T element, int column) {
return null;
}
/**
* Returns whether the given column is editable.
*
* @param column
* the column index
* @return whether the column is editable
*/
public boolean isEditable(int column) {
return false;
}
/**
* Updates the value after the given column was edited for the given element.
*
* @param element
* the element to be edited in the current row
* @param column
* the currently edited column
* @param value
* the edited value
*/
public void updateValue(T element, int column, String value) {
// ignored, since not editable
}
/** Applies the editing support to the given column. */
/* package */ final void applyToColumn(int i, TreeTableColumn<T, String> column) {
if(!isEditable(i)) {
column.setCellFactory(createReadOnlyCellFactory(i));
column.setEditable(false);
column.setOnEditCommit(null);
return;
}
column.setCellFactory(createEditableCellFactory());
column.setEditable(true);
column.setOnEditCommit(event -> {
T element = event.getRowValue().getValue();
int colIndex = event.getTreeTablePosition().getColumn();
String value = event.getNewValue();
updateValue(element, colIndex, value);
});
}
/** Creates a cell factory for editable cells. */
private Callback<TreeTableColumn<T, String>, TreeTableCell<T, String>>
createEditableCellFactory() {
return forTreeTableColumn();
}
/** Creates a cell factory for read-only cells. */
private Callback<TreeTableColumn<T, String>, TreeTableCell<T, String>>
createReadOnlyCellFactory(int colIndex) {
return param -> {
TreeTableCell<T, String> cell = new TreeTableCell<T, String>() {
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
ContextMenu menu = null;
Node icon = null;
if(!empty && item != null) {
T data = this.getTreeTableRow().getItem();
menu = createContextMenu(data, colIndex);
icon = getIconNode(data, colIndex);
}
this.setContextMenu(menu);
this.setGraphic(icon);
}
};
cell.textProperty().bind(cell.itemProperty());
return cell;
};
}
}
......@@ -15,22 +15,17 @@
*******************************************************************************/
package org.fortiss.tooling.common.ui.javafx.control.treetableview;
import static javafx.scene.control.cell.TextFieldTreeTableCell.forTreeTableColumn;
import javafx.beans.property.SimpleObjectProperty;
import javafx.scene.Node;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.SelectionMode;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeTableCell;
import javafx.scene.control.TreeTableColumn;
import javafx.scene.control.TreeTableView;
import javafx.util.Callback;
/**
* A JavaFX {@link TreeTableView} based on an {@link DynamicTreeContentProviderBase} and
* {@link DynamicTreeTableUIProviderBase}. This class is intended to be used as a wrapper for
* {@link TreeTableView} and its rather complex expert API.
* A JavaFX {@link TreeTableView} based on an {@link DynamicTreeContentProviderBase},
* {@link DynamicTreeTableUIProviderBase}, and {@link DynamicTreeTableEditingSupportBase}. This
* class is intended to be used as a wrapper for {@link TreeTableView} and its rather complex expert
* API.
* <P>
* This class currently supports only a static tree-table layout, i.e., there is no way to alter the
* columns unless the developer changes the underlying {@link TreeTableView} directly. Note that if
......@@ -42,12 +37,12 @@ public final class DynamicTreeTableViewer<T> extends DynamicTreeViewerBase<T> {
/** The {@link TreeTableView} control to be managed. */
private final TreeTableView<T> view;
/** The UI provider of this tree-table. */
private final DynamicTreeTableUIProviderBase uiProvider;
private final DynamicTreeTableUIProviderBase<T> uiProvider;
/** Constructor. */
public DynamicTreeTableViewer(TreeTableView<T> view, T root, boolean showRoot, int revealLevel,
DynamicTreeContentProviderBase<T> contentProvider,
DynamicTreeTableUIProviderBase uiProvider) {
DynamicTreeTableUIProviderBase<T> uiProvider) {
super(contentProvider);
this.uiProvider = uiProvider;
// construct view
......@@ -65,7 +60,7 @@ public final class DynamicTreeTableViewer<T> extends DynamicTreeViewerBase<T> {
/** Constructor. */
public DynamicTreeTableViewer(T root, boolean showRoot, int revealLevel,
DynamicTreeContentProviderBase<T> contentProvider,
DynamicTreeTableUIProviderBase uiProvider) {
DynamicTreeTableUIProviderBase<T> uiProvider) {
this(new TreeTableView<T>(), root, showRoot, revealLevel, contentProvider, uiProvider);
}
......@@ -92,51 +87,33 @@ public final class DynamicTreeTableViewer<T> extends DynamicTreeViewerBase<T> {
* Adds a column to the table part of the view. The labels, context menus and icons are shown as
* defined in the {@link DynamicTreeTableUIProviderBase}.
*/
public TreeTableColumn<T, String> addColumn(String headerLabel, int prefWidth,
boolean readOnly) {
public TreeTableColumn<T, String> addColumn(String headerLabel, int prefWidth) {
int num = view.getColumns().size();
TreeTableColumn<T, String> column = new TreeTableColumn<>(headerLabel);
column.setPrefWidth(prefWidth);
column.setCellValueFactory(param -> {
Object data = param.getValue().getValue();
T data = param.getValue().getValue();
return new SimpleObjectProperty<String>(uiProvider.getLabel(data, num));
});
Callback<TreeTableColumn<T, String>, TreeTableCell<T, String>> cellFactory;
if(readOnly) {
// Read only cell with the icon and context menu as specified in the UI provider
cellFactory = param -> {
TreeTableCell<T, String> cell = new TreeTableCell<T, String>() {
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
ContextMenu menu = null;
Node icon = null;
int index = view.getColumns().size() - 1;
if(!empty && item != null) {
T data = this.getTreeTableRow().getItem();
menu = uiProvider.createContextMenu(data, index);
icon = uiProvider.getIconNode(data, index);
}
this.setContextMenu(menu);
this.setGraphic(icon);
}
};
cell.textProperty().bind(cell.itemProperty());
return cell;
};
} else {
// Editable text field
cellFactory = forTreeTableColumn();
}
column.setCellFactory(cellFactory);
uiProvider.applyToColumn(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}.
*
* @deprecated use {@link DynamicTreeTableUIProviderBase}
*/
@Deprecated
public TreeTableColumn<T, String> addColumn(String headerLabel, int prefWidth,
boolean readOnly) {
return addColumn(headerLabel, prefWidth);
}
/** Returns the underlying {@link TreeTableView}. */
public TreeTableView<T> getControl() {
return view;
......
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