66 import javafx.scene.Group;
67 import javafx.scene.Node;
68 import javafx.scene.Scene;
69 import javafx.scene.control.TreeTableView.TreeTableViewFocusModel;
70 import javafx.scene.control.cell.*;
71 import javafx.scene.image.ImageView;
72 import javafx.scene.input.KeyCode;
73 import javafx.scene.layout.StackPane;
74 import javafx.scene.layout.VBox;
75 import javafx.scene.paint.Color;
76 import javafx.scene.shape.Circle;
77 import javafx.scene.shape.Rectangle;
78 import javafx.stage.Stage;
79 import javafx.util.Callback;
80
81 import org.junit.Before;
82 import org.junit.Ignore;
83 import org.junit.Test;
84
85 import com.sun.javafx.scene.control.TableColumnComparatorBase.TreeTableColumnComparator;
86 import com.sun.javafx.scene.control.infrastructure.StageLoader;
87 import com.sun.javafx.scene.control.infrastructure.VirtualFlowTestUtils;
88 import com.sun.javafx.scene.control.skin.VirtualScrollBar;
89 import com.sun.javafx.scene.control.test.Person;
90 import com.sun.javafx.scene.control.test.RT_22463_Person;
91 import com.sun.javafx.tk.Toolkit;
92
93 public class TreeTableViewTest {
94 private TreeTableView<String> treeTableView;
95 private TreeTableView.TreeTableViewSelectionModel sm;
96 private TreeTableViewFocusModel<String> fm;
97
98
99 // sample data #1
100 private TreeItem<String> root;
101 private TreeItem<String> child1;
102 private TreeItem<String> child2;
103 private TreeItem<String> child3;
104
105 // sample data #1
3599 assertEquals(1, rt_37395_index_permutationCount);
3600 assertEquals(0, rt_37395_item_removeCount);
3601 assertEquals(1, rt_37395_item_addCount);
3602 assertEquals(0, rt_37395_item_permutationCount);
3603
3604 // step three: collapse item 'two'
3605 // Same argument as in step two above: no addition or removal, just a
3606 // permutation on the index
3607 two.setExpanded(false);
3608 assertEquals(0, rt_37395_index_removeCount);
3609 assertEquals(1, rt_37395_index_addCount);
3610 assertEquals(2, rt_37395_index_permutationCount);
3611 assertEquals(0, rt_37395_item_removeCount);
3612 assertEquals(1, rt_37395_item_addCount);
3613 assertEquals(0, rt_37395_item_permutationCount);
3614
3615 sl.dispose();
3616 }
3617
3618 @Test public void test_rt_37429() {
3619 // get the current exception handler before replacing with our own,
3620 // as ListListenerHelp intercepts the exception otherwise
3621 final Thread.UncaughtExceptionHandler exceptionHandler = Thread.currentThread().getUncaughtExceptionHandler();
3622 Thread.currentThread().setUncaughtExceptionHandler((t, e) -> {
3623 e.printStackTrace();
3624 fail("We don't expect any exceptions in this test!");
3625 });
3626
3627 // table items - 3 items, 2nd item has 2 children
3628 TreeItem<String> root = new TreeItem<>();
3629
3630 TreeItem<String> two = new TreeItem<>("two");
3631 two.getChildren().add(new TreeItem<>("childOne"));
3632 two.getChildren().add(new TreeItem<>("childTwo"));
3633 two.setExpanded(true);
3634
3635 root.getChildren().add(new TreeItem<>("one"));
3636 root.getChildren().add(two);
3637 root.getChildren().add(new TreeItem<>("three"));
3638
3639 // table columns - 1 column; name
3640 TreeTableColumn<String, String> nameColumn = new TreeTableColumn<>("name");
3641 nameColumn.setCellValueFactory(param -> new ReadOnlyObjectWrapper(param.getValue().getValue()));
3642 nameColumn.setPrefWidth(200);
3643
3644 // table
3645 TreeTableView<String> table = new TreeTableView<>();
3646 table.setShowRoot(false);
3647 table.setRoot(root);
3648 table.getColumns().addAll(nameColumn);
3649
3650 table.getSelectionModel().getSelectedItems().addListener((ListChangeListener<TreeItem<String>>) c -> {
3651 while (c.next()) {
3652 if(c.wasRemoved()) {
3653 // The removed list of items must be iterated or the AIOOBE will
3654 // not be thrown when getAddedSubList is called.
3655 c.getRemoved().forEach(item -> {});
3656 }
3657
3658 if (c.wasAdded()) {
3659 c.getAddedSubList();
3660 }
3661 }
3662 });
3663
3664 StageLoader sl = new StageLoader(table);
3665
3666 table.getSelectionModel().select(0);
3667 table.getSortOrder().add(nameColumn);
3668
3669 sl.dispose();
3670
3671 // reset the exception handler
3672 Thread.currentThread().setUncaughtExceptionHandler(exceptionHandler);
3673 }
3674
3675 private int rt_37429_items_change_count = 0;
3676 private int rt_37429_cells_change_count = 0;
3677 @Test public void test_rt_37429_sortEventsShouldNotFireExtraChangeEvents() {
3678 // table items - 3 items, 2nd item has 2 children
3679 TreeItem<String> root = new TreeItem<>();
3680
3681 root.getChildren().add(new TreeItem<>("a"));
3682 root.getChildren().add(new TreeItem<>("c"));
3683 root.getChildren().add(new TreeItem<>("b"));
3684
3685 // table columns - 1 column; name
3686 TreeTableColumn<String, String> nameColumn = new TreeTableColumn<>("name");
3687 nameColumn.setCellValueFactory(param -> new ReadOnlyObjectWrapper(param.getValue().getValue()));
3688 nameColumn.setPrefWidth(200);
3689
3690 // table
3691 TreeTableView<String> table = new TreeTableView<>();
3692 table.setShowRoot(false);
|
66 import javafx.scene.Group;
67 import javafx.scene.Node;
68 import javafx.scene.Scene;
69 import javafx.scene.control.TreeTableView.TreeTableViewFocusModel;
70 import javafx.scene.control.cell.*;
71 import javafx.scene.image.ImageView;
72 import javafx.scene.input.KeyCode;
73 import javafx.scene.layout.StackPane;
74 import javafx.scene.layout.VBox;
75 import javafx.scene.paint.Color;
76 import javafx.scene.shape.Circle;
77 import javafx.scene.shape.Rectangle;
78 import javafx.stage.Stage;
79 import javafx.util.Callback;
80
81 import org.junit.Before;
82 import org.junit.Ignore;
83 import org.junit.Test;
84
85 import com.sun.javafx.scene.control.TableColumnComparatorBase.TreeTableColumnComparator;
86 import com.sun.javafx.scene.control.infrastructure.ControlTestUtils;
87 import com.sun.javafx.scene.control.infrastructure.StageLoader;
88 import com.sun.javafx.scene.control.infrastructure.VirtualFlowTestUtils;
89 import com.sun.javafx.scene.control.skin.VirtualScrollBar;
90 import com.sun.javafx.scene.control.test.Person;
91 import com.sun.javafx.scene.control.test.RT_22463_Person;
92 import com.sun.javafx.tk.Toolkit;
93
94 public class TreeTableViewTest {
95 private TreeTableView<String> treeTableView;
96 private TreeTableView.TreeTableViewSelectionModel sm;
97 private TreeTableViewFocusModel<String> fm;
98
99
100 // sample data #1
101 private TreeItem<String> root;
102 private TreeItem<String> child1;
103 private TreeItem<String> child2;
104 private TreeItem<String> child3;
105
106 // sample data #1
3600 assertEquals(1, rt_37395_index_permutationCount);
3601 assertEquals(0, rt_37395_item_removeCount);
3602 assertEquals(1, rt_37395_item_addCount);
3603 assertEquals(0, rt_37395_item_permutationCount);
3604
3605 // step three: collapse item 'two'
3606 // Same argument as in step two above: no addition or removal, just a
3607 // permutation on the index
3608 two.setExpanded(false);
3609 assertEquals(0, rt_37395_index_removeCount);
3610 assertEquals(1, rt_37395_index_addCount);
3611 assertEquals(2, rt_37395_index_permutationCount);
3612 assertEquals(0, rt_37395_item_removeCount);
3613 assertEquals(1, rt_37395_item_addCount);
3614 assertEquals(0, rt_37395_item_permutationCount);
3615
3616 sl.dispose();
3617 }
3618
3619 @Test public void test_rt_37429() {
3620 // table items - 3 items, 2nd item has 2 children
3621 TreeItem<String> root = new TreeItem<>();
3622
3623 TreeItem<String> two = new TreeItem<>("two");
3624 two.getChildren().add(new TreeItem<>("childOne"));
3625 two.getChildren().add(new TreeItem<>("childTwo"));
3626 two.setExpanded(true);
3627
3628 root.getChildren().add(new TreeItem<>("one"));
3629 root.getChildren().add(two);
3630 root.getChildren().add(new TreeItem<>("three"));
3631
3632 // table columns - 1 column; name
3633 TreeTableColumn<String, String> nameColumn = new TreeTableColumn<>("name");
3634 nameColumn.setCellValueFactory(param -> new ReadOnlyObjectWrapper(param.getValue().getValue()));
3635 nameColumn.setPrefWidth(200);
3636
3637 // table
3638 TreeTableView<String> table = new TreeTableView<>();
3639 table.setShowRoot(false);
3640 table.setRoot(root);
3641 table.getColumns().addAll(nameColumn);
3642
3643 table.getSelectionModel().getSelectedItems().addListener((ListChangeListener<TreeItem<String>>) c -> {
3644 while (c.next()) {
3645 if(c.wasRemoved()) {
3646 // The removed list of items must be iterated or the AIOOBE will
3647 // not be thrown when getAddedSubList is called.
3648 c.getRemoved().forEach(item -> {});
3649 }
3650
3651 if (c.wasAdded()) {
3652 c.getAddedSubList();
3653 }
3654 }
3655 });
3656
3657 final Thread.UncaughtExceptionHandler exceptionHandler = ControlTestUtils.setHandler();
3658 StageLoader sl = new StageLoader(table);
3659
3660 try {
3661 table.getSelectionModel().select(0);
3662 table.getSortOrder().add(nameColumn);
3663 } finally {
3664 sl.dispose();
3665 ControlTestUtils.resetHandler(exceptionHandler);
3666 }
3667 }
3668
3669 private int rt_37429_items_change_count = 0;
3670 private int rt_37429_cells_change_count = 0;
3671 @Test public void test_rt_37429_sortEventsShouldNotFireExtraChangeEvents() {
3672 // table items - 3 items, 2nd item has 2 children
3673 TreeItem<String> root = new TreeItem<>();
3674
3675 root.getChildren().add(new TreeItem<>("a"));
3676 root.getChildren().add(new TreeItem<>("c"));
3677 root.getChildren().add(new TreeItem<>("b"));
3678
3679 // table columns - 1 column; name
3680 TreeTableColumn<String, String> nameColumn = new TreeTableColumn<>("name");
3681 nameColumn.setCellValueFactory(param -> new ReadOnlyObjectWrapper(param.getValue().getValue()));
3682 nameColumn.setPrefWidth(200);
3683
3684 // table
3685 TreeTableView<String> table = new TreeTableView<>();
3686 table.setShowRoot(false);
|