Skip to content

Add workspace import support to Eclipse launcher window#3995

Open
deepika-u wants to merge 3 commits into
eclipse-platform:masterfrom
deepika-u:import_wksp_list_4_5_2026
Open

Add workspace import support to Eclipse launcher window#3995
deepika-u wants to merge 3 commits into
eclipse-platform:masterfrom
deepika-u:import_wksp_list_4_5_2026

Conversation

@deepika-u

Copy link
Copy Markdown
Contributor

This PR introduces workspace capability in the Choose Workspace dialog.

Users can now import recent workspaces from a previous Eclipse installation directly from the launcher UI.

Features added:

  • Detect recent workspaces from previous Eclipse installations
  • Import selected workspaces into the launcher
  • Prevent duplicate workspace entries
  • Filter and search desired workspaces
  • Select/Deselect all on visible workspaces
  • Handle empty, invalid, and already-imported workspaces
  • Dynamically refresh the Recent Workspaces section after updates via browse button

Additional improvements:

  • Simplified and cleaned up workspace refresh logic
  • Improved UI consistency after workspace removal/import
  • Added validation for invalid or non-existing workspace paths

This change enhances workspace migration usability and improves the overall launcher experience for users moving between Eclipse installations.

Before this pr :
image

After this pr :

  1. When fresh eclipse is installed, the twistee against "Recent Workspaces" will remain closed though empty, when one opens it, it would be like below. Import... is the newly added button ->
image
  1. On clicking Import..., you can browse previous eclipse installation path and browse recently used workspaces in it and import them like this - the desired ones ->
image
  1. When i have already imported some workspaces successfully, i get ->
image
  1. I can still add new workspaces to existing list of "Recent Workspaces" from another installation by clicking Import... again like this ->
image
  1. On saying OK on this window, it returns and merges to the previous list of workspaces already imported ->
image
  1. Select one of the imported workspaces and proceed.

How to test this pr :
step 1 - pick this jar ->
org.eclipse.ui.ide_3.23.100.v20260511-1219.zip
extract this zip file to get a jar, place this jar in the fresh eclipse installation at ..\eclipse\plugins folder.
step 2 - Open this file "..\eclipse\configuration\org.eclipse.equinox.simpleconfigurator\bundles.info", search for "org.eclipse.ui.ide," line and replace the whole line with org.eclipse.ui.ide,3.23.100.v20260511-1219,plugins/org.eclipse.ui.ide_3.23.100.v20260511-1219.jar,4,false

Note : Once done with testing, please revert back to get the original eclipse installation state before you proceed.

I am not sure if this can be tested in a different way easily, but i have tested this way on windows platform.

@deepika-u deepika-u force-pushed the import_wksp_list_4_5_2026 branch 2 times, most recently from 5d4e732 to 56de0b8 Compare May 11, 2026 14:31
@vogella

vogella commented May 11, 2026

Copy link
Copy Markdown
Contributor

What about storing the workspaces in user scope scoped by product / application instead of storing them in configuration scope. This way the workspaces for a product would always be the same which I think is the most common use case.

@github-actions

github-actions Bot commented May 11, 2026

Copy link
Copy Markdown
Contributor

Test Results

   861 files  ±0     861 suites  ±0   53m 44s ⏱️ - 7m 2s
 8 034 tests ±0   7 791 ✅ +1  243 💤 ±0  0 ❌ ±0 
20 541 runs  ±0  19 886 ✅ +1  655 💤 ±0  0 ❌ ±0 

Results for commit 4ece49d. ± Comparison against base commit 56d707c.

♻️ This comment has been updated with latest results.

@iloveeclipse

Copy link
Copy Markdown
Member

Interesting idea, but can we please made this feature optional, so the "Import..." is not shown at all (we extend IDEApplication and ChooseWorkspaceDialog) to share as much code as possible with original code and default workspace selection dialog)?

We have Eclipse based application deployed with rpm, so by default installation is read only and all settings are stored on (typically mounted) user home and for a specific application version the path would be something like /home/user/.eclipse/com.verigy.itee.ui.ewcProduct_8_8_2_0__user-bf_20260504_0604_048042b160e2_C_BETA__R__64_user_RHEL9_socbn410__1/

Not only that this path is by default hidden, it is also application version specific, different application versions are installed in parallel and should not share the workspaces used.

"Import..." would casue more troubles in this scenario, so we would want to disable this completely to avoid user errors.

What about storing the workspaces in user scope scoped by product / application instead of storing them in configuration scope.

In our case it would be important to have that "per product / per version" or give a chance to see that the workspace is for a different product version.

