Mercurial Hosting > luan
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
--- 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
--- 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();
--- 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); }
--- /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; + } +}