changeset 1862:d59d4ef5ca46 default tip

swing work
author Franklin Schmidt <fschmidt@gmail.com>
date Sun, 30 Mar 2025 13:17:27 -0600
parents 4fafcd1849d6
children
files src/luan/modules/BasicLuan.java src/luan/modules/Luan.luan src/luan/modules/swing/Component.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
diffstat 9 files changed, 196 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/src/luan/modules/BasicLuan.java	Tue Mar 25 09:26:16 2025 -0600
+++ b/src/luan/modules/BasicLuan.java	Sun Mar 30 13:17:27 2025 -0600
@@ -267,5 +267,10 @@
 		return m.isImmutable();
 	}
 
+	public static void exit(Luan luan,int status) throws LuanException {
+		Luan.checkSecurity(luan,"exit");
+		System.exit(status);
+	}
+
 	private void BasicLuan() {}  // never
 }
--- a/src/luan/modules/Luan.luan	Tue Mar 25 09:26:16 2025 -0600
+++ b/src/luan/modules/Luan.luan	Sun Mar 30 13:17:27 2025 -0600
@@ -53,6 +53,10 @@
 	Luan.arg = args
 end
 
+function Luan.exit(status)
+	BasicLuan.exit( status or 0 )
+end
+
 -- local functions
 Luan.get_local_cloned = BasicLuan.get_local_cloned
 Luan.get_local_only = BasicLuan.get_local_only
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/luan/modules/swing/Component.luan	Sun Mar 30 13:17:27 2025 -0600
@@ -0,0 +1,14 @@
+local Luan = require "luan:Luan.luan"
+local error = Luan.error
+require "java"
+
+
+local Component = {}
+
+function Component.new(java)
+	local component = { java = java }
+	component.request_focus_in_window = java.requestFocusInWindow
+	return component
+end
+
+return Component
--- a/src/luan/modules/swing/Frame.luan	Tue Mar 25 09:26:16 2025 -0600
+++ b/src/luan/modules/swing/Frame.luan	Sun Mar 30 13:17:27 2025 -0600
@@ -3,6 +3,8 @@
 local set_metatable = Luan.set_metatable or error()
 require "java"
 local JFrame = require "java:javax.swing.JFrame"
+local SwingLuan = require "java:luan.modules.swing.SwingLuan"
+local newCloseListener = SwingLuan.newCloseListener
 
 
 local Frame = {}
@@ -13,6 +15,9 @@
 	if key == "visible" then
 		return frame.java.isVisible()
 	end
+	if key == "title" then
+		return frame.java.getTitle()
+	end
 	error("'"..key.."' not defined")
 end
 
@@ -21,18 +26,26 @@
 		frame.java.setVisible(value)
 		return
 	end
+	if key == "title" then
+		frame.java.setTitle(value)
+		return
+	end
 	error("'"..key.."' not defined")
 end
 
-function Frame.new(title)
-	local jframe = JFrame.new(title)
+function Frame.new()
+	local jframe = JFrame.new()
 	local frame = { java = jframe }
-	function frame.exit_on_close()
-		jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+	jframe.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
+	function frame.add_close_listener(close_listener)
+		jframe.addWindowListener(newCloseListener(close_listener))
 	end
 	function frame.add(component)
 		jframe.add(component.java)
 	end
+	function frame.set_menu_bar(menu_bar)
+		jframe.setJMenuBar(menu_bar.java)
+	end
 	frame.pack = jframe.pack
 	set_metatable(frame,mt)
 	return frame
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/luan/modules/swing/Menu.luan	Sun Mar 30 13:17:27 2025 -0600
@@ -0,0 +1,18 @@
+local Luan = require "luan:Luan.luan"
+local error = Luan.error
+require "java"
+local JMenu = require "java:javax.swing.JMenu"
+
+
+local Menu = {}
+
+function Menu.new(text)
+	local jmenu = JMenu.new(text)
+	local menu = { java = jmenu }
+	function menu.add(menu_item)
+		jmenu.add(menu_item.java)
+	end
+	return menu
+end
+
+return Menu
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/luan/modules/swing/Menu_bar.luan	Sun Mar 30 13:17:27 2025 -0600
@@ -0,0 +1,19 @@
+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"
+
+
+local Menu_bar = {}
+
+function Menu_bar.new()
+	local jmenu_bar = JMenuBar.new()
+	local menu_bar = { java = jmenu_bar }
+	function menu_bar.add(menu)
+		jmenu_bar.add(menu.java)
+	end
+	return menu_bar
+end
+
+return Menu_bar
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/luan/modules/swing/Menu_item.luan	Sun Mar 30 13:17:27 2025 -0600
@@ -0,0 +1,38 @@
+local Luan = require "luan:Luan.luan"
+local error = Luan.error
+local set_metatable = Luan.set_metatable or error()
+require "java"
+local JMenuItem = require "java:javax.swing.JMenuItem"
+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()
+	end
+	error("'"..key.."' not defined")
+end
+
+function mt.__new_index(frame,key,value)
+	if key == "text" then
+		frame.java.setText(value)
+		return
+	end
+	error("'"..key.."' not defined")
+end
+
+function Menu_item.new()
+	local jmenu_item = JMenuItem.new()
+	local menu_item = { java = jmenu_item }
+	function menu_item.add_action_listener(action_listener)
+		jmenu_item.addActionListener(newActionListener(action_listener))
+	end
+	set_metatable(menu_item,mt)
+	return menu_item
+end
+
+return Menu_item
--- a/src/luan/modules/swing/SwingLuan.java	Tue Mar 25 09:26:16 2025 -0600
+++ b/src/luan/modules/swing/SwingLuan.java	Sun Mar 30 13:17:27 2025 -0600
@@ -1,9 +1,16 @@
 package luan.modules.swing;
 
 import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.UnsupportedLookAndFeelException;
