annotate src/luan/modules/swing/Frame.luan @ 1893:0170d482b5d5

add FlatLaf
author Franklin Schmidt <fschmidt@gmail.com>
date Sun, 13 Apr 2025 12:25:08 -0600
parents bea843af3422
children d5776185f9d7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1616
915cb538e2a3 start swing
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1 local Luan = require "luan:Luan.luan"
915cb538e2a3 start swing
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
2 local error = Luan.error
915cb538e2a3 start swing
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3 local set_metatable = Luan.set_metatable or error()
1863
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
4 local Io = require "luan:Io.luan"
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
5 local new_file = Io.schemes.file or error()
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
6 local Utils = require "luan:swing/Utils.luan"
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
7 local fail = Utils.fail or error()
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
8 local make_metatable = Utils.make_metatable or error()
1887
Franklin Schmidt <fschmidt@gmail.com>
parents: 1865
diff changeset
9 local delete = Utils.delete or error()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1865
diff changeset
10 local check_empty = Utils.check_empty or error()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1865
diff changeset
11 local check_not_nil = Utils.check_not_nil or error()
1893
0170d482b5d5 add FlatLaf
Franklin Schmidt <fschmidt@gmail.com>
parents: 1887
diff changeset
12 local to_dimension = Utils.to_dimension or error()
1616
915cb538e2a3 start swing
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
13 require "java"
915cb538e2a3 start swing
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
14 local JFrame = require "java:javax.swing.JFrame"
1863
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
15 local FileDialog = require "java:java.awt.FileDialog"
1862
d59d4ef5ca46 swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1616
diff changeset
16 local SwingLuan = require "java:luan.modules.swing.SwingLuan"
d59d4ef5ca46 swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1616
diff changeset
17 local newCloseListener = SwingLuan.newCloseListener
1863
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
18 local Logging = require "luan:logging/Logging.luan"
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
19 local logger = Logging.logger "swing/Frame"
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
20
1616
915cb538e2a3 start swing
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
21
915cb538e2a3 start swing
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
22
915cb538e2a3 start swing
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
23 local Frame = {}
915cb538e2a3 start swing
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
24
1863
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
25 function Frame.__index(frame,key)
1616
915cb538e2a3 start swing
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
26 if key == "visible" then
915cb538e2a3 start swing
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
27 return frame.java.isVisible()
915cb538e2a3 start swing
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
28 end
1862
d59d4ef5ca46 swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1616
diff changeset
29 if key == "title" then
d59d4ef5ca46 swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1616
diff changeset
30 return frame.java.getTitle()
d59d4ef5ca46 swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1616
diff changeset
31 end
1863
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
32 return fail
1616
915cb538e2a3 start swing
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
33 end
915cb538e2a3 start swing
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
34
1863
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
35 function Frame.__new_index(frame,key,value)
1616
915cb538e2a3 start swing
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
36 if key == "visible" then
915cb538e2a3 start swing
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
37 frame.java.setVisible(value)
915cb538e2a3 start swing
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
38 return
915cb538e2a3 start swing
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
39 end
1862
d59d4ef5ca46 swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1616
diff changeset
40 if key == "title" then
d59d4ef5ca46 swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1616
diff changeset
41 frame.java.setTitle(value)
d59d4ef5ca46 swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1616
diff changeset
42 return
d59d4ef5ca46 swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1616
diff changeset
43 end
1863
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
44 return fail
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
45 end
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
46
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
47 local mt = make_metatable(Frame)
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
48
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
49 local File_chooser = {}
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
50
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
51 function File_chooser.__index(file_chooser,key)
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
52 if key == "file" then
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
53 local file_dialog = file_chooser.java
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
54 local file = file_dialog.getFile()
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
55 if file == nil then
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
56 return nil
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
57 end
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
58 local dir = file_dialog.getDirectory()
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
59 return file and new_file(dir..file)
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
60 end
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
61 if key == "directory" then
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
62 local dir = file_chooser.java.getDirectory()
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
63 return new_file(dir)
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
64 end
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
65 if key == "visible" then
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
66 return file_chooser.java.isVisible()
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
67 end
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
68 return fail
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
69 end
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
70
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
71 function File_chooser.__new_index(file_chooser,key,value)
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
72 if key == "file" then
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
73 file_chooser.java.setFile(value.to_string())
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
74 return
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
75 end
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
76 if key == "directory" then
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
77 file_chooser.java.setDirectory(value.to_string())
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
78 return
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
79 end
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
80 if key == "visible" then
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
81 file_chooser.java.setVisible(value)
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
82 return
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
83 end
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
84 return fail
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
85 end
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
86
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
87 local mt_fc = make_metatable(File_chooser)
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
88
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
89 local function new_file_chooser(jframe)
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
90 local file_dialog = FileDialog.new(jframe)
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
91 local file_chooser = { java = file_dialog }
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
92 set_metatable(file_chooser,mt_fc)
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
93 return file_chooser
1616
915cb538e2a3 start swing
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
94 end
915cb538e2a3 start swing
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
95
1887
Franklin Schmidt <fschmidt@gmail.com>
parents: 1865
diff changeset
96 function Frame.new(props)
Franklin Schmidt <fschmidt@gmail.com>
parents: 1865
diff changeset
97 check_not_nil(props)
1862
d59d4ef5ca46 swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1616
diff changeset
98 local jframe = JFrame.new()
1887
Franklin Schmidt <fschmidt@gmail.com>
parents: 1865
diff changeset
99 jframe.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
1616
915cb538e2a3 start swing
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
100 local frame = { java = jframe }
1887
Franklin Schmidt <fschmidt@gmail.com>
parents: 1865
diff changeset
101 local content_pane = delete(props,"content_pane")
Franklin Schmidt <fschmidt@gmail.com>
parents: 1865
diff changeset
102 if content_pane~=nil then jframe.setContentPane(content_pane.java) end
1893
0170d482b5d5 add FlatLaf
Franklin Schmidt <fschmidt@gmail.com>
parents: 1887
diff changeset
103 local preferred_size = delete(props,"preferred_size")
0170d482b5d5 add FlatLaf
Franklin Schmidt <fschmidt@gmail.com>
parents: 1887
diff changeset
104 if preferred_size~=nil then jframe.setPreferredSize(to_dimension(preferred_size)) end
1887
Franklin Schmidt <fschmidt@gmail.com>
parents: 1865
diff changeset
105 check_empty(props)
1862
d59d4ef5ca46 swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1616
diff changeset
106 function frame.add_close_listener(close_listener)
d59d4ef5ca46 swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1616
diff changeset
107 jframe.addWindowListener(newCloseListener(close_listener))
1616
915cb538e2a3 start swing
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
108 end
915cb538e2a3 start swing
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
109 function frame.add(component)
915cb538e2a3 start swing
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
110 jframe.add(component.java)
915cb538e2a3 start swing
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
111 end
1862
d59d4ef5ca46 swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1616
diff changeset
112 function frame.set_menu_bar(menu_bar)
d59d4ef5ca46 swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1616
diff changeset
113 jframe.setJMenuBar(menu_bar.java)
d59d4ef5ca46 swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1616
diff changeset
114 end
1863
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
115 local file_chooser
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
116 local function get_file_chooser(mode)
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
117 file_chooser = file_chooser or new_file_chooser(jframe)
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
118 file_chooser.java.setMode(mode)
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
119 return file_chooser
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
120 end
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
121 function frame.file_chooser_load()
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
122 return get_file_chooser(FileDialog.LOAD)
928e73bfe7ea swing work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1862
diff changeset
123 end
1865
Franklin Schmidt <fschmidt@gmail.com>
parents: 1863
diff changeset
124 function frame.file_chooser_save()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1863
diff changeset
125 return get_file_chooser(FileDialog.SAVE)
Franklin Schmidt <fschmidt@gmail.com>
parents: 1863
diff changeset
126 end
1616
915cb538e2a3 start swing
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
127 frame.pack = jframe.pack
915cb538e2a3 start swing
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
128 set_metatable(frame,mt)
915cb538e2a3 start swing
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
129 return frame
915cb538e2a3 start swing
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
130 end
915cb538e2a3 start swing
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
131
915cb538e2a3 start swing
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
132 return Frame