/*
* Copyright 2016 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.kie.workbench.common.stunner.core.client.util;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.google.gwt.logging.client.LogConfiguration;
import com.google.gwt.user.client.Timer;
import org.kie.workbench.common.stunner.core.client.canvas.CanvasHandler;
import org.kie.workbench.common.stunner.core.client.shape.Shape;
import org.kie.workbench.common.stunner.core.client.shape.ShapeState;
import org.kie.workbench.common.stunner.core.graph.Edge;
import org.kie.workbench.common.stunner.core.graph.Graph;
import org.kie.workbench.common.stunner.core.graph.Node;
import org.kie.workbench.common.stunner.core.graph.content.definition.DefinitionSet;
import org.kie.workbench.common.stunner.core.graph.content.view.View;
import org.kie.workbench.common.stunner.core.graph.processing.traverse.content.ContentTraverseCallback;
import org.kie.workbench.common.stunner.core.graph.processing.traverse.content.ViewTraverseProcessorImpl;
import org.kie.workbench.common.stunner.core.graph.processing.traverse.tree.TreeWalkTraverseProcessor;
import org.kie.workbench.common.stunner.core.graph.processing.traverse.tree.TreeWalkTraverseProcessorImpl;
import org.uberfire.mvp.Command;
/**
* Walks through the graph and highlights elements while visiting. Just for development use.
*/
public class CanvasHighlightVisitor {
private static Logger LOGGER = Logger.getLogger(CanvasHighlightVisitor.class.getName());
private static final int TIMER_DELAY = 500;
private CanvasHandler canvasHandler;
private final List<Shape> shapes = new LinkedList<Shape>();
public CanvasHighlightVisitor() {
}
public void run(final CanvasHandler canvasHandler,
final Command callback) {
this.canvasHandler = canvasHandler;
prepareVisit(() -> animate(0,
() -> {
CanvasHighlightVisitor.this.log(Level.FINE,
"CanvasHighlightVisitor - FINISHED");
if (null != callback) {
callback.execute();
CanvasHighlightVisitor.this.canvasHandler = null;
CanvasHighlightVisitor.this.shapes.clear();
}
}));
}
private void animate(final int index,
final Command callback) {
if (index < shapes.size()) {
final Shape shape = shapes.get(index);
shape.applyState(ShapeState.HIGHLIGHT);
canvasHandler.getCanvas().draw();
final Timer t = new Timer() {
@Override
public void run() {
animate(index + 1,
callback);
}
};
t.schedule(TIMER_DELAY);
} else {
callback.execute();
}
}
@SuppressWarnings("unchecked")
private void prepareVisit(final Command command) {
final Graph graph = canvasHandler.getDiagram().getGraph();
final TreeWalkTraverseProcessor treeWalkTraverseProcessor =
new TreeWalkTraverseProcessorImpl()
.useStartNodePredicate(node -> !node.getInEdges().stream()
.filter(e -> e.getContent() instanceof View)
.findAny()
.isPresent());
new ViewTraverseProcessorImpl(treeWalkTraverseProcessor)
.traverse(graph,
new ContentTraverseCallback<View<?>, Node<View, Edge>, Edge<View<?>, Node>>() {
@Override
public void startGraphTraversal(final Graph<DefinitionSet, Node<View, Edge>> graph) {
}
@Override
public void startEdgeTraversal(final Edge<View<?>, Node> edge) {
addShape(edge.getUUID());
}
@Override
public void endEdgeTraversal(final Edge<View<?>, Node> edge) {
}
@Override
public void startNodeTraversal(final Node<View, Edge> node) {
addShape(node.getUUID());
}
@Override
public void endNodeTraversal(final Node<View, Edge> node) {
}
@Override
public void endGraphTraversal() {
command.execute();
}
private void addShape(final String uuid) {
final Shape shape = canvasHandler.getCanvas().getShape(uuid);
if (null != shape) {
shapes.add(shape);
}
}
});
}
private void log(final Level level,
final String message) {
if (LogConfiguration.loggingIsEnabled()) {
LOGGER.log(level,
message);
}
}
}