1 def save (item : FileItem) (text_box : MultilineTextBox) = 2 let text = text_box.display_text 3 text.trim_end 4 if not text.ends_with_blank_line then 5 text.add_empty_line 6 7 let count = text.lines.size 8 let sb = StringBuilder.new 9 let mut index = 0 10 for line in text.lines do 11 if index == count - 1 then 12 assert line.as_string == "\n" 13 else 14 if line.as_string.ends_with " \n" then 15 line.trim_end 16 17 sb.append line.as_string 18 19 index += 1 20 21 let path = item.actual_path 22 fs/write_file path sb.as_string 23 item.modified = fs/modified_time path 24 let mut cursor_pos = text_box.cursor_pos 25 if cursor_pos.line >= text.lines.size then 26 cursor_pos.line = text.lines.size - 1 27 28 let char_count = text.lines[cursor_pos.line].length 29 if cursor_pos.char >= char_count then 30 cursor_pos.char = char_count - 1 31 32 text_box.cursor_pos = cursor_pos 33 34 type Editor 35 def save_all = 36 let files = content_changed.to_list 37 for file in files.filter { _.actual_path.is_not_empty } do 38 let tab_item = file_item_tab_items[file] 39 let text_box = tab_item_text_boxes[tab_item] 40 assert text_box.is_changed 41 save file text_box 42 text_box.is_changed = false 43 44 assert content_changed.is_empty 45 || content_changed.all { _.actual_path.is_empty } 46