/******************************************************************************* * Copyright (c) 2012-2017 Codenvy, S.A. * 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: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.ide.command.toolbar.processes; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.Widget; import com.google.inject.Singleton; import org.eclipse.che.ide.command.CommandResources; import org.eclipse.che.ide.command.toolbar.ToolbarMessages; import org.eclipse.che.ide.ui.dropdown.BaseListItem; import org.eclipse.che.ide.ui.dropdown.DropdownList; import org.eclipse.che.ide.ui.dropdown.StringItemRenderer; import javax.inject.Inject; import java.util.HashMap; import java.util.Map; /** Implementation of {@link ProcessesListView} that displays processes in a dropdown list. */ @Singleton public class ProcessesListViewImpl implements ProcessesListView { private final Map<Process, BaseListItem<Process>> listItems; private final Map<Process, ProcessItemRenderer> renderers; private final FlowPanel rootPanel; private final DropdownList dropdownList; private final EmptyListWidget emptyListWidget; private final ToolbarMessages messages; private final CreateCommandItem createCommandItem; private final CreateCommandItemRenderer createCommandItemRenderer; private ActionDelegate delegate; @Inject public ProcessesListViewImpl(CommandResources resources, EmptyListWidget emptyListWidget, ToolbarMessages messages) { this.emptyListWidget = emptyListWidget; this.messages = messages; listItems = new HashMap<>(); renderers = new HashMap<>(); final Label label = new Label("EXEC"); label.addStyleName(resources.commandToolbarCss().processesListLabel()); dropdownList = new DropdownList(emptyListWidget, true); dropdownList.setWidth("100%"); dropdownList.ensureDebugId("dropdown-processes"); dropdownList.setSelectionHandler(item -> { if (item instanceof CreateCommandItem) { delegate.onCreateCommand(); } else { listItems.entrySet() .stream() .filter(entry -> item.equals(entry.getValue())) .forEach(entry -> delegate.onProcessChosen(entry.getKey())); } }); rootPanel = new FlowPanel(); rootPanel.add(label); rootPanel.add(dropdownList); createCommandItem = new CreateCommandItem(); createCommandItemRenderer = new CreateCommandItemRenderer(); checkCreateCommandItem(); } /** Ensures that item for creating command added to the empty list or removed from non empty list. */ private void checkCreateCommandItem() { if (listItems.isEmpty()) { dropdownList.addItem(createCommandItem, createCommandItemRenderer); } else { dropdownList.removeItem(createCommandItem); } } @Override public void setDelegate(ActionDelegate delegate) { this.delegate = delegate; } @Override public Widget asWidget() { return rootPanel; } @Override public void clearList() { dropdownList.clear(); checkCreateCommandItem(); } @Override public void processStopped(Process process) { final ProcessItemRenderer renderer = renderers.get(process); if (renderer != null) { renderer.notifyProcessStopped(); } } @Override public void addProcess(Process process) { final BaseListItem<Process> listItem = new BaseListItem<>(process); final ProcessItemRenderer renderer = new ProcessItemRenderer(listItem, p -> delegate.onStopProcess(p), p -> delegate.onReRunProcess(p)); listItems.put(process, listItem); renderers.put(process, renderer); dropdownList.addItem(listItem, renderer); checkCreateCommandItem(); } @Override public void removeProcess(Process process) { final BaseListItem<Process> listItem = listItems.get(process); if (listItem != null) { listItems.remove(process); renderers.remove(process); dropdownList.removeItem(listItem); checkCreateCommandItem(); } } private class CreateCommandItem extends BaseListItem<String> { CreateCommandItem() { super(messages.guideItemLabel("new")); } } private class CreateCommandItemRenderer extends StringItemRenderer { CreateCommandItemRenderer() { super(createCommandItem); } @Override public Widget renderHeaderWidget() { return emptyListWidget; } } }