< 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 >