Ideally Eclise could automatically detect Eclipse workspaces from "compatible" workspaces. "Compatible" is the key, and it should be possible, similar to org.eclipse.ui.internal.ide.application.IDEApplication.checkValidWorkspace(Shell, URL) to override the "default" strategy.

@deepika-u deepika-u force-pushed the import_wksp_list_4_5_2026 branch from 56de0b8 to 979ee98 Compare May 13, 2026 14:07
@deepika-u

Copy link
Copy Markdown
Contributor Author

What about storing the workspaces in user scope scoped by product / application instead of storing them in configuration scope. This way the workspaces for a product would always be the same which I think is the most common use case.

Thanks for the feedback, i am exploring this path. If it can be done in user mode, made it optional.
Does anyone has any other inputs or suggestions further? on this thought - please welcome!

@deepika-u deepika-u force-pushed the import_wksp_list_4_5_2026 branch from 979ee98 to cbeb03c Compare May 19, 2026 17:17
@deepika-u deepika-u force-pushed the import_wksp_list_4_5_2026 branch from cbeb03c to 29c6d94 Compare June 3, 2026 09:44
@vogella

vogella commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

See https://github.com/eclipse-platform/eclipse.platform.ui/pull/3875/changes how to use user scope to save the recent workspaces together with a product / application prefix.

The example is used for the theme but it should be easy to apply the same approach to the workspaces.

@deepika-u

Copy link
Copy Markdown
Contributor Author

See https://github.com/eclipse-platform/eclipse.platform.ui/pull/3875/changes how to use user scope to save the recent workspaces together with a product / application prefix.

The example is used for the theme but it should be easy to apply the same approach to the workspaces.

Thanks aton, i was about to ask for some help in this context. Let me check on that.

@merks

merks commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

Why are there 3 commits?

@deepika-u

deepika-u commented Jun 3, 2026

Copy link
Copy Markdown
Contributor Author

Why are there 3 commits?

@merks : Thanks for your interest.
Stages wise i have implemented this feature, so at logical points i had made the commits for my reference. For the pr to be reviewed - only the latest would do(rest can be ignored, sorry if it had caused any confusion). Once all the comments are fixed, i would squash all the commits to 1 i thought so just retained for now. Thanks for your question. Any other inputs on this idea please?

@merks merks left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's a lot of code...

if (Platform.getInstanceLocation().isSet()) {
store.setValue(RECENT_WORKSPACES, sb.toString());
}
// else {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess you will clean this up.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will need to investigate on this if configuration scope needs any check here or else can be removed.

