equal
deleted
inserted
replaced
11 import javax.swing.tree.DefaultMutableTreeNode |
11 import javax.swing.tree.DefaultMutableTreeNode |
12 |
12 |
13 |
13 |
14 |
14 |
15 case class Markup_Node(val range: Text.Range, val info: Any) |
15 case class Markup_Node(val range: Text.Range, val info: Any) |
16 { |
|
17 def fits_into(that: Markup_Node): Boolean = |
|
18 that.range.start <= this.range.start && this.range.stop <= that.range.stop |
|
19 } |
|
20 |
|
21 |
16 |
22 case class Markup_Tree(val node: Markup_Node, val branches: List[Markup_Tree]) |
17 case class Markup_Tree(val node: Markup_Node, val branches: List[Markup_Tree]) |
23 { |
18 { |
24 private def add(branch: Markup_Tree) = // FIXME avoid sort |
19 private def add(branch: Markup_Tree) = // FIXME avoid sort |
25 copy(branches = (branch :: branches).sortWith((a, b) => a.node.range.start < b.node.range.start)) |
20 copy(branches = (branch :: branches).sortWith((a, b) => a.node.range.start < b.node.range.start)) |
28 copy(branches = branches.filterNot(bs.contains(_))) |
23 copy(branches = branches.filterNot(bs.contains(_))) |
29 |
24 |
30 def + (new_tree: Markup_Tree): Markup_Tree = |
25 def + (new_tree: Markup_Tree): Markup_Tree = |
31 { |
26 { |
32 val new_node = new_tree.node |
27 val new_node = new_tree.node |
33 if (new_node fits_into node) { |
28 if (node.range contains new_node.range) { |
34 var inserted = false |
29 var inserted = false |
35 val new_branches = |
30 val new_branches = |
36 branches.map(branch => |
31 branches.map(branch => |
37 if ((new_node fits_into branch.node) && !inserted) { |
32 if ((branch.node.range contains new_node.range) && !inserted) { |
38 inserted = true |
33 inserted = true |
39 branch + new_tree |
34 branch + new_tree |
40 } |
35 } |
41 else branch) |
36 else branch) |
42 if (!inserted) { |
37 if (!inserted) { |
43 // new_tree did not fit into children of this |
38 // new_tree did not fit into children of this |
44 // -> insert between this and its branches |
39 // -> insert between this and its branches |
45 val fitting = branches filter(_.node fits_into new_node) |
40 val fitting = branches filter(new_node.range contains _.node.range) |
46 (this remove fitting) add ((new_tree /: fitting)(_ + _)) |
41 (this remove fitting) add ((new_tree /: fitting)(_ + _)) |
47 } |
42 } |
48 else copy(branches = new_branches) |
43 else copy(branches = new_branches) |
49 } |
44 } |
50 else { |
45 else { |
92 else branches |
87 else branches |
93 } |
88 } |
94 new Markup_Text(markup.flatMap(filt(_)), content) |
89 new Markup_Text(markup.flatMap(filt(_)), content) |
95 } |
90 } |
96 |
91 |
97 def flatten: List[Markup_Node] = markup.flatten(_.flatten) |
92 def flatten: List[Markup_Node] = markup.flatMap(_.flatten) |
98 |
93 |
99 def swing_tree(swing_node: Markup_Node => DefaultMutableTreeNode): DefaultMutableTreeNode = |
94 def swing_tree(swing_node: Markup_Node => DefaultMutableTreeNode): DefaultMutableTreeNode = |
100 { |
95 { |
101 def swing(tree: Markup_Tree): DefaultMutableTreeNode = |
96 def swing(tree: Markup_Tree): DefaultMutableTreeNode = |
102 { |
97 { |