Tarferi icon

About pasting emoji into HTML text fields

Tarferi | PRO | 02/11/19 10:34:24 AM UTC | 0 ⭐ | 835 👁️ | Never ⏰ | []
Java |

3.37 KB

|

None

|

0 👍

/

0 👎

private void setupFilter() {
        final TransferHandler originalHandler = getTransferHandler();
        setTransferHandler(new TransferHandler() {
 
            @Override
            public boolean canImport(JComponent comp, DataFlavor[] transferFlavors) {
                return originalHandler.canImport(comp, transferFlavors);
            }
 
            @Override
            public boolean canImport(TransferHandler.TransferSupport support) {
                return originalHandler.canImport(support);
            }
 
            @Override
            public void exportAsDrag(JComponent comp, InputEvent e, int action) {
                originalHandler.exportAsDrag(comp, e, action);
            }
 
            @Override
            public void exportToClipboard(JComponent comp, Clipboard clip, int action) {
                originalHandler.exportToClipboard(comp, clip, action);
            }
 
            @Override
            public Image getDragImage() {
                return originalHandler.getDragImage();
            }
 
            @Override
            public Point getDragImageOffset() {
                return originalHandler.getDragImageOffset();
            }
 
            @Override
            public int getSourceActions(JComponent c) {
                return originalHandler.getSourceActions(c);
            }
 
            @Override
            public Icon getVisualRepresentation(Transferable t) {
                return originalHandler.getVisualRepresentation(t);
            }
 
            @Override
            public boolean importData(JComponent comp, Transferable t) {
                return originalHandler.importData(comp, t);
            }
 
            @Override
            public boolean importData(TransferHandler.TransferSupport support) {
                Transferable t = support.getTransferable();
                if (t.isDataFlavorSupported(DataFlavor.getTextPlainUnicodeFlavor())) { // This is good
                    String data;
                    if (t.isDataFlavorSupported(DataFlavor.allHtmlFlavor)) { // Strip this
                        try {
                            data = (String) t.getTransferData(DataFlavor.allHtmlFlavor);
                            if (data.contains("<body>")) {
                                data = data.replaceAll("\r", "").replaceAll("\n", "<br />").replaceAll("(.*<body>)(.*)(</body>.*)", "$2");
                            }
                            data = data.replaceAll("(<[^>]*>)", "");
                        } catch (UnsupportedFlavorException | IOException e) {
                            return false;
                        }
                    } else { // Raw text
                        try {
                            InputStream inputStream = (InputStream) t.getTransferData(DataFlavor.getTextPlainUnicodeFlavor());
                            StringBuilder sb = new StringBuilder();
                            while (true) {
                                int r = inputStream.read();
                                if (r < 0) {
                                    break;
                                } else {
                                    sb.append((char) r);
                                    inputStream.read();
                                }
                            }
                            data = sb.toString();
                        } catch (UnsupportedFlavorException | IOException e) {
                            return false;
                        }
                    }
                    data = EmojiParser.parseToHtmlHexadecimal(data);
                    try {
                        getDocument().insertString(getCaretPosition(), data, null);
                        return true;
                    } catch (BadLocationException e) {
                        return false;
                    }
                }
                return false;
            }
 
            @Override
            public void setDragImage(Image img) {
                originalHandler.setDragImage(img);
            }
 
            @Override
            public void setDragImageOffset(Point p) {
                originalHandler.setDragImageOffset(p);
            }
        });
        StyledDocument styledDoc = getStyledDocument();
        if (styledDoc instanceof AbstractDocument) {
            AbstractDocument doc = (AbstractDocument) styledDoc;
            doc.setDocumentFilter(myFilter);
        }
        Document doc = getDocument();
        if (doc instanceof AbstractDocument) {
            AbstractDocument pdoc = (AbstractDocument) doc;
            pdoc.setDocumentFilter(myFilter);
        }
    }

Comments