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