Mercurial Hosting > editor
comparison src/luan_editor/window.luan @ 44:779ea6d9d8fb
list window work
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Mon, 19 May 2025 14:53:41 -0600 |
parents | 48c35fdccb31 |
children | 0c83b27bb32d |
comparison
equal
deleted
inserted
replaced
43:48c35fdccb31 | 44:779ea6d9d8fb |
---|---|
21 local create_empty_border = Border.create_empty_border or error() | 21 local create_empty_border = Border.create_empty_border or error() |
22 local new_label = require("luan:swing/Label.luan").new or error() | 22 local new_label = require("luan:swing/Label.luan").new or error() |
23 local make_find_panel = require "classpath:luan_editor/find.luan" | 23 local make_find_panel = require "classpath:luan_editor/find.luan" |
24 local add_menu_bar = require "classpath:luan_editor/menu.luan" | 24 local add_menu_bar = require "classpath:luan_editor/menu.luan" |
25 local Swing = require "luan:swing/Swing.luan" | 25 local Swing = require "luan:swing/Swing.luan" |
26 local run_later = Swing.run_later or error() | |
26 local File_chooser = require "luan:swing/File_chooser.luan" | 27 local File_chooser = require "luan:swing/File_chooser.luan" |
27 local choose_file = File_chooser.awt_choose_file or error() | 28 local choose_file = File_chooser.awt_choose_file or error() |
28 local Option_pane = require "luan:swing/Option_pane.luan" | 29 local Option_pane = require "luan:swing/Option_pane.luan" |
29 local show_message_dialog = Option_pane.show_message_dialog or error() | 30 local show_message_dialog = Option_pane.show_message_dialog or error() |
30 local new_radio_button = require("luan:swing/Radio_button.luan").new or error() | 31 local new_radio_button = require("luan:swing/Radio_button.luan").new or error() |
62 config_file.write_text( stringify(config).."\n" ) | 63 config_file.write_text( stringify(config).."\n" ) |
63 end | 64 end |
64 | 65 |
65 local list_view = new_panel{ | 66 local list_view = new_panel{ |
66 --layout = new_mig_layout("insets 0,wrap,fill") | 67 --layout = new_mig_layout("insets 0,wrap,fill") |
67 layout = new_mig_layout("wrap,debug","[grow]") | 68 layout = new_mig_layout("wrap","[grow]") |
68 } | 69 } |
69 local list_scroll_pane = new_scroll_pane{ | 70 local list_scroll_pane = new_scroll_pane{ |
70 view = list_view | 71 view = list_view |
71 } | 72 } |
72 local list_window = new_dialog{ | 73 local list_window = new_dialog{ |
73 preferred_size = { width=200, height=400 } | 74 --preferred_size = { width=200, height=400 } |
75 size = { width=200, height=400 } | |
76 --maximum_size = { width=200, height=400 } | |
74 content_pane = list_scroll_pane | 77 content_pane = list_scroll_pane |
75 focusable_window_state = false | 78 focusable_window_state = false |
76 } | 79 } |
80 local function show_list_window() | |
81 list_window.visible = true | |
82 list_scroll_pane.scroll_to_right() | |
83 end | |
84 | |
77 local list_group = new_button_group() | 85 local list_group = new_button_group() |
78 | 86 |
79 local function new_list_window_item(text) | 87 local function new_list_window_item(text) |
80 local rb = new_radio_button{ | 88 local rb = new_radio_button{ |
81 constraints = "grow" | 89 constraints = "grow" |
84 horizontal_alignment = "right" | 92 horizontal_alignment = "right" |
85 } | 93 } |
86 list_view.add(rb) | 94 list_view.add(rb) |
87 list_group.add(rb) | 95 list_group.add(rb) |
88 list_scroll_pane.scroll_to_right() | 96 list_scroll_pane.scroll_to_right() |
89 list_window.pack() | 97 list_window.validate() |
90 return rb | 98 return rb |
91 end | 99 end |
92 local function remove_list_window_item(list_window_item) | 100 local function remove_list_window_item(list_window_item) |
93 list_view.remove(list_window_item) | 101 list_view.remove(list_window_item) |
94 list_group.remove(list_window_item) | 102 list_group.remove(list_window_item) |
95 list_window.pack() | 103 list_window.validate() |
96 list_window.repaint() | 104 end |
97 end | 105 |
106 local black = int_to_color(0x000000) | |
107 local blue = int_to_color(0x0000FF) | |
108 local grey = int_to_color(0x888888) | |
98 | 109 |
99 local function new_window(file,document) | 110 local function new_window(file,document) |
100 local window = {} | 111 local window = {} |
101 if file == nil or not file.exists() then | 112 if file == nil or not file.exists() then |
102 window.has_file = false | 113 window.has_file = false |
133 text_area.document.clear_unedited() | 144 text_area.document.clear_unedited() |
134 end | 145 end |
135 end | 146 end |
136 end | 147 end |
137 text_area.set_selection(0) | 148 text_area.set_selection(0) |
149 local list_window_item = new_list_window_item(title) | |
150 list_window_item.add_action_listener(function(_) | |
151 text_area.request_focus() | |
152 end) | |
153 --window.list_window_item = list_window_item | |
138 local status_bar = new_label{ | 154 local status_bar = new_label{ |
139 constraints = "span,growx" | 155 constraints = "span,growx" |
140 text = " " | 156 text = " " |
141 border = create_empty_border(2,16,4,16) | 157 border = create_empty_border(2,16,4,16) |
142 } | 158 } |
150 new_scroll_pane{ | 166 new_scroll_pane{ |
151 constraints = "grow" | 167 constraints = "grow" |
152 view = text_area | 168 view = text_area |
153 row_header_view = new_text_area_line_numbers{ | 169 row_header_view = new_text_area_line_numbers{ |
154 text_area = text_area | 170 text_area = text_area |
155 foreground_color = int_to_color(0x888888) | 171 foreground_color = grey |
156 border = create_empty_border(0,8,0,8) | 172 border = create_empty_border(0,8,0,8) |
157 } | 173 } |
158 } | 174 } |
159 find_panel | 175 find_panel |
160 status_bar | 176 status_bar |
165 frame.add_close_listener(function() | 181 frame.add_close_listener(function() |
166 n_windows = n_windows - 1 | 182 n_windows = n_windows - 1 |
167 if n_windows == 0 then | 183 if n_windows == 0 then |
168 Luan.exit() | 184 Luan.exit() |
169 end | 185 end |
170 remove_list_window_item(window.list_window_item) | 186 remove_list_window_item(list_window_item) |
171 end) | 187 end) |
172 frame.add_window_focus_listener(function() | 188 frame.add_window_focus_listener(function() |
173 window.list_window_item.is_selected = true | 189 list_window_item.is_selected = true |
190 list_window_item.scroll_into_view_vertically() | |
174 end) | 191 end) |
175 frame.add_resize_stopped_listener( 200, function() | 192 frame.add_resize_stopped_listener( 200, function() |
176 --logger.info(stringify(frame.size)) | 193 --logger.info(stringify(frame.size)) |
177 config.size = frame.size | 194 config.size = frame.size |
178 save_config() | 195 save_config() |
180 frame.add_move_stopped_listener( 200, function() | 197 frame.add_move_stopped_listener( 200, function() |
181 --logger.info(stringify(frame.location)) | 198 --logger.info(stringify(frame.location)) |
182 config.location = frame.location | 199 config.location = frame.location |
183 save_config() | 200 save_config() |
184 end) | 201 end) |
185 local function set_title() | 202 local function undo_listener() |
203 local is_unedited = text_area.document.is_unedited() | |
204 if window.is_unedited == is_unedited then | |
205 return | |
206 end | |
207 window.is_unedited = is_unedited | |
186 local s = title | 208 local s = title |
187 if not text_area.document.is_unedited() then | 209 if not is_unedited then |
188 s = s.." *" | 210 s = s.." *" |
189 end | 211 end |
190 frame.title = s | 212 frame.title = s |
191 end | 213 list_window_item.foreground_color = is_unedited and black or blue |
192 set_title() | 214 end |
193 local list_window_item = new_list_window_item(title) | 215 undo_listener() |
194 list_window_item.add_action_listener(function(_) | 216 --window.undo_listener = undo_listener -- dont gc |
195 text_area.request_focus() | 217 text_area.document.add_undo_listener(undo_listener) |
196 end) | |
197 window.list_window_item = list_window_item | |
198 window.set_title = set_title -- dont gc | |
199 text_area.document.add_undo_listener(set_title) | |
200 window.new = new_window | 218 window.new = new_window |
201 function window.open() | 219 function window.open() |
202 local new_file = choose_file{ | 220 local new_file = choose_file{ |
203 action = "load" | 221 action = "load" |
204 parent = frame | 222 parent = frame |
308 end | 326 end |
309 function window.duplicate() | 327 function window.duplicate() |
310 local new = new_window(file,text_area.document) | 328 local new = new_window(file,text_area.document) |
311 new.text_area.set_selection( text_area.get_selection() ) | 329 new.text_area.set_selection( text_area.get_selection() ) |
312 end | 330 end |
313 function window.show_list_window() | 331 window.show_list_window = show_list_window |
314 list_window.visible = true | |
315 list_scroll_pane.scroll_to_right() | |
316 end | |
317 add_menu_bar(window) | 332 add_menu_bar(window) |
318 frame.pack() | 333 frame.pack() |
319 if config.location ~= nil then | 334 if config.location ~= nil then |
320 frame.location = config.location | 335 frame.location = config.location |
321 end | 336 end |