/**
* Copyright (c) 2009 - 2010 AppWork UG(haftungsbeschränkt) <e-mail@appwork.org>
*
* This file is part of org.appwork.utils
*
* This software is licensed under the Artistic License 2.0,
* see the LICENSE file or http://www.opensource.org/licenses/artistic-license-2.0.php
* for details
*/
package org.appwork.utils;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.io.File;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import javax.swing.TransferHandler.TransferSupport;
import org.appwork.utils.logging.Log;
import org.appwork.utils.os.CrossSystem;
import org.appwork.utils.parser.HTMLParser;
public class ClipboardUtils {
private static ClipboardUtils INSTANCE = new ClipboardUtils();
public final static DataFlavor fileListFlavor = DataFlavor.javaFileListFlavor;
public final static DataFlavor stringFlavor = DataFlavor.stringFlavor;
private final static byte[] tmpByteArray = new byte[0];
public final static DataFlavor arrayListFlavor;
public final static DataFlavor uriListFlavor;
static {
DataFlavor tmp;
try {
tmp = new DataFlavor("text/uri-list; class=java.lang.String");
} catch (final Throwable e) {
tmp = null;
}
uriListFlavor = tmp;
try {
tmp = new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType + ";class=java.util.ArrayList");
} catch (final Throwable e) {
tmp = null;
}
arrayListFlavor = tmp;
}
@SuppressWarnings("unchecked")
public static ArrayList<File> getFiles(final TransferSupport info) {
final ArrayList<File> files = new ArrayList<File>();
String inString = null;
if (info != null) {
StringTokenizer izer;
try {
if (info.isDataFlavorSupported(ClipboardUtils.fileListFlavor)) {
final List<File> list = (List<File>) info.getTransferable().getTransferData(ClipboardUtils.fileListFlavor);
for (final File f : list) {
if (f.isAbsolute() && f.exists()) {
files.add(f);
}
}
} else if (ClipboardUtils.uriListFlavor != null && info.isDataFlavorSupported(ClipboardUtils.uriListFlavor)) {
inString = (String) info.getTransferable().getTransferData(ClipboardUtils.uriListFlavor);
izer = new StringTokenizer(inString, "\r\n");
while (izer.hasMoreTokens()) {
final String token = izer.nextToken().trim();
try {
final URI fi = new URI(token);
final File f = new File(fi.getPath());
if (f.isAbsolute() && f.exists()) {
files.add(f);
}
} catch (final Throwable e) {
}
}
}
} catch (final Exception e) {
Log.L.warning(inString);
Log.L.warning(e.getMessage());
}
}
return files;
}
public static ClipboardUtils getInstance() {
return ClipboardUtils.INSTANCE;
}
public static ArrayList<String> getLinks(final Transferable trans) {
final ArrayList<String> links = new ArrayList<String>();
String content = null;
DataFlavor htmlFlavor = null;
/*
* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=385421
*/
try {
for (final DataFlavor flav : trans.getTransferDataFlavors()) {
if (flav.getMimeType().contains("html") && flav.getRepresentationClass().isInstance(ClipboardUtils.tmpByteArray)) {
if (htmlFlavor != null) {
htmlFlavor = flav;
}
final String charSet = new Regex(flav.toString(), "charset=(.*?)]").getMatch(0);
if (charSet != null && charSet.equalsIgnoreCase("UTF-8")) {
/* we found utf-8 encoding, so lets use that */
htmlFlavor = flav;
break;
}
}
}
if (htmlFlavor != null) {
final String charSet = new Regex(htmlFlavor.toString(), "charset=(.*?)]").getMatch(0);
byte[] html = (byte[]) trans.getTransferData(htmlFlavor);
if (CrossSystem.isLinux()) {
/*
* workaround for
* https://bugzilla.mozilla.org/show_bug.cgi?id=385421if
*/
final int htmlLength = html.length;
final byte[] html2 = new byte[htmlLength];
int o = 0;
for (int i = 6; i < htmlLength - 1; i++) {
if (html[i] != 0) {
html2[o++] = html[i];
}
}
html = html2;
content = new String(html, "UTF-8");
} else {
if (charSet != null) {
content = new String(html, charSet);
} else {
content = new String(html);
}
}
} else {
/* try stringFlavor */
if (trans.isDataFlavorSupported(ClipboardUtils.stringFlavor)) {
content = (String) trans.getTransferData(ClipboardUtils.stringFlavor);
}
}
if (content != null) {
links.addAll(HTMLParser.findUrls(content));
}
} catch (final Exception e) {
Log.L.info(e.getMessage());
}
return links;
}
public static ArrayList<String> getLinks(final TransferSupport trans) {
return ClipboardUtils.getLinks(trans.getTransferable());
}
public static boolean hasSupport(final DataFlavor flavor) {
if (flavor != null) {
if (ClipboardUtils.uriListFlavor != null && flavor.isMimeTypeEqual(ClipboardUtils.uriListFlavor)) { return true; }
if (ClipboardUtils.fileListFlavor != null && flavor.isMimeTypeEqual(ClipboardUtils.fileListFlavor)) { return true; }
if (ClipboardUtils.arrayListFlavor != null && flavor.isMimeTypeEqual(ClipboardUtils.arrayListFlavor)) { return true; }
}
return false;
}
public static boolean hasSupport(final TransferSupport info) {
if (info != null) {
for (final DataFlavor flavor : info.getDataFlavors()) {
if (ClipboardUtils.hasSupport(flavor)) { return true; }
}
}
return false;
}
private ClipboardUtils() {
}
}