Skip to content

Commit 4cf66d9

Browse files
author
Jeanette Winzenburg
committed
8187309: TreeCell must not change tree's data
Reviewed-by: mstrauss, mhanl, aghaisas
1 parent 590033f commit 4cf66d9

File tree

4 files changed

+91
-6
lines changed

4 files changed

+91
-6
lines changed

modules/javafx.controls/src/main/java/javafx/scene/control/TreeCell.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -414,12 +414,9 @@ public String getName() {
414414
newValue));
415415
}
416416

417+
// FIXME: JDK-8187314 must respect actual committed value
417418
// update the item within this cell, so that it represents the new value
418-
if (treeItem != null) {
419-
treeItem.setValue(newValue);
420-
updateTreeItem(treeItem);
421-
updateItem(newValue, false);
422-
}
419+
updateItem(newValue, false);
423420

424421
if (tree != null) {
425422
// reset the editing item in the TreetView

modules/javafx.controls/src/main/java/javafx/scene/control/TreeView.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,8 @@ public TreeView(TreeItem<T> root) {
337337
MultipleSelectionModel<TreeItem<T>> sm = new TreeViewBitSetSelectionModel<T>(this);
338338
setSelectionModel(sm);
339339
setFocusModel(new TreeViewFocusModel<T>(this));
340+
341+
setOnEditCommit(DEFAULT_EDIT_COMMIT_HANDLER);
340342
}
341343

342344

@@ -845,6 +847,11 @@ public final ObjectProperty<EventHandler<EditEvent<T>>> onEditCommitProperty() {
845847
return onEditCommit;
846848
}
847849

850+
private EventHandler<TreeView.EditEvent<T>> DEFAULT_EDIT_COMMIT_HANDLER = t -> {
851+
TreeItem<T> editedItem = t.getTreeItem();
852+
if (editedItem == null) return;
853+
editedItem.setValue(t.getNewValue());
854+
};
848855

849856
// --- On Edit Cancel
850857
private ObjectProperty<EventHandler<EditEvent<T>>> onEditCancel;

modules/javafx.controls/src/test/java/test/javafx/scene/control/TreeCellTest.java

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
import javafx.scene.control.TreeItem;
5252
import javafx.scene.control.TreeView;
5353
import javafx.scene.control.TreeView.EditEvent;
54+
import javafx.scene.control.cell.TextFieldTreeCell;
5455
import javafx.scene.control.skin.TreeCellSkin;
5556
import test.com.sun.javafx.scene.control.infrastructure.StageLoader;
5657
import test.com.sun.javafx.scene.control.infrastructure.VirtualFlowTestUtils;
@@ -888,6 +889,85 @@ public void testCommitEditMustNotFireCancel() {
888889
assertEquals("commit must not have fired editCancel", 0, events.size());
889890
}
890891

892+
//------------- JDK-8187309: fix editing mechanics to comply to specification
893+
894+
@Test
895+
public void testTreeHasDefaultCommitHandler() {
896+
assertNotNull("treeView must have default commit handler", tree.getOnEditCommit());
897+
}
898+
899+
@Test
900+
public void testDefaultCommitUpdatesData() {
901+
TreeItem<String> editingItem = setupForEditing(cell);
902+
tree.edit(editingItem);
903+
String value = "edited";
904+
cell.commitEdit(value);
905+
assertEquals("value committed", value, editingItem.getValue());
906+
}
907+
908+
@Test
909+
public void testDefaultCommitUpdatesCell() {
910+
TreeCell<String> cell = TextFieldTreeCell.forTreeView().call(tree);
911+
TreeItem<String> editingItem = setupForEditing(cell);
912+
tree.edit(editingItem);
913+
String value = "edited";
914+
cell.commitEdit(value);
915+
assertEquals("cell text updated to committed value", value, cell.getText());
916+
}
917+
918+
@Test
919+
public void testDoNothingCommitHandlerDoesNotUpdateData() {
920+
TreeItem<String> editingItem = setupForEditing(cell);
921+
String oldValue = editingItem.getValue();
922+
// do nothing handler
923+
tree.setOnEditCommit(e -> {});
924+
tree.edit(editingItem);
925+
String value = "edited";
926+
cell.commitEdit(value);
927+
assertEquals("edited value must not be committed", oldValue, editingItem.getValue());
928+
}
929+
930+
@Ignore("JDK-8187314")
931+
@Test
932+
public void testDoNothingCommitHandlerDoesNotUpdateCell() {
933+
TreeCell<String> cell = TextFieldTreeCell.forTreeView().call(tree);
934+
TreeItem<String> editingItem = setupForEditing(cell);
935+
String oldValue = editingItem.getValue();
936+
// do nothing handler
937+
tree.setOnEditCommit(e -> {});
938+
tree.edit(editingItem);
939+
String value = "edited";
940+
cell.commitEdit(value);
941+
assertEquals("cell text must not have changed", oldValue, cell.getText());
942+
}
943+
944+
945+
/**
946+
* Sets tree editable, configures the given cell for editing in tree at index 1
947+
* and returns the treeItem at that index.
948+
*/
949+
private TreeItem<String> setupForEditing(TreeCell<String> editingCell) {
950+
tree.setEditable(true);
951+
editingCell.updateTreeView(tree);
952+
editingCell.updateIndex(1);
953+
return editingCell.getTreeItem();
954+
}
955+
956+
/**
957+
* Test test setup.
958+
*/
959+
@Test
960+
public void testSetupForEditing() {
961+
TreeCell<String> cell = new TreeCell<>();
962+
TreeItem<String> cellTreeItem = setupForEditing(cell);
963+
assertTrue("sanity: tree must be editable", tree.isEditable());
964+
assertEquals("sanity: returned treeItem", cellTreeItem, cell.getTreeItem());
965+
assertEquals(1, cell.getIndex());
966+
assertEquals("sanity: cell configured with tree's treeItem at index",
967+
tree.getTreeItem(cell.getIndex()), cell.getTreeItem());
968+
assertNull("sanity: config doesn't change tree state", tree.getEditingItem());
969+
}
970+
891971

892972
// When the tree view item's change and affects a cell that is editing, then what?
893973
// When the tree cell's index is changed while it is editing, then what?

modules/javafx.controls/src/test/java/test/javafx/scene/control/TreeViewTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1195,7 +1195,8 @@ public void updateItem(String item, boolean empty) {
11951195
treeView.setOnEditStart(t -> {
11961196
rt_29650_start_count++;
11971197
});
1198-
treeView.setOnEditCommit(t -> {
1198+
// Note: must add a commit handler to not replace the default (saving) handler
1199+
treeView.addEventHandler(TreeView.editCommitEvent(), t -> {
11991200
rt_29650_commit_count++;
12001201
});
12011202
treeView.setOnEditCancel(t -> {

0 commit comments

Comments
 (0)