diff --git a/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/dialogs/FilteredItemsSelectionDialog.java b/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/dialogs/FilteredItemsSelectionDialog.java index 5da18768f29..3c271eb86d8 100644 --- a/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/dialogs/FilteredItemsSelectionDialog.java +++ b/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/dialogs/FilteredItemsSelectionDialog.java @@ -879,12 +879,24 @@ public void refresh() { lastRefreshSelection = prepareInitialSelection(lastRefreshSelection); } // preserve previous selection - if (refreshWithLastSelection && lastRefreshSelection != null && lastRefreshSelection.size() > 0) { - tableViewer.setSelection(new StructuredSelection(lastRefreshSelection)); + // Apply selection asynchronously to ensure table refresh has completed + // This fixes race condition where setSelection() is called before + // tableViewer.refresh() has fully updated the table items + final List selectionToApply = lastRefreshSelection; + if (refreshWithLastSelection && selectionToApply != null && selectionToApply.size() > 0) { + tableViewer.getTable().getDisplay().asyncExec(() -> { + if (!tableViewer.getTable().isDisposed()) { + tableViewer.setSelection(new StructuredSelection(selectionToApply)); + } + }); } else { refreshWithLastSelection = true; - tableViewer.getTable().setSelection(0); - tableViewer.getTable().notifyListeners(SWT.Selection, new Event()); + tableViewer.getTable().getDisplay().asyncExec(() -> { + if (!tableViewer.getTable().isDisposed()) { + tableViewer.getTable().setSelection(0); + tableViewer.getTable().notifyListeners(SWT.Selection, new Event()); + } + }); } } else { tableViewer.setSelection(StructuredSelection.EMPTY); diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/ResourceInitialSelectionTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/ResourceInitialSelectionTest.java index 62b6416e60f..d52c83b3f4a 100644 --- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/ResourceInitialSelectionTest.java +++ b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/ResourceInitialSelectionTest.java @@ -471,9 +471,8 @@ private void waitForDialogRefresh() { }); // Then wait additional time for selection to be applied - // The selection is set asynchronously after table population completes - // Previous fix used only 3 × 50ms = 150ms which was insufficient on slow systems - // Increased to handle slower machines while minimizing delay on fast ones + // FilteredItemsSelectionDialog.refresh() now uses Display.asyncExec() to apply + // selection after table refresh completes, so we need to process those async events for (int i = 0; i < 5; i++) { processUIEvents(); try {