package com.josesamuel.logviewer.log.dnd; import com.intellij.ide.dnd.*; import javax.swing.*; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.io.File; import java.util.List; /** * Sets up drag and drop handling */ public class DnDHandler { private DnDTargetChecker dnDTargetChecker = event -> { if (event.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { event.setDropPossible(true); return true; } return false; }; private DnDListener dnDListener; private DnDDropHandler dropHandler = new DnDDropHandler() { @Override public void drop(DnDEvent event) { event.setDropPossible(true); try { DnDNativeTarget.EventInfo eventInfo = (DnDNativeTarget.EventInfo) event.getTransferData(DataFlavor.javaFileListFlavor); Transferable transferable = eventInfo.getTransferable(); List data = (List) transferable.getTransferData(DataFlavor.javaFileListFlavor); for (Object aData : data) { dnDListener.onFileDropped((File) aData); break; } } catch (Exception ignored) { } } }; public DnDHandler(DnDListener dnDListener) { this.dnDListener = dnDListener; } /** * Adds the DND support for the editor components */ public void addDndSupportForComponent(JComponent component) { addDndSupport(component); int size = component.getComponentCount(); for (int i = 0; i < size; i++) { if (component.getComponent(i) instanceof JComponent) { addDndSupportForComponent((JComponent) component.getComponent(i)); } } } /** * Add DND support to this component */ private void addDndSupport(JComponent component) { DnDSupport.createBuilder(component) .setDropHandler(dropHandler) .setTargetChecker(dnDTargetChecker) .enableAsNativeTarget() .install(); } }