/******************************************************************************* * Copyright (c) 2012-2015 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.projecttype.wizard.runnerspage; import elemental.events.KeyboardEvent; import elemental.events.MouseEvent; import org.eclipse.che.api.project.shared.dto.RunnerEnvironment; import org.eclipse.che.api.project.shared.dto.RunnerEnvironmentLeaf; import org.eclipse.che.api.project.shared.dto.RunnerEnvironmentTree; import org.eclipse.che.ide.Resources; import org.eclipse.che.ide.dto.DtoFactory; import org.eclipse.che.ide.ui.tree.Tree; import org.eclipse.che.ide.ui.tree.TreeNodeElement; import org.eclipse.che.ide.util.input.SignalEvent; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.DockLayoutPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.TextArea; import com.google.gwt.user.client.ui.Widget; import com.google.inject.Inject; import java.util.HashMap; import java.util.Map; /** * @author Evgen Vidolob */ public class RunnersPageViewImpl implements RunnersPageView { interface RunnersPageViewImplUiBinder extends UiBinder<DockLayoutPanel, RunnersPageViewImpl> { } private final DockLayoutPanel rootElement; private final Tree<Object> tree; private final RunnerEnvironmentTree root; @UiField Label noEnvLabel; @UiField TextArea runnerDescription; @UiField SimplePanel treeContainer; private ActionDelegate delegate; private Map<String, RunnerEnvironmentLeaf> environmentMap = new HashMap<>(); @Inject public RunnersPageViewImpl(Resources resources, DtoFactory dtoFactory, RunnersRenderer runnersRenderer, RunnersPageViewImplUiBinder uiBinder) { rootElement = uiBinder.createAndBindUi(this); root = dtoFactory.createDto(RunnerEnvironmentTree.class); tree = Tree.create(resources, new RunnersDataAdapter(), runnersRenderer); treeContainer.setWidget(noEnvLabel); tree.setTreeEventHandler(new Tree.Listener<Object>() { @Override public void onNodeAction(TreeNodeElement<Object> node) { } @Override public void onNodeClosed(TreeNodeElement<Object> node) { } @Override public void onNodeContextMenu(int mouseX, int mouseY, TreeNodeElement<Object> node) { } @Override public void onNodeDragStart(TreeNodeElement<Object> node, MouseEvent event) { } @Override public void onNodeDragDrop(TreeNodeElement<Object> node, MouseEvent event) { } @Override public void onNodeExpanded(TreeNodeElement<Object> node) { } @Override public void onNodeSelected(TreeNodeElement<Object> node, SignalEvent event) { Object data = node.getData(); if (data instanceof RunnerEnvironmentLeaf) { delegate.environmentSelected(((RunnerEnvironmentLeaf)data).getEnvironment()); } else { delegate.environmentSelected(null); } } @Override public void onRootContextMenu(int mouseX, int mouseY) { } @Override public void onRootDragDrop(MouseEvent event) { } @Override public void onKeyboard(KeyboardEvent event) { } }); } @Override public void setDelegate(ActionDelegate delegate) { this.delegate = delegate; } @Override public Widget asWidget() { return rootElement; } @Override public void showRunnerDescription(String description) { runnerDescription.setText(description); } @Override public void addRunner(RunnerEnvironmentTree environmentTree) { collectRunnerEnvironments(environmentTree); root.getNodes().add(environmentTree); tree.getModel().setRoot(root); tree.renderTree(1); checkTreeVisibility(environmentTree); } private void collectRunnerEnvironments(RunnerEnvironmentTree environmentTree) { for (RunnerEnvironmentLeaf leaf : environmentTree.getLeaves()) { final RunnerEnvironment environment = leaf.getEnvironment(); if (environment != null) { environmentMap.put(environment.getId(), leaf); } } for (RunnerEnvironmentTree node : environmentTree.getNodes()) { collectRunnerEnvironments(node); } } private void checkTreeVisibility(RunnerEnvironmentTree environmentTree) { if (environmentTree.getNodes().isEmpty() && environmentTree.getLeaves().isEmpty()) { treeContainer.setWidget(noEnvLabel); } else { treeContainer.setWidget(tree); } } @Override public void selectRunnerEnvironment(String environmentId) { final RunnerEnvironmentLeaf environment = environmentMap.get(environmentId); if (environmentMap.containsKey(environmentId)) { // TODO: need to implement RunnersDataAdapter.getParent() to properly working auto-expanding feature //tree.autoExpandAndSelectNode(environment, true); delegate.environmentSelected(environment.getEnvironment()); } } @Override public void clearTree() { root.getNodes().clear(); tree.renderTree(1); } }