text_document/
text_document.rs

1use crate::block::Block;
2use crate::frame::Frame;
3use crate::image::Image;
4use crate::text::Text;
5use crate::text_cursor::TextCursor;
6use crate::text_document::Element::{BlockElement, FrameElement, ImageElement, TextElement};
7use array_tool::vec::Intersect;
8use std::cell::RefCell;
9use std::collections::{BTreeMap, HashMap};
10use std::rc::{Rc, Weak};
11use uuid::Uuid;
12
13//#[cfg(test)]
14//use std::{println as info, println as warn};
15
16use thiserror::Error;
17
18pub type ElementUuid = usize;
19
20#[derive(PartialEq, Clone)]
21pub struct TextDocument {
22    //formats: Vec<Format>,
23    element_manager: Rc<ElementManager>,
24    uuid: Uuid,
25}
26
27impl Default for TextDocument {
28    fn default() -> Self {
29        Self::new()
30    }
31}
32
33impl TextDocument {
34    pub fn new() -> Self {
35        let element_manager = ElementManager::new_rc();
36        // let mut element_manager = document.element_manager;
37        // element_manager.self_weak = document.element_manager
38
39        let document = Self {
40            element_manager: element_manager.clone(),
41            uuid: Uuid::new_v4(),
42        };
43        // root frame:
44        ElementManager::create_root_frame(element_manager);
45        document
46    }
47
48    pub fn block_list(&self) -> Vec<Weak<Block>> {
49        self.element_manager
50            .block_list()
51            .into_iter()
52            .map(|block| Rc::downgrade(&block))
53            .collect()
54    }
55
56    pub fn root_frame(&self) -> Weak<Frame> {
57        Rc::downgrade(&self.element_manager.root_frame())
58    }
59
60    /// Character count, without counting new line character \n
61    pub fn character_count(&self) -> usize {
62        let mut counter: usize = 0;
63
64        self.element_manager
65            .block_list()
66            .into_iter()
67            .for_each(|block| {
68                counter += block.text_length();
69            });
70
71        counter
72    }
73
74    pub fn find_block(&self, position: usize) -> Option<Weak<Block>> {
75        self.element_manager
76            .find_block(position)
77            .map(|block| Rc::downgrade(&block))
78    }
79
80    pub fn first_block(&self) -> Weak<Block> {
81        Rc::downgrade(&self.element_manager.first_block().unwrap())
82    }
83
84    pub fn last_block(&self) -> Weak<Block> {
85        Rc::downgrade(&self.element_manager.last_block().unwrap())
86    }
87
88    pub fn block_count(&self) -> usize {
89        self.element_manager.block_count()
90    }
91
92    pub fn create_cursor(&self) -> TextCursor {
93        TextCursor::new(self.element_manager.clone())
94    }
95
96    pub fn set_plain_text<S: Into<String>>(&mut self, plain_text: S) -> Result<(), ModelError> {
97        let plain_text: String = plain_text.into();
98
99        self.element_manager.clear();
100
101        let frame = self.element_manager.create_empty_root_frame();
102
103        for text in plain_text.split('\n') {
104            let block = self
105                .element_manager
106                .insert_new_block(frame.uuid(), InsertMode::AsChild)?;
107            let text_rc = self
108                .element_manager
109                .insert_new_text(block.uuid(), InsertMode::AsChild)?;
110            text_rc.set_text(&text.to_string());
111        }
112
113        // signaling changes
114        self.element_manager
115            .signal_for_text_change(0, 0, plain_text.len());
116        self.element_manager.signal_for_element_change(
117            self.element_manager.get(0).unwrap(),
118            ChangeReason::ChildrenChanged,
119        );
120
121        Ok(())
122    }
123
124    pub fn to_plain_text(&self) -> String {
125        let mut string_list = Vec::new();
126
127        self.element_manager
128            .list_all_children(0)
129            .iter()
130            .filter_map(|element| match element {
131                BlockElement(block) => Some(block.plain_text()),
132                _ => None,
133            })
134            .for_each(|string| string_list.push(string));
135
136        string_list.join("\n")
137    }
138
139    /// Remove all elements and build a minimal set of element: a Frame, a Block and its empty Text
140    pub fn clear(&mut self) -> Result<(), ModelError> {
141        self.element_manager.clear();
142        let frame = self.element_manager.create_empty_root_frame();
143        let block = self
144            .element_manager
145            .insert_new_block(frame.uuid(), InsertMode::AsChild)?;
146        self.element_manager
147            .insert_new_text(block.uuid(), InsertMode::AsChild)?;
148
149        Ok(())
150    }
151
152    pub fn print_debug_elements(&self) {
153        self.element_manager.debug_elements();
154    }
155
156    /// Signal the the text change at position, number of removed characters and number of added characters.
157    pub fn add_text_change_callback(&self, callback: fn(usize, usize, usize)) {
158        self.element_manager.add_text_change_callback(callback);
159    }
160
161    ///  Signal the modified element with the reason. If two direct children elements changed at the same time.
162    pub fn add_element_change_callback(&self, callback: fn(Element, ChangeReason)) {
163        self.element_manager.add_element_change_callback(callback);
164    }
165}
166
167#[derive(Default, PartialEq, Clone, Debug)]
168pub struct TextDocumentOption {
169    pub tabs: Vec<Tab>,
170    pub text_direction: TextDirection,
171    pub wrap_mode: WrapMode,
172}
173
174#[derive(Default, Eq, PartialEq, Clone, Debug)]
175pub struct Tab {
176    pub position: usize,
177    pub tab_type: TabType,
178    pub delimiter: char,
179}
180
181#[derive(Eq, PartialEq, Clone, Copy, Debug)]
182pub enum TabType {
183    LeftTab,
184    RightTab,
185    CenterTab,
186    DelimiterTab,
187}
188
189impl Default for TabType {
190    fn default() -> Self {
191        TabType::LeftTab
192    }
193}
194
195#[derive(Eq, PartialEq, Clone, Copy, Debug)]
196pub enum TextDirection {
197    LeftToRight,
198    RightToLeft,
199}
200
201impl Default for TextDirection {
202    fn default() -> Self {
203        TextDirection::LeftToRight
204    }
205}
206
207#[derive(Eq, PartialEq, Clone, Copy, Debug)]
208pub enum WrapMode {
209    NoWrap,
210    WordWrap,
211    WrapAnywhere,
212    WrapAtWordBoundaryOrAnywhere,
213}
214
215impl Default for WrapMode {
216    fn default() -> Self {
217        WrapMode::WordWrap
218    }
219}
220
221pub(crate) enum InsertMode {
222    Before,
223    After,
224    AsChild,
225}
226
227type ElementChangeCallbacks = RefCell<Vec<fn(Element, ChangeReason)>>;
228type TextChangeCallbacks = RefCell<Vec<fn(usize, usize, usize)>>;
229
230#[derive(Clone, Debug)]
231pub(crate) struct ElementManager {
232    self_weak: RefCell<Weak<ElementManager>>,
233    text_change_callbacks: TextChangeCallbacks,
234    element_change_callbacks: ElementChangeCallbacks,
235    tree_model: RefCell<TreeModel>,
236}
237
238impl PartialEq for ElementManager {
239    fn eq(&self, other: &Self) -> bool {
240        self.tree_model == other.tree_model
241    }
242}
243
244impl ElementManager {
245    pub(crate) fn new_rc() -> Rc<Self> {
246        let rc = Rc::new(Self {
247            tree_model: Default::default(),
248            self_weak: RefCell::new(Weak::new()),
249            text_change_callbacks: Default::default(),
250            element_change_callbacks: Default::default(),
251        });
252        let new_self_weak = RefCell::new(Rc::downgrade(&rc));
253        rc.self_weak.swap(&new_self_weak);
254        rc
255    }
256
257    // only used while creating a new document
258    pub(crate) fn create_root_frame(element_manager: Rc<ElementManager>) -> Rc<Frame> {
259        let new_frame = Rc::new(Frame::new(Rc::downgrade(&element_manager)));
260
261        let new_element = Element::FrameElement(new_frame.clone());
262
263        let mut tree_model = element_manager.tree_model.borrow_mut();
264        tree_model.set_root_element(new_element);
265
266        // create a first empty block
267
268        let new_block = Rc::new(Block::new(Rc::downgrade(&element_manager)));
269
270        let new_block_element = Element::BlockElement(new_block);
271
272        let block_uuid = tree_model.insert_as_child(0, new_block_element).unwrap();
273
274        // create a first empty text element
275
276        let new_text = Rc::new(Text::new(Rc::downgrade(&element_manager)));
277
278        let new_text_element = Element::TextElement(new_text);
279
280        tree_model
281            .insert_as_child(block_uuid, new_text_element)
282            .unwrap();
283
284        tree_model.recalculate_sort_order();
285
286        new_frame
287    }
288
289    fn create_empty_root_frame(&self) -> Rc<Frame> {
290        let new_frame = Rc::new(Frame::new(self.self_weak.borrow().clone()));
291
292        let new_element = Element::FrameElement(new_frame.clone());
293
294        self.tree_model.borrow_mut().set_root_element(new_element);
295        self.tree_model.borrow_mut().recalculate_sort_order();
296
297        new_frame
298    }
299
300    pub(crate) fn insert_new_frame(
301        &self,
302        target_uuid: usize,
303        insert_mode: InsertMode,
304    ) -> Result<Rc<Frame>, ModelError> {
305        let new_frame = Rc::new(Frame::new(self.self_weak.borrow().clone()));
306
307        let new_element = Element::FrameElement(new_frame.clone());
308
309        self.insert(new_element.clone(), target_uuid, insert_mode)?;
310        // verify:
311        let parent_element = match self.get_parent_element(&new_element) {
312            Some(element) => element,
313            None => return Err(ModelError::ElementNotFound("No parent found".to_string())),
314        };
315        new_frame.verify_rule_with_parent(&parent_element)?;
316
317        self.tree_model.borrow_mut().recalculate_sort_order();
318
319        Ok(new_frame)
320    }
321
322    pub(crate) fn insert_new_block(
323        &self,
324        target_uuid: usize,
325        insert_mode: InsertMode,
326    ) -> Result<Rc<Block>, ModelError> {
327        let new_block = Rc::new(Block::new(self.self_weak.borrow().clone()));
328
329        let new_element = Element::BlockElement(new_block.clone());
330
331        self.insert(new_element.clone(), target_uuid, insert_mode)?;
332        // verify:
333        let parent_element = match self.get_parent_element(&new_element) {
334            Some(element) => element,
335            None => return Err(ModelError::ElementNotFound("No parent found".to_string())),
336        };
337        new_block.verify_rule_with_parent(&parent_element)?;
338
339        self.tree_model.borrow_mut().recalculate_sort_order();
340
341        Ok(new_block)
342    }
343
344    pub(crate) fn insert_new_text(
345        &self,
346        target_uuid: usize,
347        insert_mode: InsertMode,
348    ) -> Result<Rc<Text>, ModelError> {
349        let new_text = Rc::new(Text::new(self.self_weak.borrow().clone()));
350
351        let new_element = Element::TextElement(new_text.clone());
352
353        self.insert(new_element.clone(), target_uuid, insert_mode)?;
354        // verify:
355        let parent_element = match self.get_parent_element(&new_element) {
356            Some(element) => element,
357            None => return Err(ModelError::ElementNotFound("No parent found".to_string())),
358        };
359        new_text.verify_rule_with_parent(&parent_element)?;
360        self.tree_model.borrow_mut().recalculate_sort_order();
361
362        Ok(new_text)
363    }
364
365    pub(crate) fn insert_new_image(
366        &self,
367        target_uuid: usize,
368        insert_mode: InsertMode,
369    ) -> Result<Rc<Image>, ModelError> {
370        let new_image = Rc::new(Image::new(self.self_weak.borrow().clone()));
371
372        let new_element = Element::ImageElement(new_image.clone());
373
374        self.insert(new_element.clone(), target_uuid, insert_mode)?;
375        // verify:
376        let parent_element = match self.get_parent_element(&new_element) {
377            Some(element) => element,
378            None => return Err(ModelError::ElementNotFound("No parent found".to_string())),
379        };
380        new_image.verify_rule_with_parent(&parent_element)?;
381        self.tree_model.borrow_mut().recalculate_sort_order();
382
383        Ok(new_image)
384    }
385
386    pub(crate) fn insert(
387        &self,
388        element: Element,
389        target_uuid: usize,
390        insert_mode: InsertMode,
391    ) -> Result<usize, ModelError> {
392        let mut tree_model = self.tree_model.borrow_mut();
393
394        match insert_mode {
395            InsertMode::Before => tree_model.insert_before(target_uuid, element),
396            InsertMode::After => tree_model.insert_after(target_uuid, element),
397            InsertMode::AsChild => tree_model.insert_as_child(target_uuid, element),
398        }
399    }
400
401    // remove a list of element's uuids. Ignore errors.
402    pub(crate) fn remove(&self, uuid_list: Vec<usize>) {
403        if uuid_list.contains(&0) {
404            self.clear();
405        } else {
406            let mut tree_model = self.tree_model.borrow_mut();
407            uuid_list.iter().for_each(|uuid| {
408                tree_model.remove_recursively(*uuid).unwrap_or_default();
409            });
410        }
411    }
412
413    /// Give a count of the blocks
414    pub(crate) fn block_count(&self) -> usize {
415        let mut counter = 0;
416        let tree_model = self.tree_model.borrow();
417        tree_model.iter().for_each(|element| {
418            counter += match element {
419                BlockElement(_) => 1,
420                _ => 0,
421            }
422        });
423        counter
424    }
425
426    pub(crate) fn block_list(&self) -> Vec<Rc<Block>> {
427        let tree_model = self.tree_model.borrow();
428
429        tree_model
430            .iter()
431            .filter_map(|x| match x {
432                BlockElement(block) => Some(block.clone()),
433                _ => None,
434            })
435            .collect()
436    }
437
438    /// get the common ancestor, typacally a frame. At worst, ancestor is 0, meaning the root frame
439    pub(crate) fn find_common_ancestor(
440        &self,
441        first_element_uuid: usize,
442        second_element_uuid: usize,
443    ) -> ElementUuid {
444        let tree_model = self.tree_model.borrow();
445
446        tree_model.find_common_ancestor(first_element_uuid, second_element_uuid)
447    }
448
449    /// get the common ancestor, typacally a frame. At worst, ancestor is 0, meaning the root frame
450    pub(crate) fn find_ancestor_of_first_which_is_sibling_of_second(
451        &self,
452        first_element_uuid: ElementUuid,
453        second_element_uuid: ElementUuid,
454    ) -> Option<ElementUuid> {
455        let tree_model = self.tree_model.borrow();
456
457        tree_model.find_ancestor_of_first_which_is_sibling_of_second(
458            first_element_uuid,
459            second_element_uuid,
460        )
461    }
462
463    pub(crate) fn root_frame(&self) -> Rc<Frame> {
464        let tree_model = self.tree_model.borrow();
465        let element = tree_model.get_root_element().unwrap();
466
467        if let Element::FrameElement(c) = element {
468            c.clone()
469        } else {
470            unreachable!()
471        }
472    }
473
474    pub(crate) fn find_block(&self, position: usize) -> Option<Rc<Block>> {
475        for rc_block in self.block_list() {
476            if (rc_block.position()..=rc_block.end()).contains(&position) {
477                return Some(rc_block);
478            }
479        }
480
481        None
482    }
483
484    pub(crate) fn get_parent_frame(&self, element: &Element) -> Option<Rc<Frame>> {
485        let child_uuid = self.get_element_uuid(element);
486
487        let tree_model = self.tree_model.borrow();
488        let parent_uuid = tree_model.get_parent_uuid(child_uuid)?;
489
490        let parent_element = tree_model.get(parent_uuid)?;
491
492        match parent_element {
493            FrameElement(frame_rc) => Some(frame_rc.clone()),
494            BlockElement(_) => None,
495            TextElement(_) => None,
496            ImageElement(_) => None,
497        }
498    }
499
500    pub(crate) fn get_parent_element(&self, element: &Element) -> Option<Element> {
501        let child_uuid = self.get_element_uuid(element);
502
503        self.get_parent_element_using_uuid(child_uuid)
504    }
505
506    pub(crate) fn get_parent_element_using_uuid(&self, uuid: ElementUuid) -> Option<Element> {
507        let tree_model = self.tree_model.borrow();
508        let parent_uuid = tree_model.get_parent_uuid(uuid)?;
509
510        tree_model.get(parent_uuid).cloned()
511    }
512
513    /// Get uuid of the element
514    pub(crate) fn get_element_uuid(&self, element: &Element) -> usize {
515        match element {
516            FrameElement(frame_rc) => frame_rc.uuid(),
517            BlockElement(block_rc) => block_rc.uuid(),
518            TextElement(text_rc) => text_rc.uuid(),
519            ImageElement(image_rc) => image_rc.uuid(),
520        }
521    }
522
523    pub(crate) fn get_level(&self, uuid: usize) -> usize {
524        let tree_model = self.tree_model.borrow();
525        tree_model.get_level(uuid)
526    }
527    pub(crate) fn recalculate_sort_order(&self) {
528        let mut tree_model = self.tree_model.borrow_mut();
529        tree_model.recalculate_sort_order();
530    }
531
532    pub(crate) fn previous_element(&self, uuid: usize) -> Option<Element> {
533        let tree_model = self.tree_model.borrow();
534        tree_model
535            .iter()
536            .take_while(|element| element.uuid() != uuid)
537            .last()
538            .cloned()
539    }
540
541    pub(crate) fn next_element(&self, uuid: usize) -> Option<Element> {
542        let tree_model = self.tree_model.borrow();
543        tree_model
544            .iter()
545            .skip_while(|element| element.uuid() != uuid)
546            .nth(1)
547            .cloned()
548    }
549
550    /// Get element sort order
551    pub(crate) fn get_element_order(&self, element: Element) -> Option<usize> {
552        let tree_model = self.tree_model.borrow();
553        let target_uuid = self.get_element_uuid(&element);
554
555        tree_model.get_sort_order(target_uuid)
556    }
557
558    // Give element using uuid
559    pub(crate) fn get(&self, uuid: usize) -> Option<Element> {
560        let tree_model = self.tree_model.borrow();
561        tree_model.get(uuid).cloned()
562    }
563
564    pub(crate) fn find_frame(&self, position: usize) -> Option<Rc<Frame>> {
565        let block = self
566            .block_list()
567            .into_iter()
568            .find(|rc_block| (rc_block.position()..rc_block.end()).contains(&position));
569
570        match block {
571            Some(block_rc) => self.get_parent_frame(&BlockElement(block_rc)),
572            None => None,
573        }
574    }
575
576    pub(crate) fn last_block(&self) -> Option<Rc<Block>> {
577        self.block_list().last().cloned()
578    }
579
580    pub(crate) fn first_block(&self) -> Option<Rc<Block>> {
581        self.block_list().first().cloned()
582    }
583
584    /// list recursively all elements having uuid as their common ancestor
585    pub(crate) fn list_all_children(&self, uuid: usize) -> Vec<Element> {
586        let tree_model = self.tree_model.borrow();
587        let children = tree_model.list_all_children(uuid);
588
589        children
590            .iter()
591            .filter_map(|element_uuid| self.get(*element_uuid))
592            .collect()
593    }
594
595    /// list only the direct children elements having uuid as their common ancestor
596    pub(crate) fn list_all_direct_children(&self, uuid: usize) -> Vec<Element> {
597        let tree_model = self.tree_model.borrow();
598        let children = tree_model.list_all_direct_children(uuid);
599
600        children
601            .iter()
602            .filter_map(|element_uuid| self.get(*element_uuid))
603            .collect()
604    }
605
606    /// remove all elements and recreate a combo frame/block/text
607    pub(crate) fn clear(&self) {
608        {
609            let mut tree_model = self.tree_model.borrow_mut();
610            tree_model.clear();
611        }
612
613        ElementManager::create_root_frame(self.self_weak.borrow().upgrade().unwrap());
614    }
615
616    pub(crate) fn fill_empty_frames(&self) {
617        // find empty frames
618        let tree_model = self.tree_model.borrow();
619        let empty_frames: Vec<ElementUuid> = tree_model
620            .iter()
621            .filter_map(|element| match element {
622                FrameElement(frame) => {
623                    if !tree_model.has_children(frame.uuid()) {
624                        Some(frame.uuid())
625                    } else {
626                        None
627                    }
628                }
629                _ => None,
630            })
631            .collect();
632
633        // fill these frames
634        for frame_uuid in empty_frames {
635            let block = self
636                .insert_new_block(frame_uuid, InsertMode::AsChild)
637                .unwrap();
638            self.insert_new_text(block.uuid(), InsertMode::AsChild)
639                .unwrap();
640        }
641    }
642
643    pub(crate) fn debug_elements(&self) {
644        let mut indent_with_string = vec![(0, 0, 0, "------------\n".to_string())];
645
646        println!("debug_elements");
647        let tree_model = self.tree_model.borrow();
648
649        tree_model.iter().for_each(|element| {
650            match element {
651                FrameElement(frame) => indent_with_string.push((
652                    tree_model.get_level(frame.uuid()),
653                    frame.uuid(),
654                    tree_model.get_sort_order(frame.uuid()).unwrap(),
655                    "frame".to_string(),
656                )),
657                BlockElement(block) => indent_with_string.push((
658                    tree_model.get_level(block.uuid()),
659                    block.uuid(),
660                    tree_model.get_sort_order(block.uuid()).unwrap(),
661                    "block".to_string(),
662                )),
663                TextElement(text) => indent_with_string.push((
664                    tree_model.get_level(text.uuid()),
665                    text.uuid(),
666                    tree_model.get_sort_order(text.uuid()).unwrap(),
667                    "text".to_string(),
668                )),
669                ImageElement(image) => indent_with_string.push((
670                    tree_model.get_level(image.uuid()),
671                    image.uuid(),
672                    tree_model.get_sort_order(image.uuid()).unwrap(),
673                    "[image]".to_string(),
674                )),
675            };
676        });
677
678        indent_with_string
679            .iter()
680            .for_each(|(indent, uuid, sort_order, string)| {
681                println!(
682                    "{}{} {} \'{}\'",
683                    " ".repeat(*indent),
684                    *uuid,
685                    *sort_order,
686                    string.as_str()
687                )
688            });
689        indent_with_string.clear();
690
691        tree_model.iter().for_each(|element| {
692            match element {
693                FrameElement(frame) => indent_with_string.push((
694                    tree_model.get_level(frame.uuid()),
695                    frame.uuid(),
696                    tree_model.get_sort_order(frame.uuid()).unwrap(),
697                    "frame".to_string(),
698                )),
699                BlockElement(block) => indent_with_string.push((
700                    tree_model.get_level(block.uuid()),
701                    block.uuid(),
702                    tree_model.get_sort_order(block.uuid()).unwrap(),
703                    "block ".to_string() + &block.plain_text(),
704                )),
705                TextElement(text) => indent_with_string.push((
706                    tree_model.get_level(text.uuid()),
707                    text.uuid(),
708                    tree_model.get_sort_order(text.uuid()).unwrap(),
709                    "text ".to_string() + &text.plain_text(),
710                )),
711                ImageElement(image) => indent_with_string.push((
712                    tree_model.get_level(image.uuid()),
713                    image.uuid(),
714                    tree_model.get_sort_order(image.uuid()).unwrap(),
715                    "[image] ".to_string() + &image.plain_text(),
716                )),
717            };
718        });
719
720        indent_with_string
721            .iter()
722            .for_each(|(indent, uuid, sort_order, string)| {
723                println!(
724                    "{}{} {} \'{}\'",
725                    " ".repeat(*indent),
726                    *uuid,
727                    *sort_order,
728                    string.as_str()
729                )
730            });
731    }
732
733    /// Signal the number of removed characters and number of added characters with the reference of a cursor position.
734    pub(crate) fn signal_for_text_change(
735        &self,
736        position: usize,
737        removed_characters: usize,
738        added_character: usize,
739    ) {
740        self.text_change_callbacks
741            .borrow()
742            .iter()
743            .for_each(|callback| callback(position, removed_characters, added_character));
744    }
745
746    /// Add callback for when there is a change, giving the number of removed characters and number of added characters with the reference of a cursor position.
747    pub(self) fn add_text_change_callback(&self, callback: fn(usize, usize, usize)) {
748        self.text_change_callbacks.borrow_mut().push(callback);
749    }
750
751    /// Signal for when an element (and/or more than one child Blocks) is modified. If only one Block is modified, only an element Block is sent.
752    pub(crate) fn signal_for_element_change(&self, changed_element: Element, reason: ChangeReason) {
753        self.element_change_callbacks
754            .borrow()
755            .iter()
756            .for_each(|callback| callback(changed_element.clone(), reason));
757    }
758
759    /// Add callback for when an element (and/or more than one child Blocks) is modified. If only one Block is modified, only an element Block is sent.
760    pub(self) fn add_element_change_callback(&self, callback: fn(Element, ChangeReason)) {
761        self.element_change_callbacks.borrow_mut().push(callback);
762    }
763
764    pub(crate) fn move_while_changing_parent(
765        &self,
766        uuid_to_move: usize,
767        new_parent_uuid: usize,
768    ) -> Result<(), ModelError> {
769        let mut tree_model = self.tree_model.borrow_mut();
770        tree_model.move_while_changing_parent(uuid_to_move, new_parent_uuid)
771    }
772}
773
774#[derive(Default, PartialEq, Clone, Debug)]
775struct TreeModel {
776    id_with_element_hash: HashMap<usize, Element>,
777    order_with_id_map: BTreeMap<usize, usize>,
778    child_id_with_parent_id_hash: HashMap<usize, usize>,
779    id_counter: usize,
780}
781
782impl TreeModel {
783    const STEP: usize = 1000;
784
785    pub(crate) fn new() -> Self {
786        Self {
787            id_with_element_hash: Default::default(),
788            order_with_id_map: Default::default(),
789            child_id_with_parent_id_hash: Default::default(),
790            id_counter: Default::default(),
791        }
792    }
793    // to be called after an operation
794    pub(crate) fn recalculate_sort_order(&mut self) {
795        let mut new_order = 0;
796
797        let mut new_map: BTreeMap<usize, usize> = BTreeMap::new();
798
799        for (_order, id) in self.order_with_id_map.iter() {
800            new_map.insert(new_order, *id);
801            new_order += Self::STEP;
802        }
803
804        self.order_with_id_map = new_map;
805    }
806
807    fn iter(&self) -> TreeIter {
808        TreeIter::new(self)
809    }
810
811    fn get_new_uuid(&mut self) -> usize {
812        self.id_counter += 1;
813        self.id_counter
814    }
815
816    fn number_of_ancestors(&self, child_id: &usize) -> usize {
817        let mut number_of_ancestors: usize = 0;
818        let mut loop_child_id = child_id;
819
820        loop {
821            match self.child_id_with_parent_id_hash.get(loop_child_id) {
822                Some(parent) => match parent {
823                    0 => {
824                        number_of_ancestors += 1;
825                        break;
826                    }
827
828                    _ => {
829                        number_of_ancestors += 1;
830                        loop_child_id = parent;
831                    }
832                },
833                None => unreachable!(),
834            }
835        }
836        number_of_ancestors
837    }
838
839    pub(self) fn set_root_element(&mut self, element: Element) {
840        self.clear();
841
842        self.id_with_element_hash.insert(0, element);
843        self.order_with_id_map.insert(0, 0);
844        self.child_id_with_parent_id_hash.insert(0, 0);
845
846        self.recalculate_sort_order();
847    }
848
849    pub(self) fn insert_after(
850        &mut self,
851        sibling_uuid: usize,
852        mut element: Element,
853    ) -> Result<usize, ModelError> {
854        if sibling_uuid == self.get_root_element().unwrap().uuid() {
855            return Err(ModelError::ForbiddenOperation(
856                "can't add by root element".to_string(),
857            ));
858        }
859        if self.get_parent_uuid(sibling_uuid).is_none() {
860            return Err(ModelError::ElementNotFound("no parent element".to_string()));
861        }
862        let parent_uuid = match self.get_parent_uuid(sibling_uuid) {
863            Some(parent_uuid) => parent_uuid,
864            None => unreachable!(),
865        };
866
867        // determine safe sort order
868
869        let safe_sort_order = match self.get_next_sibling(sibling_uuid) {
870            Some(next_sibling_id) => match self.get_sort_order(next_sibling_id) {
871                Some(sort_order) => sort_order - 1,
872                None => unreachable!(),
873            },
874            // get next parent element or one of the grand parent
875            None => {
876                let parent_level = self.get_level(parent_uuid);
877                let next_items: Vec<(&usize, &usize)> = self
878                    .order_with_id_map
879                    .iter()
880                    // dismiss previous items
881                    .skip_while(|(&_order, &id)| parent_uuid != id)
882                    .skip(1)
883                    .skip_while(|(&_order, &id)| self.get_level(id) > parent_level)
884                    .collect();
885                match next_items.first() {
886                    Some(item) => {
887                        if *item.0 == 0 {
888                            usize::MAX - Self::STEP
889                        } else {
890                            item.0 - 1
891                        }
892                    }
893                    // extreme bottom of the tree
894                    None => usize::MAX - Self::STEP,
895                }
896            }
897        };
898
899        let new_uuid = self.get_new_uuid();
900        element.set_uuid(new_uuid);
901
902        self.id_with_element_hash.insert(new_uuid, element);
903        self.order_with_id_map.insert(safe_sort_order, new_uuid);
904        self.child_id_with_parent_id_hash
905            .insert(new_uuid, parent_uuid);
906
907        self.recalculate_sort_order();
908        Ok(new_uuid)
909    }
910
911    pub(self) fn insert_before(
912        &mut self,
913        sibling_uuid: usize,
914        mut element: Element,
915    ) -> Result<usize, ModelError> {
916        if sibling_uuid == self.get_root_element().unwrap().uuid() {
917            return Err(ModelError::ForbiddenOperation(
918                "can't add by root element".to_string(),
919            ));
920        }
921
922        if self.get_parent_uuid(sibling_uuid).is_none() {
923            return Err(ModelError::ElementNotFound("no parent element".to_string()));
924        }
925
926        let parent_uuid = match self.get_parent_uuid(sibling_uuid) {
927            Some(parent_uuid) => parent_uuid,
928            None => unreachable!(),
929        };
930
931        let safe_sort_order = match self.get_sort_order(sibling_uuid) {
932            Some(sort_order) => sort_order - 1,
933            None => unreachable!(),
934        };
935
936        let new_uuid = self.get_new_uuid();
937        element.set_uuid(new_uuid);
938
939        self.id_with_element_hash.insert(new_uuid, element);
940        self.order_with_id_map.insert(safe_sort_order, new_uuid);
941        self.child_id_with_parent_id_hash
942            .insert(new_uuid, parent_uuid);
943
944        self.recalculate_sort_order();
945        Ok(new_uuid)
946    }
947
948    /// insert add child of parent uuid, returns uuid of new element
949    pub(self) fn insert_as_child(
950        &mut self,
951        parent_uuid: usize,
952        mut element: Element,
953    ) -> Result<usize, ModelError> {
954        // determine safe sort order
955
956        let safe_sort_order = match self.get_next_sibling(parent_uuid) {
957            Some(next_sibling_id) => match self.get_sort_order(next_sibling_id) {
958                Some(sort_order) => sort_order - 1,
959                None => unreachable!(),
960            },
961            // get next element
962            None => {
963                let parent_level = self.get_level(parent_uuid);
964                let next_items: Vec<(&usize, &usize)> = self
965                    .order_with_id_map
966                    .iter()
967                    .skip_while(|(_order, id)| parent_uuid != **id)
968                    .skip_while(|(_order, id)| self.get_level(**id) >= parent_level)
969                    .collect();
970                match next_items.first() {
971                    Some(item) => item.0 - 1,
972                    // extreme bottom of the tree
973                    None => usize::MAX - Self::STEP,
974                }
975            }
976        };
977
978        let new_uuid = self.get_new_uuid();
979        element.set_uuid(new_uuid);
980
981        self.id_with_element_hash.insert(new_uuid, element);
982        self.order_with_id_map.insert(safe_sort_order, new_uuid);
983        self.child_id_with_parent_id_hash
984            .insert(new_uuid, parent_uuid);
985
986        self.recalculate_sort_order();
987        Ok(new_uuid)
988    }
989
990    fn get_next_sibling(&self, uuid: usize) -> Option<usize> {
991        let parent_uuid = self.get_parent_uuid(uuid)?;
992
993        let siblings: Vec<&usize> = self
994            .child_id_with_parent_id_hash
995            .iter()
996            .filter_map(|(child_id, parent_id)| {
997                if *parent_id == parent_uuid && uuid != *child_id && *child_id != 0 {
998                    Some(child_id)
999                } else {
1000                    None
1001                }
1002            })
1003            .collect();
1004
1005        if siblings.is_empty() {
1006            return None;
1007        }
1008
1009        let next_sibling = self
1010            .order_with_id_map
1011            .iter()
1012            .skip_while(|(_order, id)| *id != &uuid)
1013            .skip(1)
1014            .find(|(_order, id)| siblings.contains(&id))?;
1015
1016        Some(next_sibling.1.to_owned())
1017    }
1018
1019    // pub(self) fn swap(&mut self, uuid: ElementUuid, mut element: Element) {
1020    //     unimplemented!()
1021    // }
1022
1023    pub(self) fn remove_recursively(
1024        &mut self,
1025        uuid: ElementUuid,
1026    ) -> Result<Vec<ElementUuid>, ModelError> {
1027        let mut uuids_to_remove = self.list_all_children(uuid);
1028        uuids_to_remove.push(uuid);
1029
1030        for element_uuid in &uuids_to_remove {
1031            self.remove(*element_uuid)?;
1032        }
1033
1034        Ok(uuids_to_remove)
1035    }
1036
1037    fn remove(&mut self, uuid: ElementUuid) -> Result<ElementUuid, ModelError> {
1038        let id = self
1039            .order_with_id_map
1040            .remove_entry(
1041                &self
1042                    .get_sort_order(uuid)
1043                    .ok_or_else(|| ModelError::ElementNotFound(uuid.to_string()))?,
1044            )
1045            .ok_or_else(|| ModelError::ElementNotFound(uuid.to_string()))?
1046            .1;
1047
1048        self.child_id_with_parent_id_hash
1049            .remove_entry(&uuid)
1050            .ok_or_else(|| ModelError::ElementNotFound(uuid.to_string()))?;
1051
1052        self.id_with_element_hash
1053            .remove_entry(&uuid)
1054            .ok_or_else(|| ModelError::ElementNotFound(uuid.to_string()))?;
1055
1056        Ok(id)
1057    }
1058
1059    pub(self) fn list_all_children(&self, uuid: usize) -> Vec<usize> {
1060        let element_level = self.get_level(uuid);
1061
1062        self.iter()
1063            .skip_while(|element| element.uuid() != uuid)
1064            // skip current element
1065            .skip(1)
1066            // keep only children
1067            .take_while(|element| element_level < self.get_level(element.uuid()))
1068            .map(|element| element.uuid())
1069            .collect()
1070    }
1071
1072    pub(self) fn list_all_direct_children(&self, uuid: usize) -> Vec<usize> {
1073        let unordered_child_list: Vec<usize> = self
1074            .child_id_with_parent_id_hash
1075            .iter()
1076            .filter_map(|(child_id, parent_id)| {
1077                if *parent_id == uuid && *child_id != 0 {
1078                    Some(*child_id)
1079                } else {
1080                    None
1081                }
1082            })
1083            .collect();
1084
1085        let ordered_child_list: Vec<usize> = self
1086            .order_with_id_map
1087            .iter()
1088            .filter_map(|(_order, id)| {
1089                if unordered_child_list.contains(id) {
1090                    Some(*id)
1091                } else {
1092                    None
1093                }
1094            })
1095            .collect();
1096
1097        ordered_child_list
1098    }
1099
1100    fn get_parent_uuid(&self, uuid: usize) -> Option<usize> {
1101        // exception for root
1102        if uuid == 0 {
1103            return None;
1104        }
1105
1106        self.child_id_with_parent_id_hash.get(&uuid).copied()
1107    }
1108
1109    fn get_level(&self, uuid: usize) -> usize {
1110        let mut child_id = uuid;
1111        let mut level = 0;
1112
1113        while let Some(&parent_id) = self.child_id_with_parent_id_hash.get(&child_id) {
1114            if child_id == 0 {
1115                break;
1116            }
1117
1118            child_id = parent_id;
1119            level += 1;
1120        }
1121
1122        level
1123    }
1124
1125    /// get the common ancestor, typacally a frame. At worst, ancestor is 0, meaning the root frame
1126    pub(self) fn find_ancestor_of_first_which_is_sibling_of_second(
1127        &self,
1128        first_element_uuid: ElementUuid,
1129        second_element_uuid: ElementUuid,
1130    ) -> Option<ElementUuid> {
1131        let mut ancestors_of_first_element: Vec<usize> = Vec::new();
1132
1133        let mut child_id = first_element_uuid;
1134
1135        // find ancestors for first
1136        while let Some(&parent_id) = self.child_id_with_parent_id_hash.get(&child_id) {
1137            if child_id == 0 {
1138                break;
1139            }
1140            ancestors_of_first_element.push(parent_id);
1141
1142            child_id = parent_id;
1143        }
1144
1145        // compare and get the ancestor
1146
1147        let second_element_all_siblings = self.get_all_siblings(second_element_uuid);
1148
1149        let sibling = ancestors_of_first_element.intersect(second_element_all_siblings);
1150
1151        sibling.first().copied()
1152    }
1153
1154    pub(self) fn get_all_siblings(&self, uuid: ElementUuid) -> Vec<ElementUuid> {
1155        let parent_uuid = match self.get_parent_uuid(uuid) {
1156            Some(parent_uuid) => parent_uuid,
1157            None => return Vec::new(),
1158        };
1159
1160        self.child_id_with_parent_id_hash
1161            .iter()
1162            .filter_map(|(child_id, parent_id)| {
1163                match *parent_id == parent_uuid && *child_id != uuid {
1164                    true => Some(*child_id),
1165                    false => None,
1166                }
1167            })
1168            .collect()
1169    }
1170
1171    /// get the common ancestor, typacally a frame. At worst, ancestor is 0, meaning the root frame
1172    pub(self) fn find_common_ancestor(
1173        &self,
1174        first_element_uuid: ElementUuid,
1175        second_element_uuid: ElementUuid,
1176    ) -> ElementUuid {
1177        let mut ancestors_of_first_element: Vec<usize> = Vec::new();
1178
1179        let mut child_id = first_element_uuid;
1180
1181        // find ancestors for first
1182        while let Some(&parent_id) = self.child_id_with_parent_id_hash.get(&child_id) {
1183            if child_id == 0 {
1184                break;
1185            }
1186            ancestors_of_first_element.push(parent_id);
1187
1188            child_id = parent_id;
1189        }
1190
1191        // find ancestors for second
1192        let mut ancestors_of_second_element: Vec<usize> = Vec::new();
1193        child_id = second_element_uuid;
1194
1195        while let Some(&parent_id) = self.child_id_with_parent_id_hash.get(&child_id) {
1196            if child_id == 0 {
1197                break;
1198            }
1199            ancestors_of_second_element.push(parent_id);
1200
1201            child_id = parent_id;
1202        }
1203
1204        // compare and get the ancestor
1205
1206        let common_ancestors = ancestors_of_first_element.intersect(ancestors_of_second_element);
1207
1208        *common_ancestors.first().unwrap()
1209    }
1210
1211    /// set a new parent and change order so the element is directly under the new parent. Careful, the new child isn't moved at the end of the list of children !
1212    pub(self) fn move_while_changing_parent(
1213        &mut self,
1214        uuid_to_move: usize,
1215        new_parent_uuid: usize,
1216    ) -> Result<(), ModelError> {
1217        // change parent
1218        self.child_id_with_parent_id_hash
1219            .iter_mut()
1220            .find_map(|(child_id, parent_id)| {
1221                if *child_id == uuid_to_move {
1222                    *parent_id = new_parent_uuid;
1223                    Some(parent_id)
1224                } else {
1225                    None
1226                }
1227            });
1228
1229        // change order
1230
1231        let old_order = *self
1232            .order_with_id_map
1233            .iter()
1234            .find(|(&_order, &iter_uuid)| iter_uuid == uuid_to_move)
1235            .ok_or_else(|| ModelError::ElementNotFound("parent not found".to_string()))?
1236            .0;
1237
1238        let new_order = self
1239            .order_with_id_map
1240            .iter()
1241            .find(|(&_order, &iter_uuid)| iter_uuid == new_parent_uuid)
1242            .ok_or_else(|| ModelError::ElementNotFound("parent not found".to_string()))?
1243            .0
1244            + 1;
1245
1246        self.order_with_id_map.remove(&old_order);
1247
1248        self.order_with_id_map.insert(new_order, uuid_to_move);
1249
1250        self.recalculate_sort_order();
1251
1252        Ok(())
1253    }
1254
1255    pub(self) fn get(&self, uuid: usize) -> Option<&Element> {
1256        self.id_with_element_hash.get(&uuid)
1257    }
1258
1259    pub(self) fn get_root_element(&self) -> Option<&Element> {
1260        self.id_with_element_hash.get(&0)
1261    }
1262
1263    fn get_sort_order(&self, uuid: usize) -> Option<usize> {
1264        self.order_with_id_map
1265            .iter()
1266            .find(|(&_order, &iter_uuid)| iter_uuid == uuid)
1267            .map(|pair| *pair.0)
1268    }
1269
1270    pub(crate) fn clear(&mut self) {
1271        self.child_id_with_parent_id_hash.clear();
1272        self.order_with_id_map.clear();
1273        self.id_with_element_hash.clear();
1274        self.id_counter = 0;
1275    }
1276
1277    pub(crate) fn has_children(&self, uuid: ElementUuid) -> bool {
1278        let level = self.get_level(uuid);
1279
1280        match self
1281            .order_with_id_map
1282            .iter()
1283            .skip_while(|(&_order, &iter_uuid)| iter_uuid != uuid)
1284            .nth(1)
1285        {
1286            Some((_order, id)) => level < self.get_level(*id),
1287            None => false,
1288        }
1289    }
1290}
1291
1292struct TreeIter<'a> {
1293    unvisited: Vec<&'a Element>,
1294}
1295
1296impl<'a> TreeIter<'a> {
1297    fn new(tree: &'a TreeModel) -> Self {
1298        let ordered_elements = tree
1299            .order_with_id_map
1300            .iter()
1301            .rev()
1302            .map(|(_order, id)| -> &Element { tree.id_with_element_hash.get(id).unwrap() })
1303            .collect();
1304
1305        TreeIter {
1306            unvisited: ordered_elements,
1307        }
1308    }
1309}
1310
1311impl<'a> Iterator for TreeIter<'a> {
1312    type Item = &'a Element;
1313
1314    fn next(&mut self) -> Option<Self::Item> {
1315        let element = self.unvisited.pop()?;
1316
1317        Some(element)
1318    }
1319}
1320
1321#[derive(Clone, PartialEq, Debug)]
1322pub enum Element {
1323    FrameElement(Rc<Frame>),
1324    BlockElement(Rc<Block>),
1325    TextElement(Rc<Text>),
1326    ImageElement(Rc<Image>),
1327}
1328
1329impl Element {
1330    pub(crate) fn set_uuid(&mut self, uuid: usize) {
1331        match self {
1332            Element::FrameElement(rc_frame) => rc_frame.set_uuid(uuid),
1333            Element::BlockElement(rc_block) => rc_block.set_uuid(uuid),
1334            Element::TextElement(rc_text) => rc_text.set_uuid(uuid),
1335            Element::ImageElement(rc_image) => rc_image.set_uuid(uuid),
1336        }
1337    }
1338    pub fn uuid(&self) -> usize {
1339        match self {
1340            Element::FrameElement(rc_frame) => rc_frame.uuid(),
1341            Element::BlockElement(rc_block) => rc_block.uuid(),
1342            Element::TextElement(rc_text) => rc_text.uuid(),
1343            Element::ImageElement(rc_image) => rc_image.uuid(),
1344        }
1345    }
1346    pub fn text_length(&self) -> usize {
1347        match self {
1348            Element::FrameElement(rc_frame) => rc_frame.text_length(),
1349            Element::BlockElement(rc_block) => rc_block.text_length(),
1350            Element::TextElement(rc_text) => rc_text.text_length(),
1351            Element::ImageElement(rc_image) => rc_image.text_length(),
1352        }
1353    }
1354    pub fn end_of_element(&self) -> usize {
1355        match self {
1356            Element::FrameElement(rc_frame) => rc_frame.end(),
1357            Element::BlockElement(rc_block) => rc_block.end(),
1358            Element::TextElement(rc_text) => rc_text.end(),
1359            Element::ImageElement(rc_image) => rc_image.end(),
1360        }
1361    }
1362
1363    pub fn start_of_element(&self) -> usize {
1364        match self {
1365            Element::FrameElement(rc_frame) => rc_frame.start(),
1366            Element::BlockElement(rc_block) => rc_block.start(),
1367            Element::TextElement(rc_text) => rc_text.start(),
1368            Element::ImageElement(rc_image) => rc_image.start(),
1369        }
1370    }
1371
1372    pub fn is_block(&self) -> bool {
1373        matches!(self, Element::BlockElement(_))
1374    }
1375    pub fn get_block(&self) -> Option<Rc<Block>> {
1376        match self {
1377            Element::BlockElement(block) => Some(block.clone()),
1378            _ => None,
1379        }
1380    }
1381
1382    pub fn is_frame(&self) -> bool {
1383        matches!(self, Element::FrameElement(_))
1384    }
1385    pub fn get_frame(&self) -> Option<Rc<Frame>> {
1386        match self {
1387            Element::FrameElement(frame) => Some(frame.clone()),
1388            _ => None,
1389        }
1390    }
1391
1392    pub fn is_text(&self) -> bool {
1393        matches!(self, Element::TextElement(_))
1394    }
1395    pub fn get_text(&self) -> Option<Rc<Text>> {
1396        match self {
1397            Element::TextElement(text) => Some(text.clone()),
1398            _ => None,
1399        }
1400    }
1401
1402    pub fn is_image(&self) -> bool {
1403        matches!(self, Element::ImageElement(_))
1404    }
1405    pub fn get_image(&self) -> Option<Rc<Image>> {
1406        match self {
1407            Element::ImageElement(image) => Some(image.clone()),
1408            _ => None,
1409        }
1410    }
1411}
1412
1413#[cfg(test)]
1414mod tests_element {
1415    use std::rc::{Rc, Weak};
1416
1417    use crate::Block;
1418    use crate::Element::BlockElement;
1419
1420    #[test]
1421    fn get() {
1422        let element = BlockElement(Rc::new(Block::new(Weak::new())));
1423        assert!(element.is_block());
1424        assert!(!element.is_image());
1425        assert!(!element.is_frame());
1426        assert!(!element.is_text());
1427    }
1428}
1429
1430#[derive(Clone, Copy, PartialEq, Eq, Debug)]
1431pub enum ChangeReason {
1432    // when format of a element change
1433    FormatChanged,
1434    // when content like text change
1435    ContentChanged,
1436    // internal value change, like the element UUID
1437    InternalStructureChanged,
1438    // when more than one child element change, is removed or is added, a sort of reset is asked because of too many changes in the children
1439    ChildrenChanged,
1440}
1441
1442pub(crate) trait ElementTrait {
1443    fn set_uuid(&self, uuid: usize);
1444    fn verify_rule_with_parent(&self, parent_element: &Element) -> Result<(), ModelError>;
1445}
1446
1447#[derive(Error, Debug)]
1448pub enum ModelError {
1449    #[error("no element found with this id: `{0}`")]
1450    ElementNotFound(String),
1451    #[error("forbidden operation: `{0}`")]
1452    ForbiddenOperation(String),
1453    #[error("Outside text limits in an element")]
1454    OutsideElementBounds,
1455    #[error("wrong parent")]
1456    WrongParent,
1457    #[error("unknown error")]
1458    Unknown,
1459}
1460
1461#[cfg(test)]
1462mod tree_model_tests {
1463    use super::*;
1464
1465    #[test]
1466    fn ancestors() {
1467        let element_manager_rc = ElementManager::new_rc();
1468        ElementManager::create_root_frame(element_manager_rc.clone());
1469
1470        let block = element_manager_rc
1471            .insert_new_block(0, InsertMode::AsChild)
1472            .unwrap();
1473
1474        let tree_model = element_manager_rc.tree_model.borrow();
1475
1476        assert_eq!(tree_model.number_of_ancestors(&block.uuid()), 1);
1477    }
1478}
1479
1480#[cfg(test)]
1481mod document_tests {
1482    use super::*;
1483
1484    #[test]
1485    fn list_all_children() {
1486        let document = TextDocument::new();
1487        document.print_debug_elements();
1488
1489        let children = document.element_manager.list_all_children(0);
1490
1491        assert_eq!(children.len(), 2);
1492
1493        let children = document.element_manager.list_all_children(1);
1494        assert_eq!(children.len(), 1);
1495    }
1496
1497    #[test]
1498    fn list_all_direct_children() {
1499        let document = TextDocument::new();
1500        document.print_debug_elements();
1501
1502        let children = document.element_manager.list_all_direct_children(0);
1503
1504        assert_eq!(children.len(), 1);
1505
1506        let children = document.element_manager.list_all_children(1);
1507        assert_eq!(children.len(), 1);
1508
1509        document
1510            .element_manager
1511            .insert_new_block(0, InsertMode::AsChild)
1512            .expect("Insertion failed");
1513
1514        document
1515            .element_manager
1516            .insert_new_block(0, InsertMode::AsChild)
1517            .expect("Insertion failed");
1518
1519        document
1520            .element_manager
1521            .insert_new_block(0, InsertMode::AsChild)
1522            .expect("Insertion failed");
1523
1524        document.print_debug_elements();
1525
1526        let children = document.element_manager.list_all_direct_children(0);
1527
1528        assert_eq!(children.len(), 4);
1529    }
1530
1531    #[test]
1532    fn insert_new_block_as_child() {
1533        let document = TextDocument::new();
1534        document.print_debug_elements();
1535
1536        // insert at the end of the tree
1537        document
1538            .element_manager
1539            .insert_new_block(0, InsertMode::AsChild)
1540            .expect("Insertion failed");
1541        document.print_debug_elements();
1542        assert_eq!(document.last_block().upgrade().unwrap().uuid(), 3);
1543
1544        let children = document.element_manager.list_all_children(0);
1545        assert_eq!(children.len(), 3);
1546    }
1547
1548    #[test]
1549    fn find_block() {
1550        let mut document = TextDocument::new();
1551        document
1552            .set_plain_text("plain_text\nsecond\nthird")
1553            .unwrap();
1554        document.print_debug_elements();
1555
1556        let block = document.find_block(10).unwrap();
1557        assert_eq!(block.upgrade().unwrap().uuid(), 1);
1558        let block = document.find_block(11).unwrap();
1559        assert_eq!(block.upgrade().unwrap().uuid(), 3);
1560        let block = document.find_block(23).unwrap();
1561        assert_eq!(block.upgrade().unwrap().uuid(), 5);
1562    }
1563
1564    #[test]
1565    fn insert_new_block_before() {
1566        let document = TextDocument::new();
1567        document.print_debug_elements();
1568
1569        // insert at the end of the tree
1570        document
1571            .element_manager
1572            .insert_new_block(1, InsertMode::Before)
1573            .expect("Insertion failed");
1574        document.print_debug_elements();
1575        assert_eq!(document.last_block().upgrade().unwrap().uuid(), 1);
1576
1577        let children = document.element_manager.list_all_children(0);
1578        assert_eq!(children.len(), 3);
1579    }
1580
1581    #[test]
1582    fn insert_new_block_after() {
1583        let document = TextDocument::new();
1584        document.print_debug_elements();
1585
1586        // insert at the end of the tree
1587        document
1588            .element_manager
1589            .insert_new_block(1, InsertMode::After)
1590            .expect("Insertion failed");
1591        document.print_debug_elements();
1592        assert_eq!(document.last_block().upgrade().unwrap().uuid(), 3);
1593
1594        let children = document.element_manager.list_all_children(0);
1595        assert_eq!(children.len(), 3);
1596
1597        // insert when one next sibling already exists
1598        document
1599            .element_manager
1600            .insert_new_block(1, InsertMode::After)
1601            .expect("Insertion failed");
1602        document.print_debug_elements();
1603        assert_eq!(document.last_block().upgrade().unwrap().uuid(), 3);
1604
1605        let children = document.element_manager.list_all_children(0);
1606        assert_eq!(children.len(), 4);
1607    }
1608
1609    #[test]
1610    fn insert_new_block_after_in_frame() {
1611        let document = TextDocument::new();
1612        document.print_debug_elements();
1613
1614        // insert at the end of the tree
1615        document
1616            .element_manager
1617            .insert_new_block(1, InsertMode::After)
1618            .expect("Insertion failed");
1619        document.print_debug_elements();
1620        assert_eq!(document.last_block().upgrade().unwrap().uuid(), 3);
1621
1622        let frame = document
1623            .element_manager
1624            .insert_new_frame(0, InsertMode::AsChild)
1625            .unwrap();
1626
1627        document
1628            .element_manager
1629            .insert_new_block(frame.uuid(), InsertMode::After)
1630            .unwrap();
1631
1632        // insert in frame
1633
1634        let block_in_frame = document
1635            .element_manager
1636            .insert_new_block(frame.uuid(), InsertMode::AsChild)
1637            .unwrap();
1638
1639        // insert in frame
1640        document.print_debug_elements();
1641
1642        let _second_block_in_frame = document
1643            .element_manager
1644            .insert_new_block(block_in_frame.uuid(), InsertMode::After)
1645            .unwrap();
1646
1647        document.print_debug_elements();
1648
1649        let children = document.element_manager.list_all_children(0);
1650        assert_eq!(children.len(), 7);
1651    }
1652}