diff options
| author | Xi Yan | 2019-03-12 15:12:37 +0000 |
|---|---|---|
| committer | Xi Yan | 2019-03-12 17:19:56 +0000 |
| commit | 5a77dd402a843c024214579c91628da0a2671744 (patch) | |
| tree | 3b9cd59c713e42d87a8a72299ce5e2d0ce0c05b1 | |
| parent | 7a256e2e3c59e029a07d7c5319f7d366b59e1c3c (diff) | |
| download | eclipse.platform.swt-5a77dd402a843c024214579c91628da0a2671744.tar.gz eclipse.platform.swt-5a77dd402a843c024214579c91628da0a2671744.tar.xz eclipse.platform.swt-5a77dd402a843c024214579c91628da0a2671744.zip | |
Bug 489751 - [GTK3] disposing an item will select a node
Fix regression in ant.test.ui. Tested with AntUITests. Added regression
test that disposing tree items will not trigger SWT.Selection event.
Change-Id: Ia10cb57f8087e6690bba073f78aa3a73d26914fa
3 files changed, 73 insertions, 8 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TableItem.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TableItem.java index b2338bba37..cb89441e33 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TableItem.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TableItem.java @@ -242,10 +242,8 @@ void destroyWidget () { @Override public void dispose () { // Workaround to Bug489751, avoid selecting next node when selected node is disposed. - if (parent != null && parent.getItemCount() > 0) { - TableItem tmpItem = parent.getItem(0); - long /*int*/ path = GTK.gtk_tree_model_get_path (parent.modelHandle, tmpItem.handle); - GTK.gtk_tree_view_set_cursor (parent.handle, path, 0, false); + if (parent != null && parent.getItemCount() > 0 && parent.getSelectionCount() == 0) { + parent.setSelection(parent.getItem(0)); parent.deselectAll(); } super.dispose(); diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TreeItem.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TreeItem.java index fe360c5136..e2d6eadabb 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TreeItem.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TreeItem.java @@ -1078,10 +1078,8 @@ void releaseWidget () { @Override public void dispose () { // Workaround to Bug489751, avoid selecting next node when selected node is disposed. - if (parent != null && parent.getItemCount() > 0) { - TreeItem tmpItem = parent.getItem(0); - long /*int*/ path = GTK.gtk_tree_model_get_path (parent.modelHandle, tmpItem.handle); - GTK.gtk_tree_view_set_cursor (parent.handle, path, 0, false); + if (parent != null && parent.getItemCount() > 0 && parent.getSelectionCount() == 0) { + parent.setSelection(parent.getItem(0)); parent.deselectAll(); } super.dispose(); diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Tree.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Tree.java index dd98ae5a7e..d258b32eab 100644 --- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Tree.java +++ b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Tree.java @@ -28,6 +28,7 @@ import org.eclipse.swt.SWT; import org.eclipse.swt.events.TreeListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeColumn; @@ -843,6 +844,74 @@ public void test_consistency_DragDetect () { } @Test +public void test_disposeItemNotTriggerSelection() { + Display display = shell.getDisplay(); + shell.setLayout(new FillLayout()); + Tree tree = new Tree (shell, SWT.BORDER); + for (int i=0; i<4; i++) { + TreeItem iItem = new TreeItem (tree, 0); + iItem.setText ("TreeItem (0) -" + i); + for (int j=0; j<4; j++) { + TreeItem jItem = new TreeItem (iItem, 0); + jItem.setText ("TreeItem (1) -" + j); + for (int k=0; k<4; k++) { + TreeItem kItem = new TreeItem (jItem, 0); + kItem.setText ("TreeItem (2) -" + k); + for (int l=0; l<4; l++) { + TreeItem lItem = new TreeItem(kItem, 0); + lItem.setText ("TreeItem (3) -" + l); + } + } + } + } + final boolean [] selectionCalled = { false }; + tree.addListener(SWT.Selection, event -> { + selectionCalled [0] = true; + }); + + final TreeItem firstNode = tree.getItem(0); + firstNode.setExpanded(true); + tree.setSelection(firstNode.getItem(3)); + + shell.setSize(200, 200); + shell.open(); + + display.timerExec(1000, () -> { + if (shell.isDisposed()) { + return; + } + + final TreeItem[] selection = tree.getSelection(); + if (selection.length != 1) { + return; + } + + final TreeItem item = selection[0]; + final TreeItem parentItem = item.getParentItem(); + if (parentItem == null) { + return; + } + + tree.deselectAll(); + item.dispose(); + + }); + + long end = System.currentTimeMillis() + 3000; + while (!shell.isDisposed() && System.currentTimeMillis() < end) { + if (!shell.getDisplay().readAndDispatch ()) { + try { + Thread.sleep(10); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + + assertFalse(selectionCalled[0]); +} + +@Test public void test_Virtual() { tree.dispose(); tree = new Tree(shell, SWT.VIRTUAL | SWT.BORDER); |
