Skip to content

Fix toolbar items enabled state not updating automatically (#3953)#4073

Open
EdrilanBerisha wants to merge 1 commit into
eclipse-platform:masterfrom
EdrilanBerisha:master
Open

Fix toolbar items enabled state not updating automatically (#3953)#4073
EdrilanBerisha wants to merge 1 commit into
eclipse-platform:masterfrom
EdrilanBerisha:master

Conversation

@EdrilanBerisha

@EdrilanBerisha EdrilanBerisha commented Jun 9, 2026

Copy link
Copy Markdown

this PR fixes: #3953

when an AbstractSourceProvider fires fireSourceChanged(), the EvaluationService contextUpdater listener was updating the legacy expression context variable but never sending REQUEST_ENABLEMENT_UPDATE_TOPIC on the event broker.

as a result, ToolBarManagerRenderer (which listens for that topic) was never notified, so toolbar items relying on custom source providers with enabledWhen expressions stayed frozen until a focus change accidentally triggered an update

fix: send REQUEST_ENABLEMENT_UPDATE_TOPIC after each source change originating from a registered ISourceProvider (both single-variable and multi-variable variants). This makes the toolbar enablement update automatic and consistent with requestEvaluation() and the RAT updater, which already send this event.

added two regression tests to EvaluationServiceTest:

  • testSourceProviderFiresEnablementUpdateEvent: verifies that a single-variable fireSourceChanged() sends REQUEST_ENABLEMENT_UPDATE_TOPIC
  • testSourceProviderMultiVarFiresEnablementUpdateEvent: verifies the same for the multi-variable (Map) form of the source change

@eclipse-eca-validation

Copy link
Copy Markdown

Hi @EdrilanBerisha — thank you for your contribution!

The Eclipse Contributor Agreement (ECA) check has failed for this pull request due to one of the following reasons:

  • Committing user must have an Eclipse Account
  • Author must have an Eclipse Account

To resolve this, please:

  1. Sign in or create an Eclipse Foundation account: https://accounts.eclipse.org/user/eca
  2. Ensure your GitHub username is linked to your Eclipse account
  3. Complete and submit the ECA form

Once done, push a new commit (or rebase) to re-trigger the ECA validation.

If you believe you've already completed these steps, please double-check your account settings or report an issue to Eclipse Foundation Helpdesk.

Thanks again for your contribution!

@merks

merks commented Jun 30, 2026

Copy link
Copy Markdown
Contributor

This needs to be a single commit rebased on master. Please force push a rebased commit.

@EdrilanBerisha

Copy link
Copy Markdown
Author

This needs to be a single commit rebased on master. Please force push a rebased commit.

done

@github-actions

github-actions Bot commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Test Results

   855 files  ±0     855 suites  ±0   55m 39s ⏱️ - 10m 9s
 8 121 tests +2   7 878 ✅ +2  243 💤 ±0  0 ❌ ±0 
20 265 runs  +6  19 611 ✅ +6  654 💤 ±0  0 ❌ ±0 

Results for commit 3eec91b. ± Comparison against base commit c3e5d57.

♻️ This comment has been updated with latest results.

@EdrilanBerisha
EdrilanBerisha force-pushed the master branch 2 times, most recently from 828253d to 1b9ea1d Compare July 17, 2026 11:43
…latform#3953)

When an AbstractSourceProvider fires fireSourceChanged(), the EvaluationService
contextUpdater listener was updating the legacy expression context variable but
never sending REQUEST_ENABLEMENT_UPDATE_TOPIC on the event broker.

As a result, ToolBarManagerRenderer (which listens for that topic) was never
notified, so toolbar items relying on custom source providers with enabledWhen
expressions stayed frozen until a focus change accidentally triggered an update.

Fix: send REQUEST_ENABLEMENT_UPDATE_TOPIC after each source change originating
from a registered ISourceProvider (both single-variable and multi-variable
variants). This makes the toolbar enablement update automatic and consistent
with requestEvaluation() and the RAT updater, which already send this event.

Tests: added two regression tests to EvaluationServiceTest:
- testSourceProviderFiresEnablementUpdateEvent: verifies that a single-variable
  fireSourceChanged() sends REQUEST_ENABLEMENT_UPDATE_TOPIC
- testSourceProviderMultiVarFiresEnablementUpdateEvent: verifies the same for
  the multi-variable (Map) form of the source change

Fixes: eclipse-platform#3953

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 addresses #3953 by ensuring that enablement updates for toolbar contribution items are triggered automatically when an AbstractSourceProvider reports source changes, aligning fireSourceChanged() behavior with existing requestEvaluation() and RAT-driven enablement refresh behavior.

Changes:

  • Send UIEvents.REQUEST_ENABLEMENT_UPDATE_TOPIC on the event broker after single-variable and multi-variable ISourceProviderListener#sourceChanged(...) updates in EvaluationService.
  • Add regression tests intended to verify that source-provider-driven changes trigger REQUEST_ENABLEMENT_UPDATE_TOPIC.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.

File Description
bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/services/EvaluationService.java Emits REQUEST_ENABLEMENT_UPDATE_TOPIC after ISourceProvider source changes to force toolbar/contribution enablement refresh.
tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/services/EvaluationServiceTest.java Adds regression tests for event-broker enablement update notifications on source changes.

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

Comment on lines +770 to +792
IWorkbenchWindow window = openTestWindow();
ISourceProviderService sps = window.getService(ISourceProviderService.class);
ActiveUserSourceProvider userProvider = (ActiveUserSourceProvider) sps.getSourceProvider("username");
assertNotNull(userProvider);

IEventBroker eventBroker = window.getWorkbench().getService(IEventBroker.class);
assertNotNull(eventBroker);

final int[] enablementUpdateCount = { 0 };
org.osgi.service.event.EventHandler eventHandler = event -> enablementUpdateCount[0]++;
eventBroker.subscribe(UIEvents.REQUEST_ENABLEMENT_UPDATE_TOPIC, eventHandler);

try {
int countBefore = enablementUpdateCount[0];

// Simulate the multi-variable form by firing a Map-based source change.
// ActiveUserSourceProvider.setUsername fires the single-variable form, so
// we set both at once by constructing the map directly and calling setUsername
// twice to exercise the path (the test helper exposes only String-based form;
// we verify the path via two rapid single-var calls here).
userProvider.setUsername("Alice");
userProvider.setUsername("guest");
processEvents();
@iloveeclipse

Copy link
Copy Markdown
Member

Both added tests pass without the corresponding change in EvaluationService. Please double check & please if you update PR, rebase first on master.

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.

Toolbar items enabled state doesn't change automatically

4 participants