package info.opencards.ui;
import info.opencards.CardFileBackend;
import info.opencards.OpenCards;
import info.opencards.core.CardFileCache;
import info.opencards.core.categories.Category;
import info.opencards.core.categories.CategoryUtils;
import javax.swing.*;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetAdapter;
import java.awt.dnd.DropTargetDropEvent;
import java.io.File;
import java.util.List;
/**
* Enables dropping of file into the OC window, which will register them to the currently selected category.
*
* @author Holger Brandl
*/
public class CardSetDndHandler extends DropTargetAdapter {
DropTarget dt;
public static void main(String[] args) {
// dt = new DropTarget(ta, this);
}
public void drop(DropTargetDropEvent dtde) {
try {
Transferable tr = dtde.getTransferable();
DataFlavor[] flavors = tr.getTransferDataFlavors();
for (DataFlavor flavor : flavors) {
// Check for file lists specifically
if (flavor.isFlavorJavaFileListType()) {
// Great! Accept copy drops...
dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
// And add the list of file names to our text area
boolean invalidDrop = false;
List<File> droppedFiles = (List<File>) tr.getTransferData(flavor);
for (File file : droppedFiles) {
if (CardFileBackend.hasSupportedExtension(file)) {
Category curCat = CategoryUtils.getSelectedCategory();
curCat.registerCardSet(CardFileCache.getCardFile(file));
} else {
invalidDrop = true;
}
}
if (invalidDrop) {
Runnable task2 = () -> {
JOptionPane.showMessageDialog(OpenCards.getInstance(),
"Just PowerPoint (ppt) and MarkDown (md) are supported as flashcard-sets by OpenCards",
"Invalid file format of dropped file",
JOptionPane.WARNING_MESSAGE)
;
};
// start the thread
new Thread(task2).start();
}
// If we made it this far, everything worked.
dtde.dropComplete(true);
return;
}
}
// Hmm, the user must not have dropped a file list
System.out.println("Drop failed: " + dtde);
dtde.rejectDrop();
} catch (Exception e) {
e.printStackTrace();
dtde.rejectDrop();
}
}
}