changeset 1980:2662ff07a6c8

drop files
author Franklin Schmidt <fschmidt@gmail.com>
date Fri, 27 Jun 2025 17:51:16 -0600
parents f2a2f3246426
children ad312de2a30e
files src/luan/modules/swing/Component.luan src/luan/modules/swing/ListLuan.java src/luan/modules/swing/SwingLuan.java src/luan/modules/swing/TransferHandlerLuan.java
diffstat 4 files changed, 80 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
diff -r f2a2f3246426 -r 2662ff07a6c8 src/luan/modules/swing/Component.luan
--- a/src/luan/modules/swing/Component.luan	Thu Jun 26 23:12:52 2025 -0600
+++ b/src/luan/modules/swing/Component.luan	Fri Jun 27 17:51:16 2025 -0600
@@ -3,6 +3,10 @@
 local type = Luan.type or error()
 local set_metatable = Luan.set_metatable or error()
 local ipairs = Luan.ipairs or error()
+local Table = require "luan:Table.luan"
+local java_to_table_shallow = Table.java_to_table_shallow or error()
+local Io = require "luan:Io.luan"
+local new_file = Io.schemes.file or error()
 local Utils = require "luan:swing/Utils.luan"
 local fail = Utils.fail or error()
 local make_metatable = Utils.make_metatable or error()
@@ -13,10 +17,13 @@
 local super__new_index = Awt_container.__new_index or error()
 local super_construct = Awt_container.construct or error()
 require "java"
+local LinkedHashMap = require "java:java.util.LinkedHashMap"
+local DataFlavor = require "java:java.awt.datatransfer.DataFlavor"
 local JComponent = require "java:javax.swing.JComponent"
 local JPanel = require "java:javax.swing.JPanel"
 local SwingLuan = require "java:luan.modules.swing.SwingLuan"
 local scrollIntoViewVertically = SwingLuan.scrollIntoViewVertically
+local TransferHandlerLuan = require "java:luan.modules.swing.TransferHandlerLuan"
 local Logging = require "luan:logging/Logging.luan"
 local logger = Logging.logger "swing/Component"
 
@@ -94,6 +101,23 @@
 			jcomponent.add(child.java,child.constraints)
 		end
 	end
+	local on_drop = remove(props,"on_drop")
+	if on_drop~=nil then
+		local map = LinkedHashMap.new()
+		local files_fn = remove(on_drop,"files")
+		if files_fn ~= nil then
+			map.put( DataFlavor.javaFileListFlavor, function(data)
+				data = java_to_table_shallow(data)
+				local files = {}
+				for _, file in ipairs(data) do
+					files[#files+1] = new_file(file)
+				end
+				files_fn(files)
+			end )
+		end
+		check_empty(on_drop)
+		jcomponent.setTransferHandler( TransferHandlerLuan.new(map) )
+	end
 	component._dont_gc = {}
 	function component.dont_gc(obj)
 		component._dont_gc[obj] = true
diff -r f2a2f3246426 -r 2662ff07a6c8 src/luan/modules/swing/ListLuan.java
--- a/src/luan/modules/swing/ListLuan.java	Thu Jun 26 23:12:52 2025 -0600
+++ b/src/luan/modules/swing/ListLuan.java	Fri Jun 27 17:51:16 2025 -0600
@@ -83,7 +83,7 @@
 		}
 
 		@Override public boolean importData(TransferSupport info) {
-			if (!canImport(info)) return false;
+			if( !canImport(info) )  return false;
 
 			JList.DropLocation dl = (JList.DropLocation) info.getDropLocation();
 			int dropIndex = dl.getIndex();
diff -r f2a2f3246426 -r 2662ff07a6c8 src/luan/modules/swing/SwingLuan.java
--- a/src/luan/modules/swing/SwingLuan.java	Thu Jun 26 23:12:52 2025 -0600
+++ b/src/luan/modules/swing/SwingLuan.java	Fri Jun 27 17:51:16 2025 -0600
@@ -51,7 +51,7 @@
 		return luan;
 	}
 
-	static void exception(LuanException e) {
+	public static void exception(LuanException e) {
 		System.err.println(e.getLuanStackTraceString());
 		System.exit(1);
 	}
diff -r f2a2f3246426 -r 2662ff07a6c8 src/luan/modules/swing/TransferHandlerLuan.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/luan/modules/swing/TransferHandlerLuan.java	Fri Jun 27 17:51:16 2025 -0600
@@ -0,0 +1,54 @@
+package luan.modules.swing;
+
+import java.io.IOException;
+import java.util.Map;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.UnsupportedFlavorException;
+import javax.swing.TransferHandler;
+import goodjava.logging.Logger;
+import goodjava.logging.LoggerFactory;
+import luan.LuanFunction;
+import luan.LuanException;
+
+
+public class TransferHandlerLuan extends TransferHandler {
+	private static final Logger logger = LoggerFactory.getLogger(TransferHandlerLuan.class);
+
+	private final Map<DataFlavor,LuanFunction> flavorMap;
+
+	public TransferHandlerLuan(Map<DataFlavor,LuanFunction> flavorMap) {
+		this.flavorMap = flavorMap;
+	}
+
+	private Map.Entry<DataFlavor,LuanFunction> getEntry(TransferSupport ts) {
+		for( Map.Entry<DataFlavor,LuanFunction> entry : flavorMap.entrySet() ) {
+			if( ts.isDataFlavorSupported(entry.getKey()) )
+				return entry;
+		}
+		return null;
+	}
+
+	@Override public boolean canImport(TransferSupport ts) {
+		//logger.info("canImport");
+		return getEntry(ts) != null;
+	}
+
+	@Override public boolean importData(TransferSupport ts) {
+		Map.Entry<DataFlavor,LuanFunction> entry = getEntry(ts);
+		if( entry == null )  return false;
+		//logger.info("importData");
+		DataFlavor df = entry.getKey();
+		LuanFunction fn = entry.getValue();
+		try {
+			Object data = ts.getTransferable().getTransferData(df);
+			fn.call(SwingLuan.luan(),data);
+		} catch(UnsupportedFlavorException e) {
+			throw new RuntimeException(e);
+		} catch(IOException e) {
+			throw new RuntimeException(e);
+		} catch(LuanException e) {
+			SwingLuan.exception(e);
+		}
+		return true;
+	}
+}