/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
* Copyright (c) 2013, MPL CodeInside http://codeinside.ru
*/
package ru.codeinside.gses.webui.components;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collection;
import java.util.List;
import javax.imageio.ImageIO;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.impl.RepositoryServiceImpl;
import org.activiti.engine.impl.bpmn.diagram.ProcessDiagramGenerator;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import ru.codeinside.gses.service.Functions;
import ru.codeinside.gses.webui.Flash;
import com.google.common.base.Function;
import com.google.common.collect.Lists;
import com.vaadin.Application;
import com.vaadin.event.MouseEvents.ClickEvent;
import com.vaadin.event.MouseEvents.ClickListener;
import com.vaadin.terminal.StreamResource;
import com.vaadin.terminal.StreamResource.StreamSource;
import com.vaadin.ui.Embedded;
public class EmbeddedGraph extends Embedded {
private static final long serialVersionUID = 1L;
private int deltaX = 0;
private int deltaY = 0;
public EmbeddedGraph(ProcessDefinitionEntity entity, final List<String> activeActivityIds, final Application application) {
this(entity, activeActivityIds, application, null, 0, 0);
}
public EmbeddedGraph(ProcessDefinitionEntity entity, final List<String> activeActivityIds, final Application application, final EmbeddedGraph graph, int newDeltaX, int newDeltaY) {
super();
if(graph != null){
if(graph.deltaX + newDeltaX > 0){
deltaX = graph.deltaX + newDeltaX;
}
if(graph.deltaY + newDeltaY > 0){
deltaY = graph.deltaY + newDeltaY;
}
Collection<?> listeners = graph.getListeners(ClickEvent.class);
for(Object o :listeners){
addListener((ClickListener)o);
}
}
final String id = entity.getId();
setMimeType("image/png");
StreamSource streamSource = new StreamSource() {
private static final long serialVersionUID = 1L;
public InputStream getStream() {
ProcessDefinitionEntity entity = Functions.withRepository(Flash.login(),
new Function<RepositoryService, ProcessDefinitionEntity>() {
public ProcessDefinitionEntity apply(final RepositoryService srv) {
RepositoryServiceImpl impl = (RepositoryServiceImpl) srv;
return (ProcessDefinitionEntity) impl.getDeployedProcessDefinition(id);
}
});
InputStream streamDiagram = ProcessDiagramGenerator.generateDiagram(entity, "png", (activeActivityIds == null ? Lists.<String>newArrayList() : activeActivityIds));
if(deltaX != 0 && deltaY != 0){
try {
return changedInputStream(streamDiagram);
} catch (IOException e) {
e.printStackTrace();
}
}
return streamDiagram;
}
private InputStream changedInputStream(InputStream streamDiagram) throws IOException {
BufferedImage originalImage = ImageIO.read(streamDiagram);
int width = originalImage.getWidth() + deltaX;
int height = originalImage.getHeight() + deltaY;
BufferedImage bi = new BufferedImage(width, height, originalImage.getType());
Graphics2D g = (Graphics2D)bi.getGraphics();
g.drawImage(originalImage, 0, 0, width, height, null);
g.dispose();
ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(bi, "png", os);
return new ByteArrayInputStream(os.toByteArray());
}
};
setSource(new StreamResource(streamSource, id + ".png", application));
}
}