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 |