changeset 1881:c7c7d62f8c62 default tip

swing
author Franklin Schmidt <fschmidt@gmail.com>
date Mon, 07 Apr 2025 21:14:53 -0600
parents 4852d35c52ae
children
files src/luan/modules/String.luan src/luan/modules/StringLuan.java src/luan/modules/swing/Abstract_button.luan src/luan/modules/swing/Border.luan src/luan/modules/swing/Button.luan src/luan/modules/swing/Component.luan src/luan/modules/swing/Dialog.luan src/luan/modules/swing/Label.luan src/luan/modules/swing/Layout.luan src/luan/modules/swing/List.luan src/luan/modules/swing/Menu.luan src/luan/modules/swing/Menu_item.luan src/luan/modules/swing/Scroll_pane.luan src/luan/modules/swing/SwingLuan.java src/luan/modules/swing/TextAreaLineNumbers.luan src/luan/modules/swing/Text_area_line_numbers.luan src/luan/modules/swing/Text_component.luan website/src/manual.html.luan
diffstat 18 files changed, 231 insertions(+), 56 deletions(-) [+]
line wrap: on
line diff
--- a/src/luan/modules/String.luan	Sun Apr 06 19:20:52 2025 -0600
+++ b/src/luan/modules/String.luan	Mon Apr 07 21:14:53 2025 -0600
@@ -11,6 +11,7 @@
 String.encode = StringLuan.encode
 String.ends_with = StringLuan.ends_with
 String.find = StringLuan.find
+String.find_reverse = StringLuan.find_reverse
 String.format = StringLuan.format
 String.lower = StringLuan.lower
 String.regex = Boot.regex
--- a/src/luan/modules/StringLuan.java	Sun Apr 06 19:20:52 2025 -0600
+++ b/src/luan/modules/StringLuan.java	Mon Apr 07 21:14:53 2025 -0600
@@ -93,10 +93,16 @@
 		return s.substring(start,end);
 	}
 
