/******************************************************************************* * Copyright (c) 2015 Red Hat. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Red Hat - Initial Contribution *******************************************************************************/ package org.eclipse.linuxtools.internal.vagrant.ui.commands; import java.util.ArrayList; import java.util.List; import org.eclipse.core.commands.Command; import org.eclipse.core.commands.ParameterizedCommand; import org.eclipse.core.expressions.EvaluationContext; import org.eclipse.core.expressions.IEvaluationContext; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.ContributionItem; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IContributionItem; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.linuxtools.internal.vagrant.ui.Activator; import org.eclipse.linuxtools.internal.vagrant.ui.SWTImagesFactory; import org.eclipse.linuxtools.vagrant.core.EnumVMStatus; import org.eclipse.linuxtools.vagrant.core.IVagrantConnection; import org.eclipse.linuxtools.vagrant.core.IVagrantVM; import org.eclipse.linuxtools.vagrant.core.IVagrantVMListener; import org.eclipse.linuxtools.vagrant.core.VagrantService; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Menu; import org.eclipse.ui.ISources; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.commands.ICommandService; import org.eclipse.ui.handlers.IHandlerService; public class VagrantToolBarContributionItem extends ContributionItem implements IVagrantVMListener { private List<IVagrantVM> vms = new ArrayList<>(); public VagrantToolBarContributionItem() { IVagrantConnection conn = VagrantService.getInstance(); conn.addVMListener(this); Thread t = new Thread(() -> { vms = conn.getVMs(); }); t.start(); } public VagrantToolBarContributionItem(String id) { super(id); } @Override public void fill(Menu menu, int index) { // The menu passed in doesn't allow us to have sub-menus // Ignore it, get the parent IMenuManager and create the structure if (getParent() instanceof IMenuManager) { IMenuManager mm = (IMenuManager) getParent(); IContributionItem v = mm.find(getId()); // Menu manager contributions get aggregated so remove them first mm.removeAll(); // dynamic menu contribution ensures fill() gets called mm.add(v); for (IVagrantVM vm : vms) { EnumVMStatus containerStatus = EnumVMStatus.fromStatusMessage(vm.state()); ImageDescriptor img = (containerStatus == EnumVMStatus.RUNNING) ? SWTImagesFactory.DESC_CONTAINER_STARTED : SWTImagesFactory.DESC_CONTAINER_STOPPED; IMenuManager vmM = new MenuManager(vm.name(), img, null); for (IAction act : getApplicableActions(vm)) { vmM.add(act); } mm.add(vmM); } } } private List<IAction> getApplicableActions(IVagrantVM vm) { final EnumVMStatus containerStatus = EnumVMStatus.fromStatusMessage(vm.state()); List<IAction> list = new ArrayList<>(); if (containerStatus == EnumVMStatus.RUNNING) { list.add(createAction(Messages.VagrantToolBarContributionItem_stop, "org.eclipse.linuxtools.vagrant.ui.commands.stopVM", //$NON-NLS-1$ SWTImagesFactory.DESC_STOP, vm)); list.add(createAction(Messages.VagrantToolBarContributionItem_destroy, "org.eclipse.linuxtools.vagrant.ui.commands.destroyVM", //$NON-NLS-1$ SWTImagesFactory.DESC_REMOVE, vm)); list.add(createAction(Messages.VagrantToolBarContributionItem_ssh, "org.eclipse.linuxtools.vagrant.ui.commands.sshVM", //$NON-NLS-1$ SWTImagesFactory.DESC_CONSOLE, vm)); } else { list.add(createAction(Messages.VagrantToolBarContributionItem_start, "org.eclipse.linuxtools.vagrant.ui.commands.startVM", //$NON-NLS-1$ SWTImagesFactory.DESC_START, vm)); } list.add(createAction(Messages.VagrantToolBarContributionItem_package, "org.eclipse.linuxtools.vagrant.ui.commands.packageVM", //$NON-NLS-1$ SWTImagesFactory.DESC_BUILD, vm)); list.add(createAction(Messages.VagrantToolBarContributionItem_open, "org.eclipse.linuxtools.vagrant.ui.commands.openVFile", //$NON-NLS-1$ SWTImagesFactory.DESC_FILE, vm)); return list; } private IAction createAction(String label, String id, ImageDescriptor img, IVagrantVM vm) { return new Action(label, img) { @Override public void run() { execute(id, new StructuredSelection(vm)); } }; } private void execute(String id, IStructuredSelection selection) { ICommandService service = PlatformUI.getWorkbench().getService(ICommandService.class); Command command = service != null ? service.getCommand(id) : null; if (command != null && command.isDefined()) { try { ParameterizedCommand pCmd = ParameterizedCommand.generateCommand(command, null); IHandlerService handlerSvc = PlatformUI.getWorkbench().getService(IHandlerService.class); IEvaluationContext ctx = handlerSvc.getCurrentState(); ctx = new EvaluationContext(ctx, selection); ctx.addVariable(ISources.ACTIVE_CURRENT_SELECTION_NAME, selection); handlerSvc.executeCommandInContext(pCmd, null, ctx); } catch (Exception e) { Activator.log(e); } } } @Override public boolean isDynamic() { return true; } @Override public boolean isDirty() { return true; } @Override public void listChanged(IVagrantConnection connection, List<IVagrantVM> list) { this.vms = list; // Need to call update(false) so menu manager is up to date if (getParent() instanceof IMenuManager) { IMenuManager mm = (IMenuManager) getParent(); Display.getDefault().asyncExec(() -> { mm.update(false); }); } } }