protected Control createDialogArea(Composite parent) {
Composite container = (Composite) super.createDialogArea(parent);
container.setLayout(new GridLayout(1, false));
// FIX ORDER

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What does this tell me?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry that was a debug message while coding, removed now.

@deepika-u deepika-u force-pushed the import_wksp_list_4_5_2026 branch from 29c6d94 to a0e1cf5 Compare June 3, 2026 11:43
@vogella

vogella commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

I assume if you switch to save and load the recent workspaces from User Scope no import is needed.

@deepika-u

Copy link
Copy Markdown
Contributor Author

I assume if you switch to save and load the recent workspaces from User Scope no import is needed.

May be, let me check. Still trying to figure out.

@merks

merks commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

It's quite a bit of extra logic for what to me seems a narrow use case. I think Lar's question kind of hints at the fact that one might share them across all products of the same type. That being said, given I have 50 installations and I never want to share workspaces across them, so I don't actually like that so much. But maybe I'm special. Then again, one can always find workspace without an import dialog too, so I'm a bit ambivalent over all...

@deepika-u

deepika-u commented Jun 3, 2026

Copy link
Copy Markdown
Contributor Author

I feel UserScope + Product ID is best generic solution like updated in #3878.

Please let me know if we can go with this.

@vogella

vogella commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

I feel UserScope + Product ID is best generic solution like updated in #3878.

Please let me know if we can go with this.

Sounds good to me.

@merks

merks commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

How is RECENT_WORKSPACES value maintained with multiple products are using this? Is there some kind of locking to prevent overwriting the values stored from other instances. Is this value ordered and how do multiple instance working with a single such list impact the order across the instances?

@deepika-u deepika-u force-pushed the import_wksp_list_4_5_2026 branch from a0e1cf5 to 5ce4b33 Compare June 4, 2026 07:11
any workspaces or has already imported workspaces, add javadoc, update
removeWorkspaceFromLauncher().
@deepika-u deepika-u force-pushed the import_wksp_list_4_5_2026 branch from 5ce4b33 to 4ece49d Compare June 10, 2026 09:43
@deepika-u

Copy link
Copy Markdown
Contributor Author

How is RECENT_WORKSPACES value maintained with multiple products are using this? Is there some kind of locking to prevent overwriting the values stored from other instances. Is this value ordered and how do multiple instance working with a single such list impact the order across the instances?

Good question.

The proposal is to store RECENT_WORKSPACES in UserScope scoped by product/application ID, so each product maintains its own ordered MRU list.

I am not currently proposing any additional locking. This would follow the same Eclipse preferences infrastructure already used by other UserScope preferences (e.g., the recently added themeid preference), which also relies on the standard preference APIs without custom synchronization.

Since RECENT_WORKSPACES is a UI-driven convenience feature that is updated infrequently, any concurrent updates would only affect the recent-workspace history itself and not workspace data.

@merks

merks commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

The theme is changed infrequently and the product-scoped theme is intended to make that even more infrequent.

But the workspace location preference is used by every IDE when it starts. I literally have dozens of installations of the Eclipse IDE for Committers and often have 10 or more different installations of that product open at once. I really don't need and would not like them all to share one unified list because each is augmented with additional tools and are intended to work on specific git repositories. But assuming I'm "special" and that others would want this (and I won't question why), I would still like a clear understanding of how this actually works. Each IDE when it starts moves its workspace to the front? When is that preference saved? When is it loaded and reloaded? When I switch workspaces in an IDE, do I see workspaces from other installations?

I really do wonder what problem we are solving and I'm particularly concerned whether in doing so we create a new and different problem that we didn't have before. Sorry for being a little negative on the topic...

@iloveeclipse

Copy link
Copy Markdown
Member

Yes, it would be great to outline the solution, Ed's questions are all valid.

@iloveeclipse iloveeclipse requested a review from Copilot June 11, 2026 13:07

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds “workspace import” capabilities to the Eclipse launcher’s Choose Workspace flow, enabling users to discover and import recent workspaces from a previous Eclipse/application installation via a new import UI.

Changes:

  • Adds a new WorkspaceImportDialog for browsing an installation path, filtering, and selecting workspaces to import.
  • Extends ChooseWorkspaceDialog to always show the “Recent Workspaces” section and to launch the import flow (including deduplication/merge behavior).
  • Introduces new NLS keys for the import UI and related messages.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 6 comments.

File Description
bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/WorkspaceImportDialog.java New dialog to browse a previous installation, filter, select all/none, and import detected workspaces.
bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/ChooseWorkspaceDialog.java Adds Import button and import/merge logic; refreshes Recent Workspaces UI after changes.
bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/messages.properties Adds user-facing strings for the import button and the new import dialog.
bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IDEWorkbenchMessages.java Declares new NLS fields corresponding to the added message keys.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +513 to +521
// Final list
List<String> result = new ArrayList<>(merged);
// Persist
launchData.setRecentWorkspaces(result.toArray(new String[0]));
saveRecentWorkspacesToPreferences(result);
refreshRecentWorkspacesComposite();

MessageDialog.openInformation(getShell(), "Workspaces Updated", //$NON-NLS-1$
"Imported " + selected.size() + " workspace(s)."); //$NON-NLS-1$ //$NON-NLS-2$
Comment on lines +599 to +606
String recentWorkspacesValue = props.getProperty("RECENT_WORKSPACES"); //$NON-NLS-1$
if (recentWorkspacesValue == null || recentWorkspacesValue.isEmpty()) {
return workspaces;
}

for (String path : recentWorkspacesValue.split("\\n")) { //$NON-NLS-1$
String trimmedPath = path.trim();
if (!trimmedPath.isEmpty() && new File(trimmedPath).exists()) {
Comment on lines +566 to +568
} catch (Exception e) {
e.printStackTrace();
}

@iloveeclipse iloveeclipse Jun 11, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry, missed the point: we should not use workbench which might not be running yet, but static IDEWorkbenchPlugin should be OK.

Comment on lines +172 to +175
// Handle clear button click
filter.addListener(SWT.DefaultSelection, e -> {
filter.setText(EMPTY);
});
Comment on lines +610 to +612
} catch (IOException e) {
e.printStackTrace();
}
Comment on lines +562 to +565
// else {
// MessageDialog.openInformation(getShell(), "saveRecentWorkspacesToPreferences", //$NON-NLS-1$
// "Instance location not set yet. Skipping preference save."); //$NON-NLS-1$
// }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants