/*******************************************************************************
* 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.plugin.testing.ide.view.navigation.nodes;
import static org.eclipse.che.ide.ui.menu.PositionController.HorizontalAlign.MIDDLE;
import static org.eclipse.che.ide.ui.menu.PositionController.VerticalAlign.BOTTOM;
import java.util.List;
import javax.validation.constraints.NotNull;
import org.eclipse.che.api.promises.client.Promise;
import org.eclipse.che.api.promises.client.js.Promises;
import org.eclipse.che.api.testing.shared.TestResult;
import org.eclipse.che.ide.api.data.tree.AbstractTreeNode;
import org.eclipse.che.ide.api.data.tree.Node;
import org.eclipse.che.ide.ui.Tooltip;
import org.eclipse.che.ide.ui.smartTree.TreeStyles;
import org.eclipse.che.ide.ui.smartTree.presentation.HasPresentation;
import org.eclipse.che.ide.ui.smartTree.presentation.NodePresentation;
import org.eclipse.che.ide.util.dom.Elements;
import org.eclipse.che.plugin.testing.ide.TestResources;
import org.vectomatic.dom.svg.ui.SVGImage;
import org.vectomatic.dom.svg.ui.SVGResource;
import com.google.gwt.dom.client.Element;
import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted;
import elemental.events.Event;
import elemental.events.EventListener;
import elemental.html.SpanElement;
/**
* Tree node for display the failing class.
*
* @author Mirage Abeysekara
*/
public class TestResultGroupNode extends AbstractTreeNode implements HasPresentation {
private NodePresentation nodePresentation;
private final TestResources testResources;
private final TreeStyles treeStylesResources;
private final Runnable showOnlyFailuresDelegate;
private int failureCount;
private boolean showFailuresOnly;
@Inject
public TestResultGroupNode(TestResources testResources,
TreeStyles treeStylesResources,
@Assisted TestResult result,
@Assisted boolean showFailuresOnly,
@Assisted Runnable showOnlyFailuresDelegate) {
failureCount = result.getFailureCount();
this.testResources = testResources;
this.treeStylesResources = treeStylesResources;
this.showOnlyFailuresDelegate = showOnlyFailuresDelegate;
this.showFailuresOnly = showFailuresOnly;
}
@Override
protected Promise<List<Node>> getChildrenImpl() {
return Promises.resolve(children);
}
@Override
public String getName() {
if (failureCount > 0) {
return "There are " + failureCount + " test failures.";
} else {
return "Test passed.";
}
}
@Override
public boolean isLeaf() {
return false;
}
@Override
public void updatePresentation(@NotNull NodePresentation presentation) {
if (failureCount > 0) {
presentation.setPresentableIcon(testResources.testResultsFail());
} else {
presentation.setPresentableIcon(testResources.testResultsPass());
}
SpanElement root = Elements.createSpanElement();
SpanElement textElement = Elements.createSpanElement(treeStylesResources.styles().presentableTextContainer());
textElement.setTextContent(getName());
root.appendChild(textElement);
SpanElement button = Elements.createSpanElement();
SVGResource svg = showFailuresOnly ? testResources.showAllTestsButtonIcon() : testResources.showFailuresOnlyButtonIcon();
String tooltip = showFailuresOnly ? "Include successful tests" : "Hide successful tests";
Tooltip.create(button,
BOTTOM,
MIDDLE,
tooltip);
button.appendChild((elemental.dom.Node)new SVGImage(svg).getElement());
button.getStyle().setProperty("float", "right");
button.getStyle().setProperty("padding-right", "9px");
button.getStyle().setProperty("padding-left", "8px");
if (failureCount == 0) {
button.getStyle().setDisplay("none");
} else {
button.addEventListener(Event.CLICK, new EventListener() {
@Override
public void handleEvent(Event event) {
event.stopPropagation();
event.preventDefault();
showOnlyFailuresDelegate.run();
}
}, true);
button.getStyle().setDisplay("inline");
}
/**
* This listener cancels mouse events on '+' button and prevents the jitter of the selection in the tree.
*/
EventListener blockMouseListener = new EventListener() {
@Override
public void handleEvent(Event event) {
event.stopPropagation();
event.preventDefault();
}
};
/**
* Prevent jitter when pressing mouse on '+' button.
*/
button.addEventListener(Event.MOUSEDOWN, blockMouseListener, true);
button.addEventListener(Event.MOUSEUP, blockMouseListener, true);
button.addEventListener(Event.CLICK, blockMouseListener, true);
button.addEventListener(Event.DBLCLICK, blockMouseListener, true);
root.appendChild(button);
presentation.setUserElement((Element)root);
}
@Override
public NodePresentation getPresentation(boolean update) {
if (nodePresentation == null) {
nodePresentation = new NodePresentation();
updatePresentation(nodePresentation);
}
if (update) {
updatePresentation(nodePresentation);
}
return nodePresentation;
}
}