17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package javafx.embed.swing; 27 28 import javafx.scene.input.DataFormat; 29 30 import java.io.ByteArrayOutputStream; 31 import java.util.Set; 32 import java.util.Map; 33 import java.util.List; 34 import java.util.HashMap; 35 import java.util.HashSet; 36 import java.util.Collections; 37 38 import java.awt.datatransfer.DataFlavor; 39 import java.awt.datatransfer.Transferable; 40 import java.awt.datatransfer.UnsupportedFlavorException; 41 42 import java.io.ByteArrayInputStream; 43 import java.io.File; 44 import java.io.IOException; 45 import java.io.InputStream; 46 import java.io.UnsupportedEncodingException; 47 48 import java.nio.ByteBuffer; 49 50 51 final class DataFlavorUtils { 52 53 static String getFxMimeType(final DataFlavor flavor) { 54 return flavor.getPrimaryType() + "/" + flavor.getSubType(); 55 } 56 57 /** 58 * InputStream implementation backed by a ByteBuffer. 59 * It can handle byte buffers that are backed by arrays 60 * as well as operating system memory. 61 */ 62 private static class ByteBufferInputStream extends InputStream { 63 private final ByteBuffer bb; 64 65 private ByteBufferInputStream(ByteBuffer bb) { this.bb = bb; } 66 67 @Override public int available() { return bb.remaining(); } 68 69 @Override public int read() throws IOException { 70 if (!bb.hasRemaining()) return -1; 71 return bb.get() & 0xFF; // Make sure the value is in [0..255] 72 } 73 74 @Override public int read(byte[] bytes, int off, int len) throws IOException { | 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package javafx.embed.swing; 27 28 import javafx.scene.input.DataFormat; 29 30 import java.io.ByteArrayOutputStream; 31 import java.util.Set; 32 import java.util.Map; 33 import java.util.List; 34 import java.util.HashMap; 35 import java.util.HashSet; 36 import java.util.Collections; 37 import java.util.ArrayList; 38 39 import java.awt.datatransfer.DataFlavor; 40 import java.awt.datatransfer.Transferable; 41 import java.awt.datatransfer.UnsupportedFlavorException; 42 43 import java.io.ByteArrayInputStream; 44 import java.io.File; 45 import java.io.IOException; 46 import java.io.InputStream; 47 import java.io.UnsupportedEncodingException; 48 49 import java.nio.ByteBuffer; 50 51 52 final class DataFlavorUtils { 53 54 static String getFxMimeType(final DataFlavor flavor) { 55 return flavor.getPrimaryType() + "/" + flavor.getSubType(); 56 } 57 58 static DataFlavor[] getDataFlavors(String[] mimeTypes) { 59 final ArrayList<DataFlavor> flavors = 60 new ArrayList<DataFlavor>(mimeTypes.length); 61 for (String mime : mimeTypes) { 62 DataFlavor flavor = null; 63 try { 64 flavor = new DataFlavor(mime); 65 } catch (ClassNotFoundException e) { 66 // FIXME: what to do? 67 continue; 68 } 69 flavors.add(flavor); 70 } 71 return flavors.toArray(new DataFlavor[0]); 72 } 73 74 static DataFlavor getDataFlavor(final DataFormat format) { 75 DataFlavor[] flavors = getDataFlavors(format.getIdentifiers().toArray(new String[1])); 76 77 // Well, that's our best guess... 78 return flavors.length == 0 ? null : flavors[0]; 79 } 80 81 static String getMimeType(final DataFormat format) { 82 // Well, that's our best guess... 83 for (String id : format.getIdentifiers()) return id; 84 return null; 85 } 86 87 static DataFormat getDataFormat(final DataFlavor flavor) { 88 String mimeType = getFxMimeType(flavor); 89 DataFormat dataFormat = DataFormat.lookupMimeType(mimeType); 90 if (dataFormat == null) { 91 dataFormat = new DataFormat(mimeType); // are we ready for this yet? 92 } 93 return dataFormat; 94 } 95 96 /** 97 * InputStream implementation backed by a ByteBuffer. 98 * It can handle byte buffers that are backed by arrays 99 * as well as operating system memory. 100 */ 101 private static class ByteBufferInputStream extends InputStream { 102 private final ByteBuffer bb; 103 104 private ByteBufferInputStream(ByteBuffer bb) { this.bb = bb; } 105 106 @Override public int available() { return bb.remaining(); } 107 108 @Override public int read() throws IOException { 109 if (!bb.hasRemaining()) return -1; 110 return bb.get() & 0xFF; // Make sure the value is in [0..255] 111 } 112 113 @Override public int read(byte[] bytes, int off, int len) throws IOException { |