Mercurial Hosting > editor
comparison editor.luan @ 29:01b8a25b38aa
work
| author | Franklin Schmidt <fschmidt@gmail.com> |
|---|---|
| date | Sun, 13 Apr 2025 12:25:57 -0600 |
| parents | bdb8754f1211 |
| children | 8e32ad89c2a1 |
comparison
equal
deleted
inserted
replaced
| 28:bdb8754f1211 | 29:01b8a25b38aa |
|---|---|
| 50 return function(_) | 50 return function(_) |
| 51 fn() | 51 fn() |
| 52 end | 52 end |
| 53 end | 53 end |
| 54 | 54 |
| 55 local function make_menu_bar(window) | 55 local function add_menu_bar(window) |
| 56 local document = window.text_area.document | 56 local document = window.text_area.document |
| 57 local revert = new_menu_item{ | 57 local revert = new_menu_item{ |
| 58 text = "Revert" | 58 text = "Revert" |
| 59 enabled = window.has_file | 59 enabled = window.has_file |
| 60 action_listener = action_listener(window.revert) | 60 action_listener = action_listener(window.revert) |
| 75 end | 75 end |
| 76 window.update_undo_redo = update_undo_redo -- dont gc | 76 window.update_undo_redo = update_undo_redo -- dont gc |
| 77 update_undo_redo() | 77 update_undo_redo() |
| 78 document.add_undo_listener(update_undo_redo) | 78 document.add_undo_listener(update_undo_redo) |
| 79 | 79 |
| 80 return new_menu_bar{ | 80 local menu_bar = new_menu_bar{ |
| 81 menus = { | 81 menus = { |
| 82 new_menu{ | 82 new_menu{ |
| 83 text = "File" | 83 text = "File" |
| 84 menu_items = { | 84 menu_items = { |
| 85 new_menu_item{ | 85 new_menu_item{ |
| 143 text = "Select All" | 143 text = "Select All" |
| 144 accelerator = "meta A" | 144 accelerator = "meta A" |
| 145 action_listener = action_listener(window.text_area.select_all) | 145 action_listener = action_listener(window.text_area.select_all) |
| 146 } | 146 } |
| 147 separator | 147 separator |
| 148 new_menu_item{ | 148 new_check_box_menu_item{ |
| 149 text = "Find and Replace" | 149 text = "Find and Replace" |
| 150 accelerator = "meta F" | 150 accelerator = "meta F" |
| 151 action_listener = action_listener(window.show_find_dialog) | 151 action_listener = function(event) |
| 152 window.show_find_panel(event.source.state) | |
| 153 end | |
| 152 } | 154 } |
| 153 } | 155 } |
| 154 } | 156 } |
| 155 new_menu{ | 157 new_menu{ |
| 156 text = "View" | 158 text = "View" |
| 187 } | 189 } |
| 188 } | 190 } |
| 189 } | 191 } |
| 190 } | 192 } |
| 191 } | 193 } |
| 194 window.frame.set_menu_bar(menu_bar) | |
| 192 end | 195 end |
| 193 | 196 |
| 194 local function get_matches(text,s) | 197 local function get_matches(text,s) |
| 195 local n = #s | 198 local n = #s |
| 196 if n == 0 then | 199 if n == 0 then |
| 207 i = j + n | 210 i = j + n |
| 208 end | 211 end |
| 209 return matches | 212 return matches |
| 210 end | 213 end |
| 211 | 214 |
| 212 local function make_find_dialog(window) | 215 local function make_find_panel(window) |
| 213 local text_area = window.text_area | 216 local text_area = window.text_area |
| 214 local find_field, output | 217 local find_field, output |
| 215 local function find_match(event) | 218 local function find_match(event) |
| 216 --logger.info("action "..event.action) | 219 --logger.info("action "..event.action) |
| 217 local s = find_field.text | 220 local s = find_field.text |
| 254 else | 257 else |
| 255 error(action) | 258 error(action) |
| 256 end | 259 end |
| 257 end | 260 end |
| 258 find_field = new_text_field{ | 261 find_field = new_text_field{ |
| 259 constraints = "wrap,growx" | 262 constraints = "growx" |
| 260 columns = 20 | 263 columns = 20 |
| 261 action = "next" | 264 action = "next" |
| 262 action_listener = find_match | 265 action_listener = find_match |
| 263 } | 266 } |
| 264 output = new_label{ | 267 output = new_label{ |
| 265 constraints = "span,grow" | 268 constraints = "span" |
| 266 text = "testing" | 269 text = "testing" |
| 267 } | 270 } |
| 268 local dialog = new_dialog{ | 271 local find_panel = new_panel{ |
| 269 owner_frame = window.frame | 272 constraints = "growy 0,growx" |
| 270 content_pane = new_panel{ | 273 layout = new_mig_layout("","[][grow][grow 0]") |
| 271 layout = new_mig_layout("","[][grow]") | 274 visible = false |
| 272 children = { | 275 children = { |
| 273 new_label{ | 276 new_label{ |
| 274 constraints = "right" | 277 constraints = "right" |
| 275 text = "Find:" | 278 text = "Find:" |
| 279 } | |
| 280 find_field | |
| 281 new_panel{ | |
| 282 constraints = "wrap" | |
| 283 layout = new_mig_layout("insets 0") | |
| 284 children = { | |
| 285 new_button{ | |
| 286 text = "Find Next" | |
| 287 action = "next" | |
| 288 action_listener = find_match | |
| 289 } | |
| 290 new_button{ | |
| 291 text = "Find Previous" | |
| 292 action = "previous" | |
| 293 action_listener = find_match | |
| 294 } | |
| 276 } | 295 } |
| 277 find_field | 296 } |
| 278 new_label{ | 297 new_label{ |
| 279 constraints = "right" | 298 constraints = "right" |
| 280 text = "Replace:" | 299 text = "Replace:" |
| 281 } | 300 } |
| 282 new_text_field{ | 301 new_text_field{ |
| 283 constraints = "wrap,growx" | 302 constraints = "growx" |
| 284 columns = 20 | 303 columns = 20 |
| 285 } | 304 } |
| 286 new_panel{ | 305 new_button{ |
| 287 constraints = "span,wrap" | 306 constraints = "wrap" |
| 288 layout = new_mig_layout("insets 0") | 307 text = "Replace" |
| 289 children = { | 308 } |
| 290 new_button{ | 309 output |
| 291 text = "Find Next" | |
| 292 action = "next" | |
| 293 action_listener = find_match | |
| 294 } | |
| 295 new_button{ | |
| 296 text = "Find Previous" | |
| 297 action = "previous" | |
| 298 action_listener = find_match | |
| 299 } | |
| 300 } | |
| 301 } | |
| 302 output | |
| 303 } | |
| 304 } | 310 } |
| 305 } | 311 } |
| 306 dialog.pack() | 312 function window.show_find_panel(visible) |
| 307 local was_shown = false | 313 find_panel.visible = visible |
| 308 function window.show_find_dialog() | 314 if visible then |
| 309 if not was_shown then | 315 find_field.request_focus_in_window() |
| 310 was_shown = true | 316 end |
| 311 dialog.move_into_owner() | 317 end |
| 312 end | 318 return find_panel |
| 313 dialog.visible = true | |
| 314 end | |
| 315 end | 319 end |
| 316 | 320 |
| 317 local n_windows = 0 | 321 local n_windows = 0 |
| 318 local documents = {} | 322 local documents = {} |
| 319 | 323 |
| 320 function new_window(file) | 324 function new_window(file) |
| 321 local window = {} | 325 local window = {} |
| 322 window.has_file = file~=nil and file.is_file() | 326 window.has_file = file~=nil and file.is_file() |
| 323 local text_area = new_text_area{ | 327 local text_area = new_text_area{ |
| 324 rows = 10 | |
| 325 columns = 20 | |
| 326 wrap_style_word = true | 328 wrap_style_word = true |
| 327 line_wrap = true | 329 line_wrap = true |
| 328 tab_size = 4 | 330 tab_size = 4 |
| 329 font = { family="Monospaced", size=13 } | 331 font = { family="Monospaced", size=13 } |
| 330 border = create_empty_border(0,4,0,4) | |
| 331 } | 332 } |
| 332 window.text_area = text_area | 333 window.text_area = text_area |
| 333 local title = file and file.canonical().to_string() or "new" | 334 local title = file and file.canonical().to_string() or "new" |
| 334 if file ~= nil then | 335 if file ~= nil then |
| 335 local document = documents[title] | 336 local document = documents[title] |
| 342 text_area.text = file.read_text() | 343 text_area.text = file.read_text() |
| 343 text_area.document.clear_unedited() | 344 text_area.document.clear_unedited() |
| 344 end | 345 end |
| 345 end | 346 end |
| 346 text_area.set_selection(0) | 347 text_area.set_selection(0) |
| 348 local find_panel = make_find_panel(window) | |
| 347 local frame = new_frame{ | 349 local frame = new_frame{ |
| 348 content_pane = new_scroll_pane{ | 350 preferred_size = { width=700, height=700 } |
| 349 view = text_area | 351 content_pane = new_panel{ |
| 350 border = no_border | 352 layout = new_mig_layout("insets 0,wrap,fill,hidemode 3","","[][grow 0]") |
| 351 row_header_view = new_text_area_line_numbers{ | 353 children = { |
| 352 text_area = text_area | 354 new_scroll_pane{ |
| 353 foreground_color = int_to_color(0x888888) | 355 constraints = "grow" |
| 354 border = create_empty_border(0,8,0,8) | 356 view = text_area |
| 357 row_header_view = new_text_area_line_numbers{ | |
| 358 text_area = text_area | |
| 359 foreground_color = int_to_color(0x888888) | |
| 360 border = create_empty_border(0,8,0,8) | |
| 361 } | |
| 362 } | |
| 363 find_panel | |
| 355 } | 364 } |
| 356 } | 365 } |
| 357 } | 366 } |
| 358 window.frame = frame | 367 window.frame = frame |
| 359 frame.add_close_listener(function() | 368 frame.add_close_listener(function() |
| 457 end | 466 end |
| 458 function window.goto(line) | 467 function window.goto(line) |
| 459 local pos = text_area.get_line_start_position(line) | 468 local pos = text_area.get_line_start_position(line) |
| 460 text_area.set_selection(pos) | 469 text_area.set_selection(pos) |
| 461 end | 470 end |
| 462 make_find_dialog(window) | 471 add_menu_bar(window) |
| 463 local menu_bar = make_menu_bar(window) | |
| 464 frame.set_menu_bar(menu_bar) | |
| 465 frame.pack() | 472 frame.pack() |
| 466 frame.visible = true | 473 frame.visible = true |
| 467 text_area.request_focus_in_window() | 474 text_area.request_focus_in_window() |
| 468 n_windows = n_windows + 1 | 475 n_windows = n_windows + 1 |
| 469 end | 476 end |
| 470 | |
| 471 --[[ | |
| 472 for _, laf in ipairs(Swing.get_installed_look_and_feels()) do | |
| 473 logger.info(laf) | |
| 474 end | |
| 475 ]] | |
| 476 --logger.info(Swing.get_look_and_feel()) | |
| 477 Swing.ui_manager_put("control",int_to_color(0xedeff2)) | |
| 478 Swing.set_look_and_feel("javax.swing.plaf.nimbus.NimbusLookAndFeel") | |
| 479 | 477 |
| 480 Swing.run(function() | 478 Swing.run(function() |
| 481 local args = Luan.arg | 479 local args = Luan.arg |
| 482 if #args == 0 then | 480 if #args == 0 then |
| 483 new_window() | 481 new_window() |
