< prev index next >

src/java.desktop/macosx/classes/sun/lwawt/macosx/CDataTransferer.java

Print this page

        

@@ -34,10 +34,11 @@
 import java.net.URL;
 import java.nio.charset.Charset;
 import java.text.Normalizer;
 import java.text.Normalizer.Form;
 import java.util.*;
+import java.util.regex.*;
 
 import java.awt.datatransfer.*;
 import sun.awt.datatransfer.*;
 
 public class CDataTransferer extends DataTransferer {

@@ -127,16 +128,25 @@
     @Override
     public Object translateBytes(byte[] bytes, DataFlavor flavor,
                                  long format, Transferable transferable) throws IOException {
 
         if (format == CF_URL && URL.class.equals(flavor.getRepresentationClass())) {
-            String[] strings = dragQueryFile(bytes);
-            if(strings == null || strings.length == 0) {
-                return null;
+            String charset = Charset.defaultCharset().name();
+            if (transferable != null && transferable.isDataFlavorSupported(javaTextEncodingFlavor)) {
+                try {
+                    charset = new String((byte[]) transferable.getTransferData(javaTextEncodingFlavor), "UTF-8");
+                } catch (UnsupportedFlavorException cannotHappen) {
+                }
+            }
+
+            String xml = new String(bytes, charset);
+            // macosx pasteboard returns a property list that consists of one URL
+            // let's extract it.
+            return new URL(extractURL(xml));
             }
-            return new URL(strings[0]);
-        } else if(isUriListFlavor(flavor)) {
+
+        if(isUriListFlavor(flavor) && format == CF_FILE) {
             // dragQueryFile works fine with files and url,
             // it parses and extracts values from property list.
             // maxosx always returns property list for
             // CF_URL and CF_FILE
             String[] strings = dragQueryFile(bytes);

@@ -154,10 +164,20 @@
         }
 
         return super.translateBytes(bytes, flavor, format, transferable);
     }
 
+    private String extractURL(String xml) {
+       Pattern urlExtractorPattern = Pattern.compile("<string>(.*)</string>");
+        Matcher matcher = urlExtractorPattern.matcher(xml);
+        if (matcher.find()) {
+            return matcher.group(1);
+        } else {
+            return null;
+        }
+    }
+
     @Override
     protected synchronized Long getFormatForNativeAsLong(String str) {
         Long format = predefinedClipboardNameMap.get(str);
 
         if (format == null) {
< prev index next >