From 9b18216eb0c8cebae40cadc3e68a63ec93c62a68 Mon Sep 17 00:00:00 2001 From: Denys Almazov Date: Wed, 22 Apr 2026 17:58:24 +0300 Subject: [PATCH 1/2] feat: use Job and virtual threads for refresh --- .../manager/pages/ESPIDFMainTablePage.java | 95 +++++++++++-------- 1 file changed, 58 insertions(+), 37 deletions(-) diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/manager/pages/ESPIDFMainTablePage.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/manager/pages/ESPIDFMainTablePage.java index c049944c7..e7271c0d2 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/manager/pages/ESPIDFMainTablePage.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/manager/pages/ESPIDFMainTablePage.java @@ -6,7 +6,12 @@ import java.util.List; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executors; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.Job; import org.eclipse.core.runtime.preferences.IEclipsePreferences; import org.eclipse.core.runtime.preferences.InstanceScope; import org.eclipse.jface.layout.TableColumnLayout; @@ -81,8 +86,6 @@ private record IdfRow(IdfInstalled original, boolean isActive, String version, S private EimJson eimJson; private final EimIdfConfiguratinParser configParser; - private final ToolInitializer toolInitializer; - private final IDFConsole idfConsole = new IDFConsole(); private IdfInstalled currentInstallingNode = null; @@ -90,7 +93,7 @@ public ESPIDFMainTablePage(EimJson eimJson) { this.eimJson = eimJson; this.configParser = new EimIdfConfiguratinParser(); - this.toolInitializer = new ToolInitializer(InstanceScope.INSTANCE.getNode(UIPlugin.PLUGIN_ID)); + new ToolInitializer(InstanceScope.INSTANCE.getNode(UIPlugin.PLUGIN_ID)); } public Composite createPage(Composite parent) @@ -423,44 +426,62 @@ public void refreshEditorUI() if (container == null || container.isDisposed()) return; - CompletableFuture.supplyAsync(() -> { - try + Job refreshJob = new Job("Refreshing ESP-IDF Environments") + { + @Override + protected IStatus run(IProgressMonitor monitor) { - var newJson = configParser.getEimJson(true); - if (newJson != null && newJson.getIdfInstalled() != null) + monitor.beginTask("Scanning configurations...", IProgressMonitor.UNKNOWN); + + try { - var gitPath = newJson.getGitPath(); - return newJson.getIdfInstalled().stream() - .map(idf -> new IdfRow(idf, ToolsUtility.isIdfInstalledActive(idf), - ToolsUtility.getIdfVersion(idf, gitPath), idf.getName(), idf.getPath())) - .toList(); + var newJson = configParser.getEimJson(true); + List rows = List.of(); + + if (newJson != null && newJson.getIdfInstalled() != null) + { + var gitPath = newJson.getGitPath(); + + monitor.subTask("Detecting ESP-IDF versions..."); + + try (var executor = Executors.newVirtualThreadPerTaskExecutor()) + { + var futures = newJson.getIdfInstalled().stream().map(idf -> CompletableFuture.supplyAsync( + () -> new IdfRow(idf, ToolsUtility.isIdfInstalledActive(idf), + ToolsUtility.getIdfVersion(idf, gitPath), idf.getName(), idf.getPath()), + executor)).toList(); + + rows = futures.stream().map(CompletableFuture::join).toList(); + } + } + + final List finalRows = rows; + + Display.getDefault().asyncExec(() -> { + if (container.isDisposed()) + return; + + var currentSelection = tableViewer.getSelection(); + currentInstallingNode = null; + + tableViewer.setInput(finalRows); + tableViewer.setSelection(currentSelection); + updateButtonState(); + }); + + return Status.OK_STATUS; + } + catch (Exception e) + { + Logger.log(e); + return new Status(IStatus.ERROR, UIPlugin.PLUGIN_ID, "Failed to refresh ESP-IDF environments", e); + } finally + { + monitor.done(); } - return List.of(); - } - catch (Exception e) - { - throw new RuntimeException(e); - } - }).thenAcceptAsync(rows -> { - if (container.isDisposed()) - return; - var currentSelection = tableViewer.getSelection(); - this.currentInstallingNode = null; - try - { - this.eimJson = configParser.getEimJson(false); - } - catch (Exception e) - { - Logger.log(e.toString()); } - tableViewer.setInput(rows); - tableViewer.setSelection(currentSelection); - updateButtonState(); - }, Display.getDefault()::asyncExec).exceptionally(ex -> { - Logger.log(ex.getCause() != null ? ex.getCause().toString() : ex.toString()); - return null; - }); + }; + refreshJob.schedule(); } public void setupInitialEspIdf() From c974b7509e4a340c774bf72d524e5baf510086bf Mon Sep 17 00:00:00 2001 From: Denys Almazov Date: Mon, 27 Apr 2026 16:52:48 +0300 Subject: [PATCH 2/2] feat: internalizing strings in the ESPIDFMainTablePage --- .../src/com/espressif/idf/ui/tools/Messages.java | 8 ++++++++ .../idf/ui/tools/manager/pages/ESPIDFMainTablePage.java | 8 ++++---- .../src/com/espressif/idf/ui/tools/messages.properties | 4 ++++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/Messages.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/Messages.java index d296e2264..0bfda42de 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/Messages.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/Messages.java @@ -38,14 +38,22 @@ public class Messages extends NLS public static String ESPIDFMainTablePage_ActiveLbl; + public static String ESPIDFMainTablePage_DetectingEspIdfSubTaskName; + public static String ESPIDFMainTablePage_EIMButtonTooltip; + public static String ESPIDFMainTablePage_FailderRefreshMsg; + public static String ESPIDFMainTablePage_MainContentGroupLbl; public static String ESPIDFMainTablePage_RefreshEnvBtnName; public static String ESPIDFMainTablePage_RefreshEnvBtnTooltip; + public static String ESPIDFMainTablePage_RefreshingIdfJobName; + + public static String ESPIDFMainTablePage_ScanningProcessTaskName; + public static String ESPIDFMainTablePage_SettingUpLbl; public static String ESPIDFMainTablePage_StatusColumnName; diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/manager/pages/ESPIDFMainTablePage.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/manager/pages/ESPIDFMainTablePage.java index e7271c0d2..8ff1eb9b5 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/manager/pages/ESPIDFMainTablePage.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/manager/pages/ESPIDFMainTablePage.java @@ -426,12 +426,12 @@ public void refreshEditorUI() if (container == null || container.isDisposed()) return; - Job refreshJob = new Job("Refreshing ESP-IDF Environments") + Job refreshJob = new Job(Messages.ESPIDFMainTablePage_RefreshingIdfJobName) { @Override protected IStatus run(IProgressMonitor monitor) { - monitor.beginTask("Scanning configurations...", IProgressMonitor.UNKNOWN); + monitor.beginTask(Messages.ESPIDFMainTablePage_ScanningProcessTaskName, IProgressMonitor.UNKNOWN); try { @@ -442,7 +442,7 @@ protected IStatus run(IProgressMonitor monitor) { var gitPath = newJson.getGitPath(); - monitor.subTask("Detecting ESP-IDF versions..."); + monitor.subTask(Messages.ESPIDFMainTablePage_DetectingEspIdfSubTaskName); try (var executor = Executors.newVirtualThreadPerTaskExecutor()) { @@ -474,7 +474,7 @@ protected IStatus run(IProgressMonitor monitor) catch (Exception e) { Logger.log(e); - return new Status(IStatus.ERROR, UIPlugin.PLUGIN_ID, "Failed to refresh ESP-IDF environments", e); + return new Status(IStatus.ERROR, UIPlugin.PLUGIN_ID, Messages.ESPIDFMainTablePage_FailderRefreshMsg, e); } finally { monitor.done(); diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/messages.properties b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/messages.properties index f2034913a..eb13827c0 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/messages.properties +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/messages.properties @@ -14,10 +14,14 @@ EimJsonStateChangedMsgDetail=It looks like the ESP-IDF installation was modified ESPIDFMainTablePage_ActiveBtnName=Activate Selected ESPIDFMainTablePage_ActiveBtnTooltip=Set this version as the active ESP-IDF ESPIDFMainTablePage_ActiveLbl=\u2713 Active +ESPIDFMainTablePage_DetectingEspIdfSubTaskName=Detecting ESP-IDF versions... ESPIDFMainTablePage_EIMButtonTooltip=Open the ESP-IDF Installation Manager (EIM) to install, update, or remove ESP-IDF versions. +ESPIDFMainTablePage_FailderRefreshMsg=Failed to refresh ESP-IDF environments ESPIDFMainTablePage_MainContentGroupLbl=Installed IDF Versions ESPIDFMainTablePage_RefreshEnvBtnName=Refresh Environment ESPIDFMainTablePage_RefreshEnvBtnTooltip=Refresh toolchains, Python virtual environment, and IDE settings for the CURRENTLY ACTIVE version +ESPIDFMainTablePage_RefreshingIdfJobName=Refreshing ESP-IDF Environments +ESPIDFMainTablePage_ScanningProcessTaskName=Scanning configurations... ESPIDFMainTablePage_SettingUpLbl=Setting up... ESPIDFMainTablePage_StatusColumnName=Status ESPIDFMainTablePage_VersionDetectionFailedMsg=Detection Failed