Graphics: avoid freeze after copying plot to clipboard
[scilab.git] / scilab / modules / gui / src / java / org / scilab / modules / gui / editor / SystemClipboard.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2012 - Pedro Arthur dos S. Souza
4  * Copyright (C) 2012 - Caio Lucas dos S. Souza
5  *
6  * This file must be used under the terms of the CeCILL.
7  * This source file is licensed as described in the file COPYING, which
8  * you should have received as part of this distribution.  The terms
9  * are also available at
10  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
11  *
12  */
13
14 package org.scilab.modules.gui.editor;
15
16 import java.awt.datatransfer.*;
17 import java.awt.Toolkit;
18 import java.awt.Image;
19 import java.io.File;
20 import java.io.IOException;
21 import java.awt.image.BufferedImage;
22 import javax.imageio.ImageIO;
23 import java.util.*;
24 import org.scilab.forge.scirenderer.Canvas;
25 import org.scilab.forge.scirenderer.implementation.jogl.JoGLCanvas;
26 import org.scilab.modules.graphic_objects.graphicController.GraphicController;
27 import org.scilab.modules.renderer.JoGLView.DrawerVisitor;
28
29 /**
30  * implements the system clipboard, where a figure of scilab goes to the clipboard as an image
31  *
32  * @author Caio Souza <caioc2bolado@gmail.com>
33  * @author Pedro Souza <bygrandao@gmail.com>
34  *
35  * @since 2012-06-01
36  */
37
38 public class SystemClipboard {
39
40     static SystemClipboard instance = null;
41     static String name = "png";
42
43     public static SystemClipboard getInstance() {
44         if (instance == null) {
45             instance = new SystemClipboard();
46         }
47         return instance;
48     }
49
50     /**
51      * Given a figureID it make a buffered image and copy it to system clipboard
52      *
53      * @param uid The figure to copy
54      */
55     public static void copyToSysClipboard(Integer uid) {
56         BufferedImage image = bufferFromUID(uid);
57         ImageTransfer img = new ImageTransfer((Image)image);
58         Toolkit.getDefaultToolkit().getSystemClipboard().setContents(img, null);
59     }
60
61     /**
62      * Structure to retain an buffered image in the clipboard
63      */
64     public static class ImageTransfer implements Transferable {
65
66         private Image image;
67
68         public ImageTransfer(Image image) {
69             this.image = image;
70         }
71
72         /**
73          * Default structure for transferable flavors(type of flavor)
74          *
75          */
76         public DataFlavor[] getTransferDataFlavors() {
77             return new DataFlavor[] { DataFlavor.imageFlavor };
78         }
79
80         /**
81          * Default structure for transferable flavor( supported / not suported )
82          *
83          * @param flavor
84          * @return <ReturnValue>
85          */
86         public boolean isDataFlavorSupported(DataFlavor flavor) {
87             return DataFlavor.imageFlavor.equals(flavor);
88         }
89
90
91         /**
92          * Default structure for transferable flavor, returns the image or throw an excepction
93          *
94          * @param flavor
95          * @return <ReturnValue>
96          */
97         public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
98             if (!DataFlavor.imageFlavor.equals(flavor)) {
99                 throw new UnsupportedFlavorException(flavor);
100             }
101             return image;
102         }
103     }
104
105     private static BufferedImage bufferFromUID(Integer uid) {
106         JoGLCanvas joglCanvas = null;
107
108         DrawerVisitor visitor = DrawerVisitor.getVisitor(uid);
109         Canvas canvas = visitor.getCanvas();
110         if (canvas instanceof JoGLCanvas) {
111             joglCanvas = (JoGLCanvas)canvas;
112         }
113         if (joglCanvas != null) {
114             BufferedImage image = joglCanvas.getImage();
115             //joglCanvas.destroy();
116             return image;
117         }
118         return null;
119     }
120 }
121