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