/**
*
*/
package org.activiti.designer.export.image.export;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import org.activiti.designer.eclipse.common.ActivitiBPMNDiagramConstants;
import org.activiti.designer.eclipse.editor.ActivitiDiagramEditor;
import org.activiti.designer.eclipse.extension.export.AbstractExportMarshaller;
import org.activiti.designer.eclipse.extension.export.ExportMarshaller;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.SWTGraphics;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.GraphicalViewer;
import org.eclipse.gef.LayerConstants;
import org.eclipse.gef.editparts.LayerManager;
import org.eclipse.gef.editparts.ScalableFreeformRootEditPart;
import org.eclipse.graphiti.mm.pictograms.Diagram;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.ImageLoader;
import org.eclipse.swt.widgets.Display;
/**
* Exports an image of the diagram being saved to the workspace.
*
* @author Tiese Barrell
* @since 0.5.1
* @version 1
*
*/
public class ImageExportMarshaller extends AbstractExportMarshaller {
private static final String FILENAME_PATTERN = ExportMarshaller.PLACEHOLDER_ORIGINAL_FILENAME_WITHOUT_EXTENSION + ".png";
private IProgressMonitor monitor;
private Diagram diagram;
/**
*
*/
public ImageExportMarshaller() {
}
@Override
public String getMarshallerName() {
return ActivitiBPMNDiagramConstants.IMAGE_MARSHALLER_NAME;
}
@Override
public String getFormatName() {
return "Activiti Designer Image";
}
@Override
public void marshallDiagram(Diagram diagram, IProgressMonitor monitor) {
this.monitor = monitor;
this.diagram = diagram;
monitor.beginTask("", 100);
// Clear problems for this marshaller first
clearMarkers(getResource(diagram.eResource().getURI()));
monitor.worked(10);
marshallImage();
monitor.worked(90);
monitor.done();
}
private void marshallImage() {
try {
// Retrieve GraphicalViewer from the save handler
final GraphicalViewer graphicalViewer = ActivitiDiagramEditor.getActiveGraphicalViewer();
if (graphicalViewer == null || graphicalViewer.getEditPartRegistry() == null)
return;
final ScalableFreeformRootEditPart rootEditPart = (ScalableFreeformRootEditPart) graphicalViewer.getEditPartRegistry().get(LayerManager.ID);
final IFigure rootFigure = ((LayerManager) rootEditPart).getLayer(LayerConstants.PRINTABLE_LAYERS);
final IFigure gridFigure = ((LayerManager) rootEditPart).getLayer(LayerConstants.GRID_LAYER);
final Rectangle rootFigureBounds = rootFigure.getBounds();
final boolean toggleRequired = gridFigure.isShowing();
final Display display = Display.getDefault();
final Image img = new Image(display, rootFigureBounds.width, rootFigureBounds.height);
final GC imageGC = new GC(img);
final SWTGraphics grap = new SWTGraphics(imageGC);
// Access UI thread from runnable to print the canvas to the image
display.syncExec(new Runnable() {
public void run() {
if (toggleRequired) {
// Disable any grids temporarily
gridFigure.setVisible(false);
}
// Deselect any selections
graphicalViewer.deselectAll();
rootFigure.paint(grap);
}
});
ImageLoader imgLoader = new ImageLoader();
imgLoader.data = new ImageData[] { img.getImageData() };
ByteArrayOutputStream baos = new ByteArrayOutputStream(imgLoader.data.length);
imgLoader.save(baos, SWT.IMAGE_PNG);
imageGC.dispose();
img.dispose();
// Access UI thread from runnable
display.syncExec(new Runnable() {
public void run() {
if (toggleRequired) {
// Re-enable any grids
gridFigure.setVisible(true);
}
}
});
final byte[] bytes = baos.toByteArray();
final ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
saveResource(getRelativeURIForDiagram(diagram, FILENAME_PATTERN), bais, this.monitor);
} catch (Exception e) {
e.printStackTrace();
addProblemToDiagram(diagram, "An exception occurred while creating the image: " + e.getCause(), null);
}
}
}