Mercurial Hosting > luan
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 <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 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