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
> Just one note: be careful to avoid using “true” and “false” as String constants as they would be converted automatically into Booleans thus leading to wrong “equals” test results
This is really helpful. Thanks a lot! I lost a lot of time to investigate that problem.