comparison editor.luan @ 20:1bfd4a2d6d4e

work
author Franklin Schmidt <fschmidt@gmail.com>
date Tue, 08 Apr 2025 13:42:59 -0600
parents ba59fdcf41f3
children 79f060db4d79
comparison
equal deleted inserted replaced
19:ba59fdcf41f3 20:1bfd4a2d6d4e
39 local logger = Logging.logger "editor" 39 local logger = Logging.logger "editor"
40 40
41 41
42 local new_window 42 local new_window
43 43
44 local function action_listener(fn)
45 return function(_)
46 fn()
47 end
48 end
49
44 local function make_menu_bar(window) 50 local function make_menu_bar(window)
45 local menu_bar = new_menu_bar() 51 local menu_bar = new_menu_bar()
46 do 52 do
47 local file_menu = new_menu() 53 local file_menu = new_menu()
48 file_menu.text = "File" 54 file_menu.text = "File"
49 do 55 do
50 local new_file = new_menu_item{ 56 local new_file = new_menu_item{
51 text = "New File" 57 text = "New File"
52 accelerator = "meta N" 58 accelerator = "meta N"
53 action_listener = new_window 59 action_listener = function(_)
60 new_window()
61 end
54 } 62 }
55 file_menu.add(new_file) 63 file_menu.add(new_file)
56 end 64 end
57 do 65 do
58 local open = new_menu_item{ 66 local open = new_menu_item{
59 text = "Open..." 67 text = "Open..."
60 accelerator = "meta O" 68 accelerator = "meta O"
61 action_listener = window.open 69 action_listener = action_listener(window.open)
62 } 70 }
63 file_menu.add(open) 71 file_menu.add(open)
64 end 72 end
65 local revert 73 local revert
66 do 74 do
67 local save = new_menu_item{ 75 local save = new_menu_item{
68 text = "Save" 76 text = "Save"
69 accelerator = "meta S" 77 accelerator = "meta S"
70 action_listener = function() 78 action_listener = function(_)
71 if window.save() then 79 if window.save() then
72 revert.set_enabled(true) 80 revert.set_enabled(true)
73 end 81 end
74 end 82 end
75 } 83 }
77 end 85 end
78 do 86 do
79 revert = new_menu_item{ 87 revert = new_menu_item{
80 text = "Revert" 88 text = "Revert"
81 enabled = window.has_file 89 enabled = window.has_file
82 action_listener = window.revert 90 action_listener = action_listener(window.revert)
83 } 91 }
84 file_menu.add(revert) 92 file_menu.add(revert)
85 end 93 end
86 menu_bar.add(file_menu) 94 menu_bar.add(file_menu)
87 end 95 end
92 local undo, redo 100 local undo, redo
93 do 101 do
94 undo = new_menu_item{ 102 undo = new_menu_item{
95 text = "Undo" 103 text = "Undo"
96 accelerator = "meta Z" 104 accelerator = "meta Z"
97 action_listener = document.undo 105 action_listener = action_listener(document.undo)
98 } 106 }
99 edit_menu.add(undo) 107 edit_menu.add(undo)
100 end 108 end
101 do 109 do
102 redo = new_menu_item{ 110 redo = new_menu_item{
103 text = "Redo" 111 text = "Redo"
104 accelerator = "meta shift Z" 112 accelerator = "meta shift Z"
105 action_listener = document.redo 113 action_listener = action_listener(document.redo)
106 } 114 }
107 edit_menu.add(redo) 115 edit_menu.add(redo)
108 end 116 end
109 local function update_undo_redo() 117 local function update_undo_redo()
110 undo.set_enabled(document.can_undo()) 118 undo.set_enabled(document.can_undo())
116 edit_menu.add_separator() 124 edit_menu.add_separator()
117 do 125 do
118 local cut = new_menu_item{ 126 local cut = new_menu_item{
119 text = "Cut" 127 text = "Cut"
120 accelerator = "meta X" 128 accelerator = "meta X"
121 action_listener = window.text_area.cut 129 action_listener = action_listener(window.text_area.cut)
122 } 130 }
123 edit_menu.add(cut) 131 edit_menu.add(cut)
124 end 132 end
125 do 133 do
126 local copy = new_menu_item{ 134 local copy = new_menu_item{
127 text = "Copy" 135 text = "Copy"
128 accelerator = "meta C" 136 accelerator = "meta C"
129 action_listener = window.text_area.copy 137 action_listener = action_listener(window.text_area.copy)
130 } 138 }
131 edit_menu.add(copy) 139 edit_menu.add(copy)
132 end 140 end
133 do 141 do
134 local paste = new_menu_item{ 142 local paste = new_menu_item{
135 text = "Paste" 143 text = "Paste"
136 accelerator = "meta V" 144 accelerator = "meta V"
137 action_listener = window.text_area.paste 145 action_listener = action_listener(window.text_area.paste)
138 } 146 }
139 edit_menu.add(paste) 147 edit_menu.add(paste)
140 end 148 end
141 edit_menu.add_separator() 149 edit_menu.add_separator()
142 do 150 do
143 local indent = new_menu_item() 151 local indent = new_menu_item{
144 indent.text = "Indent" 152 text = "Indent"
145 indent.accelerator = "meta CLOSE_BRACKET" 153 accelerator = "meta CLOSE_BRACKET"
146 indent.add_action_listener(window.indent) 154 action_listener = action_listener(window.indent)
155 }
147 edit_menu.add(indent) 156 edit_menu.add(indent)
148 end 157 end
149 do 158 do
150 local unindent = new_menu_item() 159 local unindent = new_menu_item{
151 unindent.text = "Unindent" 160 text = "Unindent"
152 unindent.accelerator = "meta OPEN_BRACKET" 161 accelerator = "meta OPEN_BRACKET"
153 unindent.add_action_listener(window.unindent) 162 action_listener = action_listener(window.unindent)
163 }
154 edit_menu.add(unindent) 164 edit_menu.add(unindent)
155 end 165 end
156 edit_menu.add_separator() 166 edit_menu.add_separator()
157 do 167 do
158 local select_all = new_menu_item() 168 local select_all = new_menu_item{
159 select_all.text = "Select All" 169 text = "Select All"
160 select_all.accelerator = "meta A" 170 accelerator = "meta A"
161 select_all.add_action_listener(window.text_area.select_all) 171 action_listener = action_listener(window.text_area.select_all)
172 }
162 edit_menu.add(select_all) 173 edit_menu.add(select_all)
163 end 174 end
164 edit_menu.add_separator() 175 edit_menu.add_separator()
165 do 176 do
166 local find = new_menu_item() 177 local find = new_menu_item{
167 find.text = "Find and Replace" 178 text = "Find and Replace"
168 find.accelerator = "meta F" 179 accelerator = "meta F"
169 find.add_action_listener(window.show_find_dialog) 180 action_listener = action_listener(window.show_find_dialog)
181 }
170 edit_menu.add(find) 182 edit_menu.add(find)
171 end 183 end
172 menu_bar.add(edit_menu) 184 menu_bar.add(edit_menu)
173 end 185 end
174 do 186 do
175 local view_menu = new_menu() 187 local view_menu = new_menu()
176 view_menu.text = "View" 188 view_menu.text = "View"
177 do 189 do
178 local word_wrap = new_check_box_menu_item() 190 local word_wrap = new_check_box_menu_item{
179 word_wrap.text = "Word Wrap" 191 text = "Word Wrap"
180 word_wrap.state = window.text_area.line_wrap 192 state = window.text_area.line_wrap
181 word_wrap.add_action_listener(function() 193 action_listener = function(event)
182 window.text_area.line_wrap = word_wrap.state 194 window.text_area.line_wrap = event.source.state
183 end) 195 end
196 }
184 view_menu.add(word_wrap) 197 view_menu.add(word_wrap)
185 end 198 end
186 do 199 do
187 local show_whitespace = new_check_box_menu_item() 200 local show_whitespace = new_check_box_menu_item()
188 show_whitespace.text = "Show Whitespace" 201 show_whitespace.text = "Show Whitespace"
189 show_whitespace.add_action_listener(function() 202 show_whitespace.add_action_listener(function(_)
190 window.text_area.show_whitespace(show_whitespace.state) 203 window.text_area.show_whitespace(show_whitespace.state)
191 end) 204 end)
192 view_menu.add(show_whitespace) 205 view_menu.add(show_whitespace)
193 end 206 end
194 do 207 do
195 local show_column = new_menu_item() 208 local show_column = new_menu_item()
196 show_column.text = "Show Cursor Column" 209 show_column.text = "Show Cursor Column"
197 show_column.add_action_listener(function() 210 show_column.add_action_listener(function(_)
198 show_message_dialog( window.frame, "Cursor Column: "..window.cursor_column() ) 211 show_message_dialog( window.frame, "Cursor Column: "..window.cursor_column() )
199 end) 212 end)
200 view_menu.add(show_column) 213 view_menu.add(show_column)
201 end 214 end
202 do 215 do
203 local goto = new_menu_item() 216 local goto = new_menu_item()
204 goto.text = "Goto Line" 217 goto.text = "Goto Line"
205 goto.accelerator = "meta G" 218 goto.accelerator = "meta G"
206 goto.add_action_listener(function() 219 goto.add_action_listener(function(_)
207 local input = show_input_dialog( window.frame, "Goto line" ) 220 local input = show_input_dialog( window.frame, "Goto line" )
208 --logger.info("input "..input) 221 --logger.info("input "..input)
209 local line = input and to_number(input) 222 local line = input and to_number(input)
210 if line ~= nil then 223 if line ~= nil then
211 window.goto(line) 224 window.goto(line)
273 else 286 else
274 text_area.document = document 287 text_area.document = document
275 end 288 end
276 if file.is_file() then 289 if file.is_file() then
277 text_area.text = file.read_text() 290 text_area.text = file.read_text()
291 text_area.document.clear_unedited()
278 end 292 end
279 end 293 end
280 local function set_title() 294 local function set_title()
281 local s = title 295 local s = title
282 if not text_area.document.is_unedited() then 296 if not text_area.document.is_unedited() then