+import java.awt.event.ActionListener;
+import java.awt.event.ActionEvent;
+import java.awt.event.WindowListener;
+import java.awt.event.WindowEvent;
+import java.awt.event.WindowAdapter;
 import luan.Luan;
 import luan.LuanFunction;
-import luan.LuanMutable;
+//import luan.LuanMutable;
 import luan.LuanException;
 
 
@@ -22,8 +29,53 @@
 	}
 
 	public static void run(Luan luan,LuanFunction fn) /*throws LuanException*/ {
-		luan = new Luan(luan);
-		LuanMutable.makeImmutable(fn);
+		//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));
 	}
+
+	public static ActionListener newActionListener(final Luan luan,LuanFunction fn) {
+		return new ActionListener() {
+			private void call() {
+				try {
+					fn.call(luan);
+				} catch(LuanException e) {
+					e.printStackTrace();
+				}
+			}
+			@Override public void actionPerformed(ActionEvent e) {
+				call();
+			}
+		};
+	}
+
+	public static WindowListener newCloseListener(final Luan luan,LuanFunction fn) {
+		return new WindowAdapter() {
+			private void call() {
+				try {
+					fn.call(luan);
+				} catch(LuanException e) {
+					e.printStackTrace();
+				}
+			}
+			@Override public void windowClosed(WindowEvent e) {
+				call();
+			}
+		};
+	}
 }
--- a/src/luan/modules/swing/Text_area.luan	Tue Mar 25 09:26:16 2025 -0600
+++ b/src/luan/modules/swing/Text_area.luan	Sun Mar 30 13:17:27 2025 -0600
@@ -2,7 +2,8 @@
 local error = Luan.error
 local set_metatable = Luan.set_metatable or error()
 local type = Luan.type or error()
-local Font = require "luan:swing/Font.luan"
+local get_font = require("luan:swing/Font.luan").get or error()
+local new_component = require("luan:swing/Component.luan").new or error()
 require "java"
 local JTextArea = require "java:javax.swing.JTextArea"
 
@@ -21,6 +22,15 @@
 	if key == "tab_size" then
 		return text_area.java.getTabSize()
 	end
+	if key == "rows" then
+		return text_area.java.getRows()
+	end
+	if key == "columns" then
+		return text_area.java.getColumns()
+	end
+	if key == "line_count" then
+		return text_area.java.getLineCount()
+	end
 	error("'"..key.."' not defined")
 end
 
@@ -37,19 +47,26 @@
 		text_area.java.setTabSize(value)
 		return
 	end
-	if key == "font" then
-		if type(value) == "table" then
-			value = Font.get(value)
-		end
-		text_area.java.setFont(value)
+	if key == "rows" then
+		text_area.java.setRows(value)
+		return
+	end
+	if key == "columns" then
+		text_area.java.setColumns(value)
 		return
 	end
 	error("'"..key.."' not defined")
 end
 
-function Text_area.new(rows,columns)
-	local jtext_area = JTextArea.new(rows,columns)
-	local text_area = { java = jtext_area }
+function Text_area.new()
+	local jtext_area = JTextArea.new()
+	local text_area = new_component(jtext_area)
+	function text_area.set_font(font)
+		if type(font) == "table" then
+			font = get_font(font)
+		end
+		jtext_area.setFont(font)
+	end
 	set_metatable(text_area,mt)
 	return text_area
 end