package ie.dcu.apps.ist.actions; import ie.dcu.apps.ist.views.SegmentationView; import ie.dcu.segment.SegmentationContext; import ie.dcu.segment.painters.SegmentationPainter; import ie.dcu.swt.*; import java.awt.Toolkit; import java.awt.datatransfer.*; import java.awt.image.BufferedImage; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Display; /** * Copy view to clipboard. * * @author Kevin McGuinness */ public class CopyAction extends AppAction { public CopyAction(ActionManager m) { super(m); } @Override public void run() { if (window.hasContext()) { copy(); } } private void copy() { setClipboard(paintContext()); status("View copied to clipboard as image"); } private static BufferedImage convert(Image image) { BufferedImage im = ImageConverter.convert(image.getImageData()); image.dispose(); return im; } public void setClipboard(Image image) { ImageSelection selection = new ImageSelection(convert(image)); Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard(); clip.setContents(selection, null); } private Image paintContext() { SegmentationView view = window.getView(); SegmentationContext ctx = window.getContext(); SegmentationPainter painter = view.getPainter(); ObservableImage im = createCompatibleImage(ctx); painter.paint(ctx, im); return im.getImage(); } private ObservableImage createCompatibleImage(SegmentationContext ctx) { Image im = new Image(Display.getCurrent(), ctx.getBounds()); return new ObservableImage(im); } private static class ImageSelection implements Transferable { private BufferedImage image; public ImageSelection(BufferedImage image) { this.image = image; } public DataFlavor[] getTransferDataFlavors() { return new DataFlavor[] { DataFlavor.imageFlavor }; } public boolean isDataFlavorSupported(DataFlavor flavor) { return DataFlavor.imageFlavor.equals(flavor); } public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException { if (!DataFlavor.imageFlavor.equals(flavor)) { throw new UnsupportedFlavorException(flavor); } return image; } } }