Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXi Yan2019-03-12 15:12:37 +0000
committerXi Yan2019-03-12 17:19:56 +0000
commit5a77dd402a843c024214579c91628da0a2671744 (patch)
tree3b9cd59c713e42d87a8a72299ce5e2d0ce0c05b1
parent7a256e2e3c59e029a07d7c5319f7d366b59e1c3c (diff)
downloadeclipse.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
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TableItem.java6
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TreeItem.java6
-rw-r--r--tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Tree.java69
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);

Back to the top