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