comparison editor.luan @ 18:fd6d0162e924

start find
author Franklin Schmidt <fschmidt@gmail.com>
date Mon, 07 Apr 2025 21:15:38 -0600
parents 273aebbcf90b
children ba59fdcf41f3
comparison
equal deleted inserted replaced
17:273aebbcf90b 18:fd6d0162e924
15 local Swing = require "luan:swing/Swing.luan" 15 local Swing = require "luan:swing/Swing.luan"
16 local new_frame = require("luan:swing/Frame.luan").new or error() 16 local new_frame = require("luan:swing/Frame.luan").new or error()
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/TextAreaLineNumbers.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 new_menu = require("luan:swing/Menu.luan").new or error()
23 local new_menu_item = require("luan:swing/Menu_item.luan").new or error() 23 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() 24 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() 25 local int_to_color = require("luan:swing/Color.luan").int_to_color or error()
26 local create_empty_border = require("luan:swing/Border.luan").create_empty_border or error() 26 local Border = require "luan:swing/Border.luan"
27 local create_empty_border = Border.create_empty_border or error()
28 local create_line_border = Border.create_line_border or error()
29 local Layout = require "luan:swing/Layout.luan"
30 local new_flow_layout = Layout.new_flow_layout or error()
31 local new_box_layout = Layout.new_box_layout or error()
27 local Option_pane = require "luan:swing/Option_pane.luan" 32 local Option_pane = require "luan:swing/Option_pane.luan"
28 local show_message_dialog = Option_pane.show_message_dialog or error() 33 local show_message_dialog = Option_pane.show_message_dialog or error()
29 local show_input_dialog = Option_pane.show_input_dialog or error() 34 local show_input_dialog = Option_pane.show_input_dialog or error()
35 local new_dialog = require("luan:swing/Dialog.luan").new or error()
36 local new_panel = require("luan:swing/Component.luan").new_panel or error()
37 local new_button = require("luan:swing/Button.luan").new or error()
30 local Logging = require "luan:logging/Logging.luan" 38 local Logging = require "luan:logging/Logging.luan"
31 local logger = Logging.logger "editor" 39 local logger = Logging.logger "editor"
32 40
33 41
34 local new_window 42 local new_window
142 select_all.text = "Select All" 150 select_all.text = "Select All"
143 select_all.accelerator = "meta A" 151 select_all.accelerator = "meta A"
144 select_all.add_action_listener(window.text_area.select_all) 152 select_all.add_action_listener(window.text_area.select_all)
145 edit_menu.add(select_all) 153 edit_menu.add(select_all)
146 end 154 end
155 edit_menu.add_separator()
156 do
157 local find = new_menu_item()
158 find.text = "Find and Replace"
159 find.accelerator = "meta F"
160 find.add_action_listener(window.show_find_dialog)
161 edit_menu.add(find)
162 end
147 menu_bar.add(edit_menu) 163 menu_bar.add(edit_menu)
148 end 164 end
149 do 165 do
150 local view_menu = new_menu() 166 local view_menu = new_menu()
151 view_menu.text = "View" 167 view_menu.text = "View"
177 do 193 do
178 local goto = new_menu_item() 194 local goto = new_menu_item()
179 goto.text = "Goto Line" 195 goto.text = "Goto Line"
180 goto.accelerator = "meta G" 196 goto.accelerator = "meta G"
181 goto.add_action_listener(function() 197 goto.add_action_listener(function()
182 local input = show_input_dialog( window.frame, "Cursor Column: "..window.cursor_column() ) 198 local input = show_input_dialog( window.frame, "Goto line" )
183 --logger.info("input "..input) 199 --logger.info("input "..input)
184 local line = input and to_number(input) 200 local line = input and to_number(input)
185 if line ~= nil then 201 if line ~= nil then
186 window.goto(line) 202 window.goto(line)
187 end 203 end
189 view_menu.add(goto) 205 view_menu.add(goto)
190 end 206 end
191 menu_bar.add(view_menu) 207 menu_bar.add(view_menu)
192 end 208 end
193 return menu_bar 209 return menu_bar
210 end
211
212 local function make_find_dialog(window)
213 local dialog = new_dialog(window.frame)
214 local root = dialog.component
215 root.set_layout(new_box_layout(root,"y_axis"))
216 do
217 local buttons = new_panel()
218 buttons.set_layout(new_flow_layout("left"))
219 --buttons.border = create_empty_border(8,8,8,8)
220 buttons.border = create_line_border(int_to_color(0))
221
222 local find_next = new_button()
223 find_next.text = "Find Next"
224 buttons.add(find_next)
225
226 local find_prev = new_button()
227 find_prev.text = "Find Previous"
228 buttons.add(find_prev)
229
230 root.add(buttons)
231 end
232 dialog.pack()
233 local was_shown = false
234 function window.show_find_dialog()
235 if not was_shown then
236 was_shown = true
237 dialog.move_into_owner()
238 end
239 dialog.visible = true
240 end
194 end 241 end
195 242
196 local n_windows = 0 243 local n_windows = 0
197 local documents = {} 244 local documents = {}
198 245
330 end 377 end
331 function window.goto(line) 378 function window.goto(line)
332 local pos = text_area.get_line_start_position(line) 379 local pos = text_area.get_line_start_position(line)
333 text_area.set_selection(pos) 380 text_area.set_selection(pos)
334 end 381 end
382 make_find_dialog(window)
335 local menu_bar = make_menu_bar(window) 383 local menu_bar = make_menu_bar(window)
336 frame.set_menu_bar(menu_bar) 384 frame.set_menu_bar(menu_bar)
337 frame.pack() 385 frame.pack()
338 frame.visible = true 386 frame.visible = true
339 text_area.request_focus_in_window() 387 text_area.request_focus_in_window()