Per condizionare la visibilità di una voce di menu possiamo estendere AbstractSourceProvider. Ecco come fare…

Innanzitutto dobbiamo creare una classe che estenda AbstractSourceProvider.
Compito di tale classe è quello di mantenere lo stato e di fornirne il valore alla platform.
Nel caso di esempio ci proponiamo di condizionare la visibilità di una voce di menu a seconda del tipo di utente.

package com.rcpvision;

import java.util.HashMap;
import java.util.Map;
import org.eclipse.ui.AbstractSourceProvider;
import org.eclipse.ui.ISources;

public class SessionSourceProvider extends AbstractSourceProvider {
	public final static String SESSION_USER_CAN_SEE_PREFS = "com.rcpvision.session.user-can-see-preferences";
	private final static String CAN_SEE = "canSee";
	private final static String CANNOT_SEE = "cannotSee";
	boolean canSee = true;

	@Override
	public String[] getProvidedSourceNames() {
		return new String[] { SESSION_USER_CAN_SEE_PREFS };
	}

	@Override
	public Map<String, String> getCurrentState() {
		Map<String, String> currentState = new HashMap<String, String>(1);
		String currentState1 = canSee ? CAN_SEE : CANNOT_SEE;
		currentState.put(SESSION_USER_CAN_SEE_PREFS, currentState1);
		return currentState;
	}

	@Override
	public void dispose() {
	}

	public void setUserCanSeePreferences(boolean canSee) {
		if (this.canSee == canSee)
			return; // no change
		this.canSee = canSee;
		String currentState = canSee ? CAN_SEE : CANNOT_SEE;
		fireSourceChanged(ISources.WORKBENCH, SESSION_USER_CAN_SEE_PREFS,
				currentState);
	}
}

Poi dobbiamo definire una opportuna Extension per tale classe in plugin.xml

	<extension point="org.eclipse.ui.services">
		<sourceProvider provider="com.rcpvision.SessionSourceProvider">
			<variable name="com.rcpvision.session.user-can-see-preferences" priorityLevel="workbench">
			</variable>
		</sourceProvider>
	</extension>

supponiamo di voler, a questo punto, condizionare la visibilità di una voce di menu a seconda dello stato rappresentato dalla variabile com.rcpvision.session.user-can-see-preferences, ecco come modificare plugin.xml

	<menu label="Show my view">
		<command commandId="org.eclipse.ui.views.showView" label="My View" style="push">
			<parameter name="org.eclipse.ui.views.showView.viewId" value="com.rcpvision.my.view">
			</parameter>
			<visibleWhen checkEnabled="false">
				<with variable="com.rcpvision.session.user-can-see-preferences">
					<equals value="canSee">
					</equals>
				</with>
			</visibleWhen>
		</command>
	</menu>

a questo punto non ci resta che invocare il metodo setter per modificare lo stato e quindi la visibilità della voce di menu

		IWorkbenchWindow window = PlatformUI.getWorkbench()
				.getActiveWorkbenchWindow();
		ISourceProviderService service = (ISourceProviderService) window
				.getService(ISourceProviderService.class);
		SessionSourceProvider sessionSourceProvider = (SessionSourceProvider) service
				.getSourceProvider(SessionSourceProvider.SESSION_USER_CAN_SEE_PREFS);
		sessionSourceProvider.setUserCanSeePreferences(true / false);

Una nota: evitate di usare “true” e “false” come valori delle costanti String in quanto verrebbero convertiti automaticamente in valori Boolean facendo fallire il test “equals”.

Riferimenti:

Eclipse Tips – Prakash G.R.: Commands Part 5: Authentication in RCP applications