changeset 1937:d44659709959

swing
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 15 May 2025 19:12:05 -0600
parents d79482fa202f
children bd00b36380d9
files src/luan/modules/swing/Frame.luan src/luan/modules/swing/SwingLuan.java
diffstat 2 files changed, 44 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/luan/modules/swing/Frame.luan	Thu May 15 16:23:14 2025 -0600
+++ b/src/luan/modules/swing/Frame.luan	Thu May 15 19:12:05 2025 -0600
@@ -1,11 +1,13 @@
 local Luan = require "luan:Luan.luan"
 local error = Luan.error
 local set_metatable = Luan.set_metatable or error()
+local ipairs = Luan.ipairs or error()
 local Utils = require "luan:swing/Utils.luan"
 local fail = Utils.fail or error()
 local make_metatable = Utils.make_metatable or error()
 local delete = Utils.delete or error()
 local check_empty = Utils.check_empty or error()
+local to_dimension = Utils.to_dimension or error()
 local Awt_container = require "luan:swing/Awt_container.luan"
 local super__index = Awt_container.__index or error()
 local super__new_index = Awt_container.__new_index or error()
@@ -14,6 +16,7 @@
 local JFrame = require "java:javax.swing.JFrame"
 local SwingLuan = require "java:luan.modules.swing.SwingLuan"
 local newCloseListener = SwingLuan.newCloseListener
+local newWindowFocusListener = SwingLuan.newWindowFocusListener
 local Logging = require "luan:logging/Logging.luan"
 local logger = Logging.logger "swing/Frame"
 
@@ -24,8 +27,9 @@
 function Frame.__index(frame,key)
 	local rtn = super__index(frame,key)
 	if rtn ~= fail then return rtn end
+	local jframe = frame.java
 	if key == "title" then
-		return frame.java.getTitle()
+		return jframe.getTitle()
 	end
 	return fail
 end
@@ -33,12 +37,17 @@
 function Frame.__new_index(frame,key,value)
 	local rtn = super__new_index(frame,key,value)
 	if rtn ~= fail then return end
+	local jframe = frame.java
 	if key == "visible" then
-		frame.java.setVisible(value)
+		jframe.setVisible(value)
 		return
 	end
 	if key == "title" then
-		frame.java.setTitle(value)
+		jframe.setTitle(value)
+		return
+	end
+	if key == "size" then
+		jframe.setSize(to_dimension(value))
 		return
 	end
 	return fail
@@ -46,17 +55,18 @@
 
 local mt = make_metatable(Frame)
 
-function Frame.new(props)
-	local jframe = JFrame.new()
-	jframe.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
-	local frame = { java = jframe }
+local function new2(frame,props)
 	super_construct(frame,props)
+	local jframe = frame.java
 	local content_pane = delete(props,"content_pane")
 	if content_pane~=nil then jframe.setContentPane(content_pane.java) end
 	check_empty(props)
 	function frame.add_close_listener(close_listener)
 		jframe.addWindowListener(newCloseListener(close_listener))
 	end
+	function frame.add_window_focus_listener(window_focus_listener)
+		jframe.addWindowFocusListener(newWindowFocusListener(window_focus_listener))
+	end
 	function frame.set_menu_bar(menu_bar)
 		jframe.setJMenuBar(menu_bar.java)
 	end
@@ -65,4 +75,19 @@
 	return frame
 end
 
+function Frame.new(props)
+	local jframe = JFrame.new()
+	jframe.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
+	return new2( {java=jframe}, props )
+end
+
+function Frame.get_all_frames()
+	local all = {}
+	local no_props = {}
+	for _, jframe in ipairs{JFrame.getFrames()} do
+		all[#all+1] = new2( {java=jframe}, no_props )
+	end
+	return all
+end
+
 return Frame
--- a/src/luan/modules/swing/SwingLuan.java	Thu May 15 16:23:14 2025 -0600
+++ b/src/luan/modules/swing/SwingLuan.java	Thu May 15 19:12:05 2025 -0600
@@ -100,6 +100,18 @@
 		};
 	}
 
+	public static WindowListener newWindowFocusListener(final Luan luan,LuanFunction fn) {
+		return new WindowAdapter() {
+			@Override public void windowGainedFocus(WindowEvent event) {
+				try {
+					fn.call(luan);
+				} catch(LuanException e) {
+					exception(e);
+				}
+			}
+		};
+	}
+
 	public static ComponentListener newResizeListener(final Luan luan,LuanFunction fn) {
 		return new ComponentAdapter() {
 			@Override public void componentResized(ComponentEvent event) {