changeset 1863:928e73bfe7ea default tip

swing work
author Franklin Schmidt <fschmidt@gmail.com>
date Mon, 31 Mar 2025 13:46:47 -0600
parents d59d4ef5ca46
children
files src/luan/modules/IoLuan.java src/luan/modules/swing/Abstract_button.luan src/luan/modules/swing/Frame.luan src/luan/modules/swing/Menu.luan src/luan/modules/swing/Menu_bar.luan src/luan/modules/swing/Menu_item.luan src/luan/modules/swing/SwingLuan.java src/luan/modules/swing/Text_area.luan src/luan/modules/swing/Text_component.luan src/luan/modules/swing/Utils.luan
diffstat 10 files changed, 228 insertions(+), 43 deletions(-) [+]
line wrap: on
line diff
--- a/src/luan/modules/IoLuan.java	Sun Mar 30 13:17:27 2025 -0600
+++ b/src/luan/modules/IoLuan.java	Mon Mar 31 13:46:47 2025 -0600
@@ -393,7 +393,7 @@
 			this(luan,new File(path));
 		}
 
-		private LuanFile(Luan luan,File file) throws LuanException {
+		public LuanFile(Luan luan,File file) throws LuanException {
 			this(file);
 			check(luan,"file:"+file.toString());
 		}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/luan/modules/swing/Abstract_button.luan	Mon Mar 31 13:46:47 2025 -0600
@@ -0,0 +1,25 @@
+local Luan = require "luan:Luan.luan"
+local error = Luan.error
+local Utils = require "luan:swing/Utils.luan"
+local fail = Utils.fail or error()
+require "java"
+
+
+local Abstract_button = {}
+
+function Abstract_button.__index(abstract_button,key)
+	if key == "text" then
+		return abstract_button.java.getText()
+	end
+	return fail
+end
+
+function Abstract_button.__new_index(abstract_button,key,value)
+	if key == "text" then
+		abstract_button.java.setText(value)
+		return
+	end
+	return fail
+end
+
+return Abstract_button
--- a/src/luan/modules/swing/Frame.luan	Sun Mar 30 13:17:27 2025 -0600
+++ b/src/luan/modules/swing/Frame.luan	Mon Mar 31 13:46:47 2025 -0600
@@ -1,27 +1,34 @@
 local Luan = require "luan:Luan.luan"
 local error = Luan.error
 local set_metatable = Luan.set_metatable 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()
 require "java"
 local JFrame = require "java:javax.swing.JFrame"
+local FileDialog = require "java:java.awt.FileDialog"
 local SwingLuan = require "java:luan.modules.swing.SwingLuan"
 local newCloseListener = SwingLuan.newCloseListener
+local Logging = require "luan:logging/Logging.luan"
+local logger = Logging.logger "swing/Frame"
+
 
 
 local Frame = {}
 
-local mt = {}
-
-function mt.__index(frame,key)
+function Frame.__index(frame,key)
 	if key == "visible" then
 		return frame.java.isVisible()
 	end
 	if key == "title" then
 		return frame.java.getTitle()
 	end
-	error("'"..key.."' not defined")
+	return fail
 end
 
-function mt.__new_index(frame,key,value)
+function Frame.__new_index(frame,key,value)
 	if key == "visible" then
 		frame.java.setVisible(value)
 		return
@@ -30,7 +37,56 @@
 		frame.java.setTitle(value)
 		return
 	end
-	error("'"..key.."' not defined")
+	return fail
+end
+
+local mt = make_metatable(Frame)
+
+local File_chooser = {}
+
+function File_chooser.__index(file_chooser,key)
+	if key == "file" then
+		local file_dialog = file_chooser.java
+		local file = file_dialog.getFile()
+		if file == nil then
+			return nil
+		end
+		local dir = file_dialog.getDirectory()
+		return file and new_file(dir..file)
+	end
+	if key == "directory" then
+		local dir = file_chooser.java.getDirectory()
+		return new_file(dir)
+	end
+	if key == "visible" then
+		return file_chooser.java.isVisible()
+	end
+	return fail
+end
+
+function File_chooser.__new_index(file_chooser,key,value)
+	if key == "file" then
+		file_chooser.java.setFile(value.to_string())
+		return
+	end
+	if key == "directory" then
+		file_chooser.java.setDirectory(value.to_string())
+		return
+	end
+	if key == "visible" then
+		file_chooser.java.setVisible(value)
+		return
+	end
+	return fail
+end
+
+local mt_fc = make_metatable(File_chooser)
+
+local function new_file_chooser(jframe)
+	local file_dialog = FileDialog.new(jframe)
+	local file_chooser = { java = file_dialog }
+	set_metatable(file_chooser,mt_fc)
+	return file_chooser
 end
 
 function Frame.new()
@@ -46,6 +102,15 @@
 	function frame.set_menu_bar(menu_bar)
 		jframe.setJMenuBar(menu_bar.java)
 	end
+	local file_chooser
+	local function get_file_chooser(mode)
+		file_chooser = file_chooser or new_file_chooser(jframe)
+		file_chooser.java.setMode(mode)
+		return file_chooser
+	end
+	function frame.file_chooser_load()
+		return get_file_chooser(FileDialog.LOAD)
+	end
 	frame.pack = jframe.pack
 	set_metatable(frame,mt)
 	return frame
--- a/src/luan/modules/swing/Menu.luan	Sun Mar 30 13:17:27 2025 -0600
+++ b/src/luan/modules/swing/Menu.luan	Mon Mar 31 13:46:47 2025 -0600
@@ -1,17 +1,26 @@
 local Luan = require "luan:Luan.luan"
 local error = Luan.error
+local set_metatable = Luan.set_metatable or error()
+local Utils = require "luan:swing/Utils.luan"
+local make_metatable = Utils.make_metatable or error()
+local Abstract_button = require "luan:swing/Abstract_button.luan"
 require "java"
 local JMenu = require "java:javax.swing.JMenu"
 
 
 local Menu = {}
 
-function Menu.new(text)
-	local jmenu = JMenu.new(text)
+Menu.__index = Abstract_button.__index or error()
+Menu.__new_index = Abstract_button.__new_index or error()
+local mt = make_metatable(Menu)
+
+function Menu.new()
+	local jmenu = JMenu.new()
 	local menu = { java = jmenu }
 	function menu.add(menu_item)
 		jmenu.add(menu_item.java)
 	end
+	set_metatable(menu,mt)
 	return menu
 end
 
--- a/src/luan/modules/swing/Menu_bar.luan	Sun Mar 30 13:17:27 2025 -0600
+++ b/src/luan/modules/swing/Menu_bar.luan	Mon Mar 31 13:46:47 2025 -0600
@@ -1,6 +1,5 @@
 local Luan = require "luan:Luan.luan"
 local error = Luan.error
-local set_metatable = Luan.set_metatable or error()
 require "java"
 local JMenuBar = require "java:javax.swing.JMenuBar"
 
--- a/src/luan/modules/swing/Menu_item.luan	Sun Mar 30 13:17:27 2025 -0600
+++ b/src/luan/modules/swing/Menu_item.luan	Mon Mar 31 13:46:47 2025 -0600
@@ -1,30 +1,44 @@
 local Luan = require "luan:Luan.luan"
 local error = Luan.error
 local set_metatable = Luan.set_metatable or error()
+local Utils = require "luan:swing/Utils.luan"
+local fail = Utils.fail or error()
+local make_metatable = Utils.make_metatable or error()
+local Abstract_button = require "luan:swing/Abstract_button.luan"
+local super__index = Abstract_button.__index or error()
+local super__new_index = Abstract_button.__new_index or error()
 require "java"
 local JMenuItem = require "java:javax.swing.JMenuItem"
+local KeyStroke = require "java:javax.swing.KeyStroke"
+local KeyEvent = require "java:java.awt.event.KeyEvent"
+local InputEvent = require "java:java.awt.event.InputEvent"
 local SwingLuan = require "java:luan.modules.swing.SwingLuan"
 local newActionListener = SwingLuan.newActionListener
 
 local Menu_item = {}
 
-local mt = {}
-
-function mt.__index(frame,key)
-	if key == "text" then
-		return frame.java.getText()
+function Menu_item.__index(menu_item,key)
+	local rtn = super__index(menu_item,key)
+	if rtn ~= fail then return rtn end
+	if key == "accelerator" then
+		return menu_item.java.getAccelerator().toString()
 	end
-	error("'"..key.."' not defined")
+	return fail
 end
 
-function mt.__new_index(frame,key,value)
-	if key == "text" then
-		frame.java.setText(value)
+function Menu_item.__new_index(menu_item,key,value)
+	local rtn = super__new_index(menu_item,key,value)
+	if rtn ~= fail then return end
+	if key == "accelerator" then
+		menu_item.java.setAccelerator(KeyStroke.getKeyStroke(value))
+		--menu_item.java.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,InputEvent.META_DOWN_MASK))
 		return
 	end
