changeset 1887:bea843af3422 default tip

swing
author Franklin Schmidt <fschmidt@gmail.com>
date Wed, 09 Apr 2025 11:43:08 -0600
parents 03a8924fe9bc
children
files src/luan/modules/swing/Component.luan src/luan/modules/swing/Frame.luan src/luan/modules/swing/Label.luan src/luan/modules/swing/Scroll_pane.luan src/luan/modules/swing/Text_area.luan src/luan/modules/swing/examples/hello_world.luan
diffstat 6 files changed, 62 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/src/luan/modules/swing/Component.luan	Wed Apr 09 08:56:54 2025 -0600
+++ b/src/luan/modules/swing/Component.luan	Wed Apr 09 11:43:08 2025 -0600
@@ -45,7 +45,7 @@
 local function construct(component,props)
 	check_not_nil(props)
 	local jcomponent = component.java
-	jcomponent.putClientProperty("luan",component)  -- don't gc
+	jcomponent.putClientProperty("luan",component)
 	local layout = delete(props,"layout")
 	if layout~=nil then
 		if type(layout) == "function" then
@@ -53,8 +53,18 @@
 		end
 		jcomponent.setLayout(layout)
 	end
+	local function set_font(font)
+		if type(font) == "table" then
+			font = get_font(font)
+		end
+		jcomponent.setFont(font)
+	end
+	local font = delete(props,"font")
+	if font~=nil then set_font(font) end
 	local border = delete(props,"border")
 	if border~=nil then jcomponent.setBorder(border) end
+	local foreground_color = delete(props,"foreground_color")
+	if foreground_color~=nil then jcomponent.setForeground(foreground_color) end
 	local children = delete(props,"children")
 	if children~=nil then
 		for _, child in ipairs(children) do
@@ -62,12 +72,7 @@
 		end
 	end
 	component.request_focus_in_window = jcomponent.requestFocusInWindow
-	function component.set_font(font)
-		if type(font) == "table" then
-			font = get_font(font)
-		end
-		jcomponent.setFont(font)
-	end
+	component.set_font = set_font
 	component._dont_gc = {}
 	function component.dont_gc(obj)
 		component._dont_gc[obj] = true
--- a/src/luan/modules/swing/Frame.luan	Wed Apr 09 08:56:54 2025 -0600
+++ b/src/luan/modules/swing/Frame.luan	Wed Apr 09 11:43:08 2025 -0600
@@ -6,6 +6,9 @@
 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 check_not_nil = Utils.check_not_nil or error()
 require "java"
 local JFrame = require "java:javax.swing.JFrame"
 local FileDialog = require "java:java.awt.FileDialog"
@@ -89,10 +92,14 @@
 	return file_chooser
 end
 
-function Frame.new()
+function Frame.new(props)
+	check_not_nil(props)
 	local jframe = JFrame.new()
+	jframe.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
 	local frame = { java = jframe }
-	jframe.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
+	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
--- a/src/luan/modules/swing/Label.luan	Wed Apr 09 08:56:54 2025 -0600
+++ b/src/luan/modules/swing/Label.luan	Wed Apr 09 11:43:08 2025 -0600
@@ -3,8 +3,10 @@
 local set_metatable = Luan.set_metatable or error()
 local Utils = require "luan:swing/Utils.luan"
 local make_metatable = Utils.make_metatable or error()
+local delete = Utils.delete or error()
+local check_empty = Utils.check_empty or error()
 local Component = require "luan:swing/Component.luan"
-local super = Component.construct or error()
+local super_construct = Component.construct or error()
 require "java"
 local JLabel = require "java:javax.swing.JLabel"
 
@@ -13,10 +15,13 @@
 
 local mt = make_metatable(Component)
 
-function Label.new(text)
-	local jlabel = JLabel.new(text)
+function Label.new(props)
+	local jlabel = JLabel.new()
 	local label = { java = jlabel }
-	super(label)
+	super_construct(label,props)
+	local text = delete(props,"text")
+	if text~=nil then jlabel.setText(text) end
+	check_empty(props)
 	set_metatable(label,mt)
 	return label
 end
--- a/src/luan/modules/swing/Scroll_pane.luan	Wed Apr 09 08:56:54 2025 -0600
+++ b/src/luan/modules/swing/Scroll_pane.luan	Wed Apr 09 11:43:08 2025 -0600
@@ -20,6 +20,8 @@
 	local jscroll_pane = JScrollPane.new(view.java)
 	local scroll_pane = { java = jscroll_pane }
 	super_construct(scroll_pane,props)
+	local row_header_view = delete(props,"row_header_view")
+	if row_header_view~=nil then jscroll_pane.setRowHeaderView(row_header_view.java) end
 	check_empty(props)
 	function scroll_pane.set_row_header_view(view)
 		jscroll_pane.setRowHeaderView(view.java)
--- a/src/luan/modules/swing/Text_area.luan	Wed Apr 09 08:56:54 2025 -0600
+++ b/src/luan/modules/swing/Text_area.luan	Wed Apr 09 11:43:08 2025 -0600
@@ -4,6 +4,7 @@
 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 Text_component = require("luan:swing/Text_component.luan")
 local super__index = Text_component.__index or error()
@@ -71,6 +72,16 @@
 	local jtext_area = TextAreaLuan.new()
 	local text_area = { java = jtext_area }
 	super_construct(text_area,props)
+	local rows = delete(props,"rows")
+	if rows~=nil then jtext_area.setRows(rows) end
+	local columns = delete(props,"columns")
+	if columns~=nil then jtext_area.setColumns(columns) end
+	local wrap_style_word = delete(props,"wrap_style_word")
+	if wrap_style_word~=nil then jtext_area.setWrapStyleWord(wrap_style_word) end
+	local line_wrap = delete(props,"line_wrap")
+	if line_wrap~=nil then jtext_area.setLineWrap(line_wrap) end
+	local tab_size = delete(props,"tab_size")
+	if tab_size~=nil then jtext_area.setTabSize(tab_size) end
 	check_empty(props)
 	text_area.show_whitespace = jtext_area.showWhitespace
 	function text_area.get_line_from_position(pos)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/luan/modules/swing/examples/hello_world.luan	Wed Apr 09 11:43:08 2025 -0600
@@ -0,0 +1,19 @@
+local Luan = require "luan:Luan.luan"
+local error = Luan.error
+local Swing = require "luan:swing/Swing.luan"
+local new_frame = require("luan:swing/Frame.luan").new or error()
+local new_label = require("luan:swing/Label.luan").new or error()
+local Border = require "luan:swing/Border.luan"
+local create_empty_border = Border.create_empty_border or error()
+
+
+Swing.run(function()
+	local frame = new_frame{
+		content_pane = new_label{
+			text = "Hello World"
+			border = create_empty_border(8,8,8,8)
+		}
+	}
+	frame.pack()
+	frame.visible = true
+end)