comparison editor.luan @ 21:79f060db4d79

work
author Franklin Schmidt <fschmidt@gmail.com>
date Tue, 08 Apr 2025 19:43:16 -0600
parents 1bfd4a2d6d4e
children b2d9b3836c2b
comparison
equal deleted inserted replaced
20:1bfd4a2d6d4e 21:79f060db4d79
17 local new_label = require("luan:swing/Label.luan").new or error() 17 local new_label = require("luan:swing/Label.luan").new or error()
18 local new_text_area = require("luan:swing/Text_area.luan").new or error() 18 local new_text_area = require("luan:swing/Text_area.luan").new or error()
19 local new_scroll_pane = require("luan:swing/Scroll_pane.luan").new or error() 19 local new_scroll_pane = require("luan:swing/Scroll_pane.luan").new or error()
20 local new_text_area_line_numbers = require("luan:swing/Text_area_line_numbers.luan").new or error() 20 local new_text_area_line_numbers = require("luan:swing/Text_area_line_numbers.luan").new or error()
21 local new_menu_bar = require("luan:swing/Menu_bar.luan").new or error() 21 local new_menu_bar = require("luan:swing/Menu_bar.luan").new or error()
22 local new_menu = require("luan:swing/Menu.luan").new or error() 22 local Menu = require "luan:swing/Menu.luan"
23 local new_menu = Menu.new or error()
24 local separator = Menu.separator or error()
23 local new_menu_item = require("luan:swing/Menu_item.luan").new or error() 25 local new_menu_item = require("luan:swing/Menu_item.luan").new or error()
24 local new_check_box_menu_item = require("luan:swing/Check_box_menu_item.luan").new or error() 26 local new_check_box_menu_item = require("luan:swing/Check_box_menu_item.luan").new or error()
25 local int_to_color = require("luan:swing/Color.luan").int_to_color or error() 27 local int_to_color = require("luan:swing/Color.luan").int_to_color or error()
26 local Border = require "luan:swing/Border.luan" 28 local Border = require "luan:swing/Border.luan"
27 local create_empty_border = Border.create_empty_border or error() 29 local create_empty_border = Border.create_empty_border or error()
46 fn() 48 fn()
47 end 49 end
48 end 50 end
49 51
50 local function make_menu_bar(window) 52 local function make_menu_bar(window)
51 local menu_bar = new_menu_bar() 53 local document = window.text_area.document
52 do 54 local revert = new_menu_item{
53 local file_menu = new_menu() 55 text = "Revert"
54 file_menu.text = "File" 56 enabled = window.has_file
55 do 57 action_listener = action_listener(window.revert)
56 local new_file = new_menu_item{ 58 }
57 text = "New File" 59 local undo = new_menu_item{
58 accelerator = "meta N" 60 text = "Undo"
59 action_listener = function(_) 61 accelerator = "meta Z"
60 new_window() 62 action_listener = action_listener(document.undo)
61 end 63 }
64 local redo = new_menu_item{
65 text = "Redo"
66 accelerator = "meta shift Z"
67 action_listener = action_listener(document.redo)
68 }
69 local function update_undo_redo()
70 undo.set_enabled(document.can_undo())
71 redo.set_enabled(document.can_redo())
72 end
73 window.update_undo_redo = update_undo_redo -- dont gc
74 update_undo_redo()
75 document.add_undo_listener(update_undo_redo)
76
77 return new_menu_bar{
78 menus = {
79 new_menu{
80 text = "File"
81 menu_items = {
82 new_menu_item{
83 text = "New File"
84 accelerator = "meta N"
85 action_listener = function(_)
86 new_window()
87 end
88 }
89 new_menu_item{
90 text = "Open..."
91 accelerator = "meta O"
92 action_listener = action_listener(window.open)
93 }
94 new_menu_item{
95 text = "Save"
96 accelerator = "meta S"
97 action_listener = function(_)
98 if window.save() then
99 revert.set_enabled(true)
100 end
101 end
102 }
103 revert
104 }
62 } 105 }
63 file_menu.add(new_file) 106 new_menu{
64 end 107 text = "Edit"
65 do 108 menu_items = {
66 local open = new_menu_item{ 109 undo
67 text = "Open..." 110 redo
68 accelerator = "meta O" 111 separator
69 action_listener = action_listener(window.open) 112 new_menu_item{
113 text = "Cut"
114 accelerator = "meta X"
115 action_listener = action_listener(window.text_area.cut)
116 }
117 new_menu_item{
118 text = "Copy"
119 accelerator = "meta C"
120 action_listener = action_listener(window.text_area.copy)
121 }
122 new_menu_item{
123 text = "Paste"
124 accelerator = "meta V"
125 action_listener = action_listener(window.text_area.paste)
126 }
127 separator
128 new_menu_item{
129 text = "Indent"
130 accelerator = "meta CLOSE_BRACKET"
131 action_listener = action_listener(window.indent)
132 }
133 new_menu_item{
134 text = "Unindent"
135 accelerator = "meta OPEN_BRACKET"
136 action_listener = action_listener(window.unindent)
137 }
138 separator
139 new_menu_item{
140 text = "Select All"
141 accelerator = "meta A"
142 action_listener = action_listener(window.text_area.select_all)
143 }
144 separator
145 new_menu_item{
146 text = "Find and Replace"
147 accelerator = "meta F"
148 action_listener = action_listener(window.show_find_dialog)
149 }
150 }
70 } 151 }
71 file_menu.add(open) 152 new_menu{
72 end 153 text = "View"
73 local revert 154 menu_items = {
74 do 155 new_check_box_menu_item{
75 local save = new_menu_item{ 156 text = "Word Wrap"
76 text = "Save" 157 state = window.text_area.line_wrap
77 accelerator = "meta S" 158 action_listener = function(event)
78 action_listener = function(_) 159 window.text_area.line_wrap = event.source.state
79 if window.save() then 160 end
80 revert.set_enabled(true) 161 }
81 end 162 new_check_box_menu_item{
82 end 163 text = "Show Whitespace"
164 action_listener = function(event)
165 window.text_area.show_whitespace(event.source.state)
166 end
167 }
168 new_menu_item{
169 text = "Show Cursor Column"
170 action_listener = function(_)
171 show_message_dialog( window.frame, "Cursor Column: "..window.cursor_column() )
172 end
173 }
174 new_menu_item{
175 text = "Goto Line"
176 accelerator = "meta G"
177 action_listener = function(_)
178 local input = show_input_dialog( window.frame, "Goto line" )
179 --logger.info("input "..input)
180 local line = input and to_number(input)
181 if line ~= nil then
182 window.goto(line)
183 end
184 end
185 }
186 }
83 } 187 }
84 file_menu.add(save) 188 }
85 end 189 }
86 do
87 revert = new_menu_item{
88 text = "Revert"
89 enabled = window.has_file
90 action_listener = action_listener(window.revert)
91 }
92 file_menu.add(revert)
93 end
94 menu_bar.add(file_menu)
95 end
96 do
97 local edit_menu = new_menu()
98 edit_menu.text = "Edit"
99 local document = window.text_area.document
100 local undo, redo
101 do
102 undo = new_menu_item{
103 text = "Undo"
104 accelerator = "meta Z"
105 action_listener = action_listener(document.undo)
106 }
107 edit_menu.add(undo)
108 end
109 do
110 redo = new_menu_item{
111 text = "Redo"
112 accelerator = "meta shift Z"
113 action_listener = action_listener(document.redo)
114 }
115 edit_menu.add(redo)
116 end
117 local function update_undo_redo()
118 undo.set_enabled(document.can_undo())
119 redo.set_enabled(document.can_redo())
120 end
121 edit_menu.dont_gc(update_undo_redo)
122 update_undo_redo()
123 document.add_undo_listener(update_undo_redo)
124 edit_menu.add_separator()
125 do
126 local cut = new_menu_item{
127 text = "Cut"
128 accelerator = "meta X"
129 action_listener = action_listener(window.text_area.cut)
130 }
131 edit_menu.add(cut)
132 end
133 do
134 local copy = new_menu_item{
135 text = "Copy"
136 accelerator = "meta C"
137 action_listener = action_listener(window.text_area.copy)
138 }
139 edit_menu.add(copy)
140 end
141 do
142 local paste = new_menu_item{
143 text = "Paste"
144 accelerator = "meta V"
145 action_listener = action_listener(window.text_area.paste)
146 }
147 edit_menu.add(paste)
148 end
149 edit_menu.add_separator()
150 do
151 local indent = new_menu_item{
152 text = "Indent"
153 accelerator = "meta CLOSE_BRACKET"
154 action_listener = action_listener(window.indent)
155 }
156 edit_menu.add(indent)
157 end
158 do
159 local unindent = new_menu_item{
160 text = "Unindent"
161 accelerator = "meta OPEN_BRACKET"
162 action_listener = action_listener(window.unindent)
163 }
164 edit_menu.add(unindent)
165 end
166 edit_menu.add_separator()
167 do
168 local select_all = new_menu_item{
169 text = "Select All"
170 accelerator = "meta A"
171 action_listener = action_listener(window.text_area.select_all)
172 }
173 edit_menu.add(select_all)
174 end
175 edit_menu.add_separator()
176 do
177 local find = new_menu_item{
178 text = "Find and Replace"
179 accelerator = "meta F"
180 action_listener = action_listener(window.show_find_dialog)
181 }
182 edit_menu.add(find)
183 end
184 menu_bar.add(edit_menu)
185 end
186 do
187 local view_menu = new_menu()
188 view_menu.text = "View"
189 do
190 local word_wrap = new_check_box_menu_item{
191 text = "Word Wrap"
192 state = window.text_area.line_wrap
193 action_listener = function(event)
194 window.text_area.line_wrap = event.source.state
195 end
196 }
197 view_menu.add(word_wrap)
198 end
199 do
200 local show_whitespace = new_check_box_menu_item()
201 show_whitespace.text = "Show Whitespace"
202 show_whitespace.add_action_listener(function(_)
203 window.text_area.show_whitespace(show_whitespace.state)
204 end)
205 view_menu.add(show_whitespace)
206 end
207 do
208 local show_column = new_menu_item()
209 show_column.text = "Show Cursor Column"
210 show_column.add_action_listener(function(_)
211 show_message_dialog( window.frame, "Cursor Column: "..window.cursor_column() )
212 end)
213 view_menu.add(show_column)
214 end
215 do
216 local goto = new_menu_item()
217 goto.text = "Goto Line"
218 goto.accelerator = "meta G"
219 goto.add_action_listener(function(_)
220 local input = show_input_dialog( window.frame, "Goto line" )
221 --logger.info("input "..input)
222 local line = input and to_number(input)
223 if line ~= nil then
224 window.goto(line)
225 end
226 end)
227 view_menu.add(goto)
228 end
229 menu_bar.add(view_menu)
230 end
231 return menu_bar
232 end 190 end
233 191
234 local function make_find_dialog(window) 192 local function make_find_dialog(window)
235 local dialog = new_dialog(window.frame) 193 local dialog = new_dialog(window.frame)
236 local root = dialog.component 194 local root = dialog.component