package eu.jucy.gui.itemhandler; import helpers.GH; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import logger.LoggerFactory; import org.apache.log4j.Logger; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.jface.action.IContributionItem; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IPartService; import org.eclipse.ui.ISelectionService; import org.eclipse.ui.actions.CompoundContributionItem; import org.eclipse.ui.handlers.HandlerUtil; import org.eclipse.ui.menus.CommandContributionItem; import org.eclipse.ui.menus.CommandContributionItemParameter; import org.eclipse.ui.menus.IWorkbenchContribution; import org.eclipse.ui.services.IServiceLocator; import eu.jucy.gui.ReplaceLine; import eu.jucy.gui.settings.UserCommands; import eu.jucy.gui.texteditor.UCTextEditor; import uc.Command; import uc.IHub; import uc.IUser; import uc.protocols.SendContext; public abstract class UCContributionItem extends CompoundContributionItem implements IWorkbenchContribution { private static final Logger logger = LoggerFactory.make(); private static final String SelfDefinedCommandID = "eu.jucy.gui.selfdefinedcommand"; public static final String SD_USER = SelfDefinedCommandID+".user" ; public static final String SD_DOWNLOADABLE =SelfDefinedCommandID +".downloadable"; public static final String SD_HUB = SelfDefinedCommandID + ".hub"; // public static final String SEND = "SEND"; public static final String COMMAND = "COMMAND"; protected final int where; protected final String commandID; private final Object allwaysSelected; protected UCContributionItem(int where,String commandid) { this(where,commandid,null); } protected UCContributionItem(int where,String commandid,Object allwaysSelected) { this.where = where; this.commandID = commandid; this.allwaysSelected = allwaysSelected; } protected ISelectionService ss; protected IServiceLocator serviceLocator; public void initialize(IServiceLocator serviceLocator) { this.serviceLocator = serviceLocator; ss = (ISelectionService)serviceLocator.getService(ISelectionService.class); } @Override protected IContributionItem[] getContributionItems() { logger.debug("getContributionItems() called "+where); ISelection sel; if (allwaysSelected == null) { sel = ss.getSelection(); } else { sel = new StructuredSelection(allwaysSelected); } Set<IHub> hubsExist = new HashSet<IHub>(); Set<IHub> hubsAllAreIn = new HashSet<IHub>(); UserHandlers.filterHubs(sel,hubsExist,hubsAllAreIn); if (!hubsExist.isEmpty()) { boolean multiusers = UserHandlers.filter(sel).size() > 1; List<Command> userCommands = UserCommands.loadCommandAndAddHubCommnds( hubsExist,hubsAllAreIn,multiusers, where); return addCommands(userCommands); } return new IContributionItem[]{}; } public IContributionItem[] addCommands(List<Command> coms) { Map<List<String>,IMenuManager> alreadyCreated = new HashMap<List<String>,IMenuManager>(); List<IContributionItem> itemsAdded = new ArrayList<IContributionItem>(); for (Command com:coms) { IMenuManager target = null; //first make sure parent menumanagers exist String[] paths = com.getPaths(); for (int i = 0;i < paths.length-1; i++) { String[] sub = subarray(paths,i+1); target = alreadyCreated.get(Arrays.asList(sub)); if (target == null) { target = new MenuManager(sub[sub.length-1]); alreadyCreated.put(Arrays.asList(sub), target); IMenuManager parent = alreadyCreated.get(Arrays.asList(subarray(sub,sub.length-1))); if (parent == null) { //then we have a toplevel menu logger.debug("adding Menu to Toplevel: "+sub[sub.length-1]); itemsAdded.add(target); } else { logger.debug("addind Menu to parent: "+sub[sub.length-1]); parent.add(target); } } else { // logger.debug("Menu already created."); } } IContributionItem con = createFromCommand(com); if (target == null) { logger.debug("addind contrib to Toplevel: "+com.getName()+" "+con); itemsAdded.add(con); } else { logger.debug("addind contrib to parent: "+com.getName()+ " "+con); target.add(con); } } return itemsAdded.toArray(new IContributionItem[]{}); } private IContributionItem createFromCommand(Command com) { if (com.isSeparator()) { return new Separator(); } else { CommandContributionItemParameter ccip = new CommandContributionItemParameter(serviceLocator,null,commandID, SWT.PUSH); ccip.label = com.getName(); ccip.parameters = Collections.singletonMap(COMMAND, com.toStoreString()); //TODO user by ID parameter needed here.. CommandContributionItem cci = new CommandContributionItem(ccip); return cci; } } private static String[] subarray(String[] arr,int length) { String[] s = new String[length]; System.arraycopy(arr, 0, s, 0, length); return s; } public static class UserCommandsContributionItem extends UCContributionItem { public UserCommandsContributionItem() { super(Command.USER,SD_USER); } public UserCommandsContributionItem(IUser usr) { super(Command.USER,SD_USER,usr); } } public static class DownloadableSearchContributionItem extends UCContributionItem { public DownloadableSearchContributionItem() { super(Command.SEARCH,SD_DOWNLOADABLE); } } public static class DownloadableFileListContributionItem extends UCContributionItem { public DownloadableFileListContributionItem() { super(Command.FILELIST,SD_DOWNLOADABLE); } } public static class HubContributionItem extends UCContributionItem { private final IHub hub; public HubContributionItem() { this(null); } public HubContributionItem(IHub hub) { super(Command.HUB,SD_HUB); this.hub = hub; } @Override protected IContributionItem[] getContributionItems() { IPartService ips = (IPartService) serviceLocator.getService(IPartService.class); logger.debug("getContribs()"); IHub hub = this.hub; if (hub == null && ips.getActivePart() instanceof UCTextEditor) { hub = ((UCTextEditor)ips.getActivePart()).getHub(); } if (hub != null) { List<Command> userCommands = UserCommands.loadCommandAndAddHubCommnds( Collections.singleton(hub),Collections.singleton(hub),false, where); logger.debug("size: "+userCommands.size()); return addCommands(userCommands); } return new IContributionItem[]{}; } } public static class HubSelfDefinedCommandHandler extends AbstractHandler { public HubSelfDefinedCommandHandler(){} public Object execute(ExecutionEvent event) throws ExecutionException { IEditorPart part = HandlerUtil.getActiveEditor(event); if (part instanceof UCTextEditor) { IHub hub = ((UCTextEditor)part).getHub(); Command com = Command.createFromString(event.getParameter(COMMAND)); if (com.matches(hub)) { String command = com.getCommand(); Map<String,String> reps = ReplaceLine.get().replaceLines(command); if (!GH.isNullOrEmpty(command) && reps != null) { hub.sendRaw(command,new SendContext(reps)); } } } return null; } } }