package org.checkerframework.eclipse.ui; import java.util.HashMap; import java.util.Map; import org.checkerframework.eclipse.CheckerPlugin; import org.checkerframework.eclipse.actions.CheckerInfo; import org.checkerframework.eclipse.prefs.CheckerPreferences; import org.eclipse.core.commands.Command; import org.eclipse.core.commands.ParameterizedCommand; import org.eclipse.jface.action.ContributionItem; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.commands.ICommandService; import org.eclipse.ui.handlers.IHandlerService; public class CustomCheckersMenu extends ContributionItem { public CustomCheckersMenu() {} public CustomCheckersMenu(String id) { super(id); } @Override public boolean isDynamic() { return true; } @Override public void fill(Menu menu, int index) { String customClasses = CheckerPlugin.getDefault() .getPreferenceStore() .getString(CheckerPreferences.PREF_CHECKER_CUSTOM_CLASSES); // Here you could get selection and decide what to do // You can also simply return if you do not want to show a menu // create the menu item MenuItem menuItem = new MenuItem(menu, SWT.CASCADE, index); menuItem.setText("Run Custom Checker"); // Menu menu = new Menu(menu, SWT.) /*menuItem.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { // what to do when menu is subsequently selected. System.err.println("Dynamic menu selected"); } });*/ if (customClasses == null || customClasses.equals("")) { menuItem.setEnabled(false); } else { Menu checkersMenu = new Menu(menuItem); final String[] customCheckers = customClasses.split(","); for (int i = 0; i < customCheckers.length; i++) { // final String text = customCheckers[i]; final CheckerInfo checkerInfo = CheckerInfo.fromClassPath(customCheckers[i], null); MenuItem runCustomChecker = new MenuItem(checkersMenu, SWT.CHECK, i); runCustomChecker.setText(checkerInfo.getLabel()); runCustomChecker.addSelectionListener( new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { final IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench() .getService(IHandlerService.class); try { ICommandService service = (ICommandService) PlatformUI.getWorkbench() .getService(ICommandService.class); Command command = service.getCommand("checkers.eclipse.singlecustom"); final Map<String, Object> params = new HashMap<String, Object>(); params.put( "checker-framework-eclipse-plugin.checker", checkerInfo.getClassPath()); final ParameterizedCommand pCmd = ParameterizedCommand.generateCommand(command, params); handlerService.executeCommand(pCmd, null); // handlerService.executeCommand("checkers.eclipse.runnullness", new Event() ); } catch (Exception e1) { throw new RuntimeException(e1); } // what to do when menu is subsequently selected. System.err.println("Dynamic menu selected"); } }); } menuItem.setMenu(checkersMenu); } } }