-	error("'"..key.."' not defined")
+	return fail
 end
 
+local mt = make_metatable(Menu_item)
+
 function Menu_item.new()
 	local jmenu_item = JMenuItem.new()
 	local menu_item = { java = jmenu_item }
--- a/src/luan/modules/swing/SwingLuan.java	Sun Mar 30 13:17:27 2025 -0600
+++ b/src/luan/modules/swing/SwingLuan.java	Mon Mar 31 13:46:47 2025 -0600
@@ -16,6 +16,25 @@
 
 public final class SwingLuan {
 
+	static {
+		//System.setProperty("apple.awt.application.name", "MyApplication");
+		System.setProperty("apple.laf.useScreenMenuBar", "true");
+		//System.out.println(UIManager.getLookAndFeel());
+/*
+		try {
+			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
+		} catch(ClassNotFoundException e) {
+			throw new RuntimeException(e);
+		} catch(InstantiationException e) {
+			throw new RuntimeException(e);
+		} catch(IllegalAccessException e) {
+			throw new RuntimeException(e);
+		} catch(UnsupportedLookAndFeelException e) {
+			throw new RuntimeException(e);
+		}
+*/
+	}
+
 	private static Runnable runnable(final Luan luan,final LuanFunction fn) {
 		return new Runnable() {
 			public void run() {
@@ -31,21 +50,6 @@
 	public static void run(Luan luan,LuanFunction fn) /*throws LuanException*/ {
 		//luan = new Luan(luan);
 		//LuanMutable.makeImmutable(fn);
-		//System.setProperty("apple.awt.application.name", "MyApplication");
-		System.setProperty("apple.laf.useScreenMenuBar", "true");
-/*
-		try {
-			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
-		} catch(ClassNotFoundException e) {
-			throw new RuntimeException(e);
-		} catch(InstantiationException e) {
-			throw new RuntimeException(e);
-		} catch(IllegalAccessException e) {
-			throw new RuntimeException(e);
-		} catch(UnsupportedLookAndFeelException e) {
-			throw new RuntimeException(e);
-		}
-*/
 		SwingUtilities.invokeLater(runnable(luan,fn));
 	}
 
--- a/src/luan/modules/swing/Text_area.luan	Sun Mar 30 13:17:27 2025 -0600
+++ b/src/luan/modules/swing/Text_area.luan	Mon Mar 31 13:46:47 2025 -0600
@@ -2,17 +2,23 @@
 local error = Luan.error
 local set_metatable = Luan.set_metatable or error()
 local type = Luan.type or error()
+local Utils = require "luan:swing/Utils.luan"
+local fail = Utils.fail or error()
+local make_metatable = Utils.make_metatable or error()
 local get_font = require("luan:swing/Font.luan").get or error()
-local new_component = require("luan:swing/Component.luan").new or error()
+local Text_component = require("luan:swing/Text_component.luan")
+local super__index = Text_component.__index or error()
+local super__new_index = Text_component.__new_index or error()
+local new_text_component = Text_component.new or error()
 require "java"
 local JTextArea = require "java:javax.swing.JTextArea"
 
 
 local Text_area = {}
 
-local mt = {}
-
-function mt.__index(text_area,key)
+function Text_area.__index(text_area,key)
+	local rtn = super__index(text_area,key)
+	if rtn ~= fail then return rtn end
 	if key == "line_wrap" then
 		return text_area.java.getLineWrap()
 	end
@@ -31,10 +37,12 @@
 	if key == "line_count" then
 		return text_area.java.getLineCount()
 	end
-	error("'"..key.."' not defined")
+	return fail
 end
 
-function mt.__new_index(text_area,key,value)
+function Text_area.__new_index(text_area,key,value)
+	local rtn = super__new_index(text_area,key,value)
+	if rtn ~= fail then return end
 	if key == "line_wrap" then
 		text_area.java.setLineWrap(value)
 		return
@@ -55,12 +63,15 @@
 		text_area.java.setColumns(value)
 		return
 	end
-	error("'"..key.."' not defined")
+	return fail
 end
 
+local mt = make_metatable(Text_area)
+
 function Text_area.new()
 	local jtext_area = JTextArea.new()
-	local text_area = new_component(jtext_area)
+	local text_area = new_text_component(jtext_area)
+	text_area.select = jtext_area.select or error()
 	function text_area.set_font(font)
 		if type(font) == "table" then
 			font = get_font(font)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/luan/modules/swing/Text_component.luan	Mon Mar 31 13:46:47 2025 -0600
@@ -0,0 +1,28 @@
+local Luan = require "luan:Luan.luan"
+local error = Luan.error
+local Utils = require "luan:swing/Utils.luan"
+local fail = Utils.fail or error()
+local new_component = require("luan:swing/Component.luan").new or error()
+require "java"
+
+
+local Text_component = {}
+
+function Text_component.__index(text_component,key)
+	if key == "text" then
+		return text_component.java.getText()
+	end
+	return fail
+end
+
+function Text_component.__new_index(text_component,key,value)
+	if key == "text" then
+		text_component.java.setText(value)
+		return
+	end
+	return fail
+end
+
+Text_component.new = new_component
+
+return Text_component
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/luan/modules/swing/Utils.luan	Mon Mar 31 13:46:47 2025 -0600
@@ -0,0 +1,30 @@
+local Luan = require "luan:Luan.luan"
+local error = Luan.error
+
+
+local Utils = {}
+
+local fail = {}
+Utils.fail = fail
+
+function Utils.make_metatable(class)
+	local __index = class.__index or error()
+	local __new_index = class.__new_index or error()
+
+	local mt = {}
+
+	function mt.__index(t,key)
+		local rtn = __index(t,key)
+		rtn ~= fail or error("'"..key.."' not defined")
+		return rtn
+	end
+
+	function mt.__new_index(t,key,value)
+		local rtn = __new_index(t,key,value)
+		rtn ~= fail or error("'"..key.."' not defined")
+	end
+
+	return mt
+end
+
+return Utils