comparison editor.luan @ 28:bdb8754f1211

find work
author Franklin Schmidt <fschmidt@gmail.com>
date Fri, 11 Apr 2025 21:41:26 -0600
parents 32232df78246
children 01b8a25b38aa
comparison
equal deleted inserted replaced
27:32232df78246 28:bdb8754f1211
1 local Luan = require "luan:Luan.luan" 1 local Luan = require "luan:Luan.luan"
2 local error = Luan.error 2 local error = Luan.error
3 local ipairs = Luan.ipairs or error() 3 local ipairs = Luan.ipairs or error()
4 local range = Luan.range or error()
4 local stringify = Luan.stringify or error() 5 local stringify = Luan.stringify or error()
5 local String = require "luan:String.luan" 6 local String = require "luan:String.luan"
6 local sub_string = String.sub or error() 7 local sub_string = String.sub or error()
7 local replace = String.replace or error() 8 local replace = String.replace or error()
8 local starts_with = String.starts_with or error() 9 local starts_with = String.starts_with or error()
9 local to_number = String.to_number or error() 10 local to_number = String.to_number or error()
11 local find = String.find or error()
10 local Io = require "luan:Io.luan" 12 local Io = require "luan:Io.luan"
11 local print = Io.print or error() 13 local print = Io.print or error()
12 local new_file = Io.schemes.file or error() 14 local new_file = Io.schemes.file or error()
13 local Math = require "luan:Math.luan" 15 local Math = require "luan:Math.luan"
14 local min = Math.min or error() 16 local min = Math.min or error()
175 new_menu_item{ 177 new_menu_item{
176 text = "Goto Line" 178 text = "Goto Line"
177 accelerator = "meta G" 179 accelerator = "meta G"
178 action_listener = function(_) 180 action_listener = function(_)
179 local input = show_input_dialog( window.frame, "Goto line" ) 181 local input = show_input_dialog( window.frame, "Goto line" )
180 --logger.info("input "..input)
181 local line = input and to_number(input) 182 local line = input and to_number(input)
182 if line ~= nil then 183 if line ~= nil then
183 window.goto(line) 184 window.goto(line)
184 end 185 end
185 end 186 end
188 } 189 }
189 } 190 }
190 } 191 }
191 end 192 end
192 193
194 local function get_matches(text,s)
195 local n = #s
196 if n == 0 then
197 return nil
198 end
199 local matches = {}
200 local i = 0
201 while(true) do
202 local j = find(text,s,i)
203 if j == nil then
204 break
205 end
206 matches[#matches+1] = { start=j, end_=j+n }
207 i = j + n
208 end
209 return matches
210 end
211
193 local function make_find_dialog(window) 212 local function make_find_dialog(window)
213 local text_area = window.text_area
214 local find_field, output
215 local function find_match(event)
216 --logger.info("action "..event.action)
217 local s = find_field.text
218 local matches = get_matches( text_area.text, s )
219 if matches == nil then
220 output.text = ""
221 return
222 end
223 local n_matches = #matches
224 if n_matches == 0 then
225 output.text = "0 matches"
226 return
227 end
228 local action = event.action
229 if action == "next" then
230 local _, pos = text_area.get_selection()
231 for i, match in ipairs(matches) do
232 if match.start >= pos then
233 text_area.set_selection( match.start, match.end_ )
234 output.text = i.." of "..n_matches.." matches"
235 return
236 end
237 end
238 local match = matches[1]
239 text_area.set_selection( match.start, match.end_ )
240 output.text = "1 of "..n_matches.." matches; wrapped past end"
241 elseif action == "previous" then
242 local pos = text_area.get_selection()
243 for i in range(n_matches,1,-1) do
244 local match = matches[i]
245 if match.end_ <= pos then
246 text_area.set_selection( match.start, match.end_ )
247 output.text = i.." of "..n_matches.." matches"
248 return
249 end
250 end
251 local match = matches[n_matches]
252 text_area.set_selection( match.start, match.end_ )
253 output.text = n_matches.." of "..n_matches.." matches; wrapped past end"
254 else
255 error(action)
256 end
257 end
258 find_field = new_text_field{
259 constraints = "wrap,growx"
260 columns = 20
261 action = "next"
262 action_listener = find_match
263 }
264 output = new_label{
265 constraints = "span,grow"
266 text = "testing"
267 }
194 local dialog = new_dialog{ 268 local dialog = new_dialog{
195 owner_frame = window.frame 269 owner_frame = window.frame
196 content_pane = new_panel{ 270 content_pane = new_panel{
197 layout = new_mig_layout("debug","[][grow]","[][grow,top]") 271 layout = new_mig_layout("","[][grow]")
198 children = { 272 children = {
199 new_label{ 273 new_label{
200 text = "Find Next:" 274 constraints = "right"
275 text = "Find:"
276 }
277 find_field
278 new_label{
279 constraints = "right"
280 text = "Replace:"
201 } 281 }
202 new_text_field{ 282 new_text_field{
203 constraints = "wrap,growx" 283 constraints = "wrap,growx"
204 columns = 20 284 columns = 20
205 } 285 }
206 new_panel{ 286 new_panel{
207 constraints = "span,wrap" 287 constraints = "span,wrap"
208 layout = new_mig_layout("debug,insets 0") 288 layout = new_mig_layout("insets 0")
209 --border = create_empty_border(8,8,8,8)
210 --border = create_line_border(int_to_color(0))
211 children = { 289 children = {
212 new_button{ 290 new_button{
213 text = "Find Next" 291 text = "Find Next"
292 action = "next"
293 action_listener = find_match
214 } 294 }
215 new_button{ 295 new_button{
216 text = "Find Previous" 296 text = "Find Previous"
297 action = "previous"
298 action_listener = find_match
217 } 299 }
218 } 300 }
219 } 301 }
302 output
220 } 303 }
221 } 304 }
222 } 305 }
223 dialog.pack() 306 dialog.pack()
224 local was_shown = false 307 local was_shown = false