-	public static Object[] find(String s,String s2,Integer init) {
+	public static Integer find(String s,String s2,Integer init) {
 		int start = start(s,init,0);
 		int i = s.indexOf(s2,start);
-		return i == -1 ? null : new Integer[]{i+1,i+s2.length()};
+		return i == -1 ? null : i+1;
+	}
+
+	public static Integer find_reverse(String s,String s2,Integer init) {
+		int start = start(s,init,s.length());
+		int i = s.lastIndexOf(s2,start);
+		return i == -1 ? null : i+1;
 	}
 
 	// note - String.format() is too stupid to convert between ints and floats.
--- a/src/luan/modules/swing/Abstract_button.luan	Sun Apr 06 19:20:52 2025 -0600
+++ b/src/luan/modules/swing/Abstract_button.luan	Mon Apr 07 21:14:53 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 Utils = require "luan:swing/Utils.luan"
 local fail = Utils.fail or error()
+local make_metatable = Utils.make_metatable or error()
 local Component = require "luan:swing/Component.luan"
 local super__index = Component.__index or error()
 local super__new_index = Component.__new_index or error()
-local super = Component.new or error()
+local super = Component.construct or error()
 require "java"
 
 
@@ -30,11 +32,20 @@
 	return fail
 end
 
-function Abstract_button.new(button)
+local mt = make_metatable(Abstract_button)
+
+local function construct(button)
 	super(button)
 	local jbutton = button.java
 	button.set_enabled = jbutton.setEnabled
 	return button
 end
+Abstract_button.construct = construct
+
+function Abstract_button.new(button)
+	button = construct(button)
+	set_metatable(button,mt)
+	return button
+end
 
 return Abstract_button
--- a/src/luan/modules/swing/Border.luan	Sun Apr 06 19:20:52 2025 -0600
+++ b/src/luan/modules/swing/Border.luan	Mon Apr 07 21:14:53 2025 -0600
@@ -12,4 +12,8 @@
 	return BorderFactory.createEmptyBorder(top,left,bottom,right)
 end
 
+function Border.create_line_border(color)
+	return BorderFactory.createLineBorder(color)
+end
+
 return Border
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/luan/modules/swing/Button.luan	Mon Apr 07 21:14:53 2025 -0600
@@ -0,0 +1,19 @@
+local Luan = require "luan:Luan.luan"
+local error = Luan.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()
+local super_new = Abstract_button.new or error()
+require "java"
+local JButton = require "java:javax.swing.JButton"
+
+
+local Button = {}
+
+function Button.new(button)
+	local button = { java = JButton.new() }
+	super_new(button)
+	return button
+end
+
+return Button
--- a/src/luan/modules/swing/Component.luan	Sun Apr 06 19:20:52 2025 -0600
+++ b/src/luan/modules/swing/Component.luan	Mon Apr 07 21:14:53 2025 -0600
@@ -1,10 +1,15 @@
 local Luan = require "luan:Luan.luan"
 local error = Luan.error
 local type = Luan.type or 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 get_font = require("luan:swing/Font.luan").get or error()
 require "java"
+local JPanel = require "java:javax.swing.JPanel"
+local Logging = require "luan:logging/Logging.luan"
+local logger = Logging.logger "swing/Component"
 
 
 local Component = {}
@@ -31,7 +36,9 @@
 	return fail
 end
 
-function Component.new(component)
+local mt = make_metatable(Component)
+
+local function construct(component)
 	local jcomponent = component.java
 	jcomponent.putClientProperty("luan",component)  -- don't gc
 	component.request_focus_in_window = jcomponent.requestFocusInWindow
@@ -45,7 +52,23 @@
 	function component.dont_gc(obj)
 		component._dont_gc[obj] = true
 	end
+	component.set_layout = jcomponent.setLayout
+	function component.add(el)
+		jcomponent.add(el.java)
+	end
 	return component
 end
+Component.construct = construct
+
+local function new(component)
+	component = construct(component)
+	set_metatable(component,mt)
+	return component
+end
+Component.new = new
+
+function Component.new_panel()
+	return new{ java = JPanel.new() }
+end
 
 return Component
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/luan/modules/swing/Dialog.luan	Mon Apr 07 21:14:53 2025 -0600
@@ -0,0 +1,56 @@
+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 new_component = require("luan:swing/Component.luan").new or error()
+require "java"
+local JDialog = require "java:javax.swing.JDialog"
+local Logging = require "luan:logging/Logging.luan"
+local logger = Logging.logger "swing/Dialog"
+
+
+local Dialog = {}
+
+function Dialog.__index(dialog,key)
+	local jdialog = dialog.java
+	if key == "visible" then
+		return jdialog.isVisible()
+	end
+	if key == "component" then
+		local jcomponent = jdialog.getContentPane()
+		local component = jcomponent.getClientProperty("luan")
+		if component == nil then
+			component = new_component{java=jcomponent}
+		end
+		return component
+	end
+	return fail
+end
+
+function Dialog.__new_index(dialog,key,value)
+	local jdialog = dialog.java
+	if key == "visible" then
+		jdialog.setVisible(value)
+		return
+	end
+	return fail
+end
+
+local mt = make_metatable(Dialog)
+
+function Dialog.new(frame)
+	local jframe = frame.java
+	local jdialog = JDialog.new(jframe)
+--logger.info(jdialog.getContentPane())
+	local dialog = { java = jdialog }
+	dialog.pack = jdialog.pack
+	function dialog.move_into_owner()
+		jdialog.setLocationRelativeTo(jframe)
+	end
+	set_metatable(dialog,mt)
+	return dialog
+end
+
+return Dialog
--- a/src/luan/modules/swing/Label.luan	Sun Apr 06 19:20:52 2025 -0600
+++ b/src/luan/modules/swing/Label.luan	Mon Apr 07 21:14:53 2025 -0600
@@ -1,25 +1,22 @@
 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 Component = require "luan:swing/Component.luan"
+local super = Component.construct or error()
 require "java"
 local JLabel = require "java:javax.swing.JLabel"
 
 
 local Label = {}
 
-local mt = {}
-
-function mt.__index(label,key)
-	error("'"..key.."' not defined")
-end
-
-function mt.__new_index(label,key,value)
-	error("'"..key.."' not defined")
-end
+local mt = make_metatable(Component)
 
 function Label.new(text)
 	local jlabel = JLabel.new(text)
 	local label = { java = jlabel }
+	super(label)
 	set_metatable(label,mt)
 	return label
 end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/luan/modules/swing/Layout.luan	Mon Apr 07 21:14:53 2025 -0600
@@ -0,0 +1,38 @@
+local Luan = require "luan:Luan.luan"
+local error = Luan.error
+local Number = require "luan:Number.luan"
+local integer = Number.integer or error()
+require "java"
+local FlowLayout = require "java:java.awt.FlowLayout"
+local BoxLayout = require "java:javax.swing.BoxLayout"
+
+
+local Layout = {}
+
+local flow_layout_alignments = {
+	left = FlowLayout.LEFT
+	center = FlowLayout.CENTER
+	right = FlowLayout.RIGHT
+}
+
+function Layout.new_flow_layout(align)
+	if align == nil then
+		return FlowLayout.new()
+	else
+		align = flow_layout_alignments[align] or error "invalid align"
+		return FlowLayout.new(align)
+	end
+end
+
+local box_layout_axes = {
+	x_axis = BoxLayout.X_AXIS
+	y_axis = BoxLayout.Y_AXIS
+}
+
+function Layout.new_box_layout(target,axis)
+	axis or error "missing axis"
+	axis = box_layout_axes[axis] or error "invalid axis"
+	return BoxLayout.new(target.java,axis)
+end
+
+return Layout
--- a/src/luan/modules/swing/List.luan	Sun Apr 06 19:20:52 2025 -0600
+++ b/src/luan/modules/swing/List.luan	Mon Apr 07 21:14:53 2025 -0600
@@ -7,7 +7,7 @@
 local Component = require "luan:swing/Component.luan"
 local super__index = Component.__index or error()
 local super__new_index = Component.__new_index or error()
-local super = Component.new or error()
+local super = Component.construct or error()
 require "java"
 local JList = require "java:javax.swing.JList"
 local DefaultListModel = require "java:javax.swing.DefaultListModel"
@@ -44,6 +44,7 @@
 local function new(model)
 	local jlist = JList.new(model)
 	local list = { java = jlist, model = model }
+	super(list)
 	if model.instanceof(DefaultListModel) then
 		list.add_element = model.addElement
 	end
--- a/src/luan/modules/swing/Menu.luan	Sun Apr 06 19:20:52 2025 -0600
+++ b/src/luan/modules/swing/Menu.luan	Mon Apr 07 21:14:53 2025 -0600
@@ -6,7 +6,7 @@
 local Menu_item = require "luan:swing/Menu_item.luan"
 local super__index = Menu_item.__index or error()
 local super__new_index = Menu_item.__new_index or error()
-local super = Menu_item.new or error()
+local super = Menu_item.construct or error()
 require "java"
 local JMenu = require "java:javax.swing.JMenu"
 
@@ -20,11 +20,11 @@
 function Menu.new()
 	local jmenu = JMenu.new()
 	local menu = { java = jmenu }
+	super(menu)
 	menu.add_separator = jmenu.addSeparator
 	function menu.add(menu_item)
 		jmenu.add(menu_item.java)
 	end
-	super(menu)
 	set_metatable(menu,mt)
 	return menu
 end
--- a/src/luan/modules/swing/Menu_item.luan	Sun Apr 06 19:20:52 2025 -0600
+++ b/src/luan/modules/swing/Menu_item.luan	Mon Apr 07 21:14:53 2025 -0600
@@ -7,7 +7,7 @@
 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()
-local super = Abstract_button.new or error()
+local super_construct = Abstract_button.construct or error()
 require "java"
 local JMenuItem = require "java:javax.swing.JMenuItem"
 local KeyStroke = require "java:javax.swing.KeyStroke"
@@ -16,6 +16,7 @@
 local SwingLuan = require "java:luan.modules.swing.SwingLuan"
 local newActionListener = SwingLuan.newActionListener
 
+
 local Menu_item = {}
 
 function Menu_item.__index(menu_item,key)
@@ -40,13 +41,19 @@
 
 local mt = make_metatable(Menu_item)
 
-function Menu_item.new(menu_item)
+local function construct(menu_item)
 	local menu_item = menu_item or { java = JMenuItem.new() }
-	super(menu_item)
+	super_construct(menu_item)
 	local jmenu_item = menu_item.java
 	function menu_item.add_action_listener(action_listener)
 		jmenu_item.addActionListener(newActionListener(action_listener))
 	end
+	return menu_item
+end
+Menu_item.construct = construct
+
+function Menu_item.new(menu_item)
+	menu_item = construct(menu_item)
 	set_metatable(menu_item,mt)
 	return menu_item
 end
--- a/src/luan/modules/swing/Scroll_pane.luan	Sun Apr 06 19:20:52 2025 -0600
+++ b/src/luan/modules/swing/Scroll_pane.luan	Mon Apr 07 21:14:53 2025 -0600
@@ -4,7 +4,7 @@
 local Utils = require "luan:swing/Utils.luan"
 local make_metatable = Utils.make_metatable or error()
 local Component = require "luan:swing/Component.luan"
-local super = Component.new or error()
+local super = Component.construct or error()
 require "java"
 local JScrollPane = require "java:javax.swing.JScrollPane"
 
--- a/src/luan/modules/swing/SwingLuan.java	Sun Apr 06 19:20:52 2025 -0600
+++ b/src/luan/modules/swing/SwingLuan.java	Mon Apr 07 21:14:53 2025 -0600
@@ -61,6 +61,8 @@
 	}
 
 	public static ActionListener newActionListener(final Luan luan,LuanFunction fn) {
+		if( fn == null )
+			throw new NullPointerException("function is null");
 		return new ActionListener() {
 			private void call() {
 				try {
--- a/src/luan/modules/swing/TextAreaLineNumbers.luan	Sun Apr 06 19:20:52 2025 -0600
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-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 Component = require "luan:swing/Component.luan"
-local super = Component.new or error()
-require "java"
-local TextAreaLineNumbersLuan = require "java:luan.modules.swing.TextAreaLineNumbersLuan"
-
-
-local TextAreaLineNumbers = {}
-
-local mt = make_metatable(Component)
-
-function TextAreaLineNumbers.new(text_area)
-	local jtaln = TextAreaLineNumbersLuan.new(text_area.java)
-	local taln = { java = jtaln }
-	super(taln)
-	set_metatable(taln,mt)
-	return taln
-end
-
-return TextAreaLineNumbers
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/luan/modules/swing/Text_area_line_numbers.luan	Mon Apr 07 21:14:53 2025 -0600
@@ -0,0 +1,24 @@
+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 Component = require "luan:swing/Component.luan"
+local super = Component.construct or error()
+require "java"
+local TextAreaLineNumbersLuan = require "java:luan.modules.swing.TextAreaLineNumbersLuan"
+
+
+local TextAreaLineNumbers = {}
+
+local mt = make_metatable(Component)
+
+function TextAreaLineNumbers.new(text_area)
+	local jtaln = TextAreaLineNumbersLuan.new(text_area.java)
+	local taln = { java = jtaln }
+	super(taln)
+	set_metatable(taln,mt)
+	return taln
+end
+
+return TextAreaLineNumbers
--- a/src/luan/modules/swing/Text_component.luan	Sun Apr 06 19:20:52 2025 -0600
+++ b/src/luan/modules/swing/Text_component.luan	Mon Apr 07 21:14:53 2025 -0600
@@ -7,7 +7,7 @@
 local Component = require "luan:swing/Component.luan"
 local super__index = Component.__index or error()
 local super__new_index = Component.__new_index or error()
-local super = Component.new or error()
+local super = Component.construct or error()
 local new_document = require("luan:swing/Document.luan").new or error()
 require "java"
 local SwingLuan = require "java:luan.modules.swing.SwingLuan"
--- a/website/src/manual.html.luan	Sun Apr 06 19:20:52 2025 -0600
+++ b/website/src/manual.html.luan	Mon Apr 07 21:14:53 2025 -0600
@@ -2585,19 +2585,29 @@
 <p>
 Looks for the first substring
 <code>s2</code> in the string <code>s</code>.
-If it finds a match, then <code>find</code> returns the indices of&nbsp;<code>s</code>
-where this occurrence starts and ends;
+If it finds a match, then <code>find</code> returns the index of <code>s</code>
+where this occurrence starts;
 otherwise, it returns <b>nil</b>.
 A third, optional numerical argument <code>init</code> specifies
 where to start the search;
-its default value is&nbsp;1 and can be negative.
-</p>
-
-<p>
-If the pattern has captures,
-then in a successful match
-the captured values are also returned,
-after the two indices.
+its default value is 1 and can be negative.
+</p>
+<%
+						end
+					}
+					["String.find_reverse"] = {
+						title = "String.find_reverse (s, s2 [, init])"
+						content = function()
+%>
+<p>
+Looks for the last substring
+<code>s2</code> in the string <code>s</code>.
+If it finds a match, then <code>find</code> returns the index of <code>s</code>
+where this occurrence starts;
+otherwise, it returns <b>nil</b>.
+A third, optional numerical argument <code>init</code> specifies
+where to start the search;
+its default value is -1.
 </p>
 <%
 						end