FULL PRODUCT VERSION : java version "1.6.0-beta2" Java(TM) 2 Runtime Environment, Standard Edition (build 1.6.0-beta2-b72) Java HotSpot(TM) Client VM (build 1.6.0-beta2-b72, mixed mode, sharing) also java version "1.5.0_06" Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-b05) Java HotSpot(TM) Client VM (build 1.5.0_06-b05, mixed mode) ADDITIONAL OS VERSION INFORMATION : Microsoft Windows XP [Version 5.1.2600] Probably all other windows versions, too. A DESCRIPTION OF THE PROBLEM : When using an input stream (the default class) as transfer data copying data of "text/html" mime types is not possible at all. Java erroneously duplicates text in the native clipboard format: Version:0.9 StartHTML:-1 EndHTML:-1 StartFragment:0000000111 EndFragment:0000000332 <!--StartFragment--> Version:0.9 StartHTML:-1 EndHTML:-1 StartFragment:0000000111 EndFragment:0000000201 <!--StartFragment--> The quick <font color='#78650d'>brown</font> <b>mouse</b> jumped over the lazy <b>cat</b>.<!--EndFragment--> <!--EndFragment--> This issue is described in more detail on http://www.peterbuettner.de/develop/javasnippets/clipHtml/index.html STEPS TO FOLLOW TO REPRODUCE THE PROBLEM : Execute the code below to fill the clipboard. Try to paste in OpenOffice 2.0 Writer. Notice the error message "Requested clipboard format is not available". Try to paste in MS Word 2003. The following text is inserted: "Version:0.9 StartHTML:-1 EndHTML:-1 StartFragment:0000000111 EndFragment:0000000201 The quick brown mouse jumped over the lazy cat." EXPECTED VERSUS ACTUAL BEHAVIOR : EXPECTED - In both OpenOffice Writer and MS Word (and any other word processor capable of dealing with html type) the formatted text should be inserted. REPRODUCIBILITY : This bug can be reproduced always. ---------- BEGIN SOURCE ---------- import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.*; import java.io.IOException; import java.io.InputStream; import java.io.ByteArrayInputStream; public class HtmlStreamCopy { public static void main(String[] args) throws ClassNotFoundException { String htmlText = "The quick <font color='#78650d'>brown</font> <b>mouse</b> jumped over the lazy <b>cat</b>."; Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); Transferable htmlTransferable = new HtmlStreamCopy.HtmlInputStreamTransferable(htmlText); clipboard.setContents(htmlTransferable, null); } private static class HtmlInputStreamTransferable implements Transferable { private final DataFlavor _htmlDataFlavor; private final String _htmlText; public HtmlInputStreamTransferable(String htmlText) throws ClassNotFoundException { _htmlText = htmlText; _htmlDataFlavor = new DataFlavor("text/html"); } public DataFlavor[] getTransferDataFlavors() { return new DataFlavor[]{_htmlDataFlavor}; } public boolean isDataFlavorSupported(DataFlavor flavor) { return "text/html".equals(flavor.getMimeType()); } public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { InputStream stringStream = new ByteArrayInputStream(_htmlText.getBytes("utf-8")); return stringStream; } } } ---------- END SOURCE ---------- CUSTOMER SUBMITTED WORKAROUND : Use a string instead of an input stream as transfer object.
|