package org.csstudio.sds.ui.internal.editor; import org.csstudio.sds.model.DisplayModel; import org.csstudio.sds.ui.editparts.ExecutionMode; import org.csstudio.sds.ui.internal.editparts.DisplayEditPart; import org.csstudio.sds.ui.internal.editparts.WidgetEditPartFactory; import org.eclipse.draw2d.Graphics; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.SWTGraphics; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.gef.EditPart; import org.eclipse.gef.editparts.ScalableFreeformRootEditPart; import org.eclipse.gef.ui.parts.GraphicalViewerImpl; 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.layout.FillLayout; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; public class ThumbnailCreator { public static ImageData createImage(final DisplayModel model, final int thumbSize) { final ImageDataContainer resultContainer = new ImageDataContainer(); final Display display = Display.getDefault(); display.syncExec(new Runnable() { @Override public void run() { Shell shell = new Shell(display, SWT.NO_TRIM); Image image = null; try { shell.setLayout(new FillLayout()); shell.setSize(model.getWidth(), model.getHeight()); ThumbnailDrawingViewer viewer = new ThumbnailDrawingViewer(); viewer.createControl(shell); viewer.setEditPartFactory(new NoBorderWidgetEditPartFactory( ExecutionMode.EDIT_MODE)); viewer.setRootEditPart(new ScalableFreeformRootEditPart()); viewer.setContents(model); shell.layout(); image = viewer.getImage(thumbSize); ImageData result = image.getImageData(); resultContainer.imageData = result; } finally { if (image != null) { image.dispose(); } shell.dispose(); } } }); return resultContainer.imageData; } private static class ImageDataContainer { public ImageData imageData; } private static class ThumbnailDrawingViewer extends GraphicalViewerImpl { public Image getImage(int thumbSize) { IFigure figure = getLightweightSystem().getRootFigure(); Rectangle bounds = figure.getBounds(); double factor = Math.min( (double) thumbSize / (double) bounds.width, (double) thumbSize / (double) bounds.height); Image image = new Image(Display.getCurrent(), (int) Math.ceil((double) bounds.width * factor), (int) Math.ceil((double) bounds.height * factor)); GC gc = new GC(image); Graphics graphics = new SWTGraphics(gc); // TODO Antialiasing an GC oder Graphics konfigurieren graphics.scale(factor); figure.paint(graphics); gc.dispose(); // TODO disposing in finally-Block return image; } } private static class NoBorderWidgetEditPartFactory extends WidgetEditPartFactory { public NoBorderWidgetEditPartFactory(ExecutionMode executionMode) { super(executionMode); } @Override public EditPart createEditPart(EditPart context, Object modelElement) { EditPart result = super.createEditPart(context, modelElement); if(modelElement instanceof DisplayModel) { ((DisplayEditPart)result).setExecutionMode(ExecutionMode.RUN_MODE); } return result; } } }