13 import javax.swing.text.Position |
13 import javax.swing.text.Position |
14 import javax.swing.tree._ |
14 import javax.swing.tree._ |
15 |
15 |
16 abstract class MarkupInfo |
16 abstract class MarkupInfo |
17 case class RootInfo() extends MarkupInfo |
17 case class RootInfo() extends MarkupInfo |
18 case class OuterInfo(highlight: String) extends MarkupInfo {override def toString = highlight} |
18 case class OuterInfo(highlight: String) extends |
19 case class HighlightInfo(highlight: String) extends MarkupInfo {override def toString = highlight} |
19 MarkupInfo { override def toString = highlight } |
20 case class TypeInfo(type_kind: String) extends MarkupInfo {override def toString = type_kind} |
20 case class HighlightInfo(highlight: String) extends |
|
21 MarkupInfo { override def toString = highlight } |
|
22 case class TypeInfo(type_kind: String) extends |
|
23 MarkupInfo { override def toString = type_kind } |
21 case class RefInfo(file: Option[String], line: Option[Int], |
24 case class RefInfo(file: Option[String], line: Option[Int], |
22 command_id: Option[String], offset: Option[Int]) extends MarkupInfo { |
25 command_id: Option[String], offset: Option[Int]) extends MarkupInfo { |
23 override def toString = (file, line, command_id, offset).toString |
26 override def toString = (file, line, command_id, offset).toString |
24 } |
27 } |
25 |
28 |
26 object MarkupNode { |
29 object MarkupNode { |
27 |
30 |
28 def markup2default_node(node: MarkupNode, cmd: Command, doc: ProofDocument) : DefaultMutableTreeNode = { |
31 def markup2default_node(node: MarkupNode, cmd: Command, doc: ProofDocument) |
|
32 : DefaultMutableTreeNode = { |
29 |
33 |
30 implicit def int2pos(offset: Int): Position = |
34 implicit def int2pos(offset: Int): Position = |
31 new Position { def getOffset = offset; override def toString = offset.toString} |
35 new Position { def getOffset = offset; override def toString = offset.toString } |
32 |
36 |
33 object RelativeAsset extends IAsset { |
37 object RelativeAsset extends IAsset { |
34 override def getIcon : Icon = null |
38 override def getIcon: Icon = null |
35 override def getShortString : String = node.content |
39 override def getShortString: String = node.content |
36 override def getLongString : String = node.info.toString |
40 override def getLongString: String = node.info.toString |
37 override def getName : String = node.id |
41 override def getName: String = node.id |
38 override def setName (name : String) = () |
42 override def setName(name: String) = () |
39 override def setStart(start : Position) = () |
43 override def setStart(start: Position) = () |
40 override def getStart : Position = node.abs_start(doc) |
44 override def getStart: Position = node.abs_start(doc) |
41 override def setEnd(end : Position) = () |
45 override def setEnd(end: Position) = () |
42 override def getEnd : Position = node.abs_stop(doc) |
46 override def getEnd: Position = node.abs_stop(doc) |
43 override def toString = node.id + ": " + node.content + "[" + getStart + " - " + getEnd + "]" |
47 override def toString = node.id + ": " + node.content + "[" + getStart + " - " + getEnd + "]" |
44 } |
48 } |
45 |
49 |
46 new DefaultMutableTreeNode(RelativeAsset) |
50 new DefaultMutableTreeNode(RelativeAsset) |
47 } |
51 } |
48 } |
52 } |
49 |
53 |
50 class MarkupNode (val base: Command, val start: Int, val stop: Int, |
54 class MarkupNode(val base: Command, val start: Int, val stop: Int, |
51 val children: List[MarkupNode], |
55 val children: List[MarkupNode], |
52 val id: String, val content: String, val info: MarkupInfo) { |
56 val id: String, val content: String, val info: MarkupInfo) |
53 |
57 { |
54 def swing_node(doc: ProofDocument) : DefaultMutableTreeNode = { |
58 def swing_node(doc: ProofDocument): DefaultMutableTreeNode = { |
55 val node = MarkupNode.markup2default_node (this, base, doc) |
59 val node = MarkupNode.markup2default_node (this, base, doc) |
56 children.map(node add _.swing_node(doc)) |
60 children.map(node add _.swing_node(doc)) |
57 node |
61 node |
58 } |
62 } |
59 |
63 |
61 def abs_stop(doc: ProofDocument) = base.start(doc) + stop |
65 def abs_stop(doc: ProofDocument) = base.start(doc) + stop |
62 |
66 |
63 def set_children(newchildren: List[MarkupNode]): MarkupNode = |
67 def set_children(newchildren: List[MarkupNode]): MarkupNode = |
64 new MarkupNode(base, start, stop, newchildren, id, content, info) |
68 new MarkupNode(base, start, stop, newchildren, id, content, info) |
65 |
69 |
66 def add(child : MarkupNode) = set_children ((child :: children) sort ((a, b) => a.start < b.start)) |
70 def add(child: MarkupNode) = |
|
71 set_children ((child :: children) sort ((a, b) => a.start < b.start)) |
67 |
72 |
68 def remove(nodes : List[MarkupNode]) = set_children(children diff nodes) |
73 def remove(nodes: List[MarkupNode]) = set_children(children diff nodes) |
69 |
74 |
70 def dfs : List[MarkupNode] = { |
75 def dfs: List[MarkupNode] = { |
71 var all = Nil : List[MarkupNode] |
76 var all = Nil : List[MarkupNode] |
72 for (child <- children) |
77 for (child <- children) |
73 all = child.dfs ::: all |
78 all = child.dfs ::: all |
74 all = this :: all |
79 all = this :: all |
75 all |
80 all |
84 var next_x = start |
89 var next_x = start |
85 if(children.length == 0) List(this) |
90 if(children.length == 0) List(this) |
86 else { |
91 else { |
87 val filled_gaps = for { |
92 val filled_gaps = for { |
88 child <- children |
93 child <- children |
89 markups = if (next_x < child.start) { |
94 markups = |
90 new MarkupNode(base, next_x, child.start, Nil, id, content, info) :: child.flatten |
95 if (next_x < child.start) { |
91 } else child.flatten |
96 new MarkupNode(base, next_x, child.start, Nil, id, content, info) :: child.flatten |
|
97 } else child.flatten |
92 update = (next_x = child.stop) |
98 update = (next_x = child.stop) |
93 markup <- markups |
99 markup <- markups |
94 } yield markup |
100 } yield markup |
95 if (next_x < stop) filled_gaps + new MarkupNode(base, next_x, stop, Nil, id, content, info) |
101 if (next_x < stop) |
|
102 filled_gaps + new MarkupNode(base, next_x, stop, Nil, id, content, info) |
96 else filled_gaps |
103 else filled_gaps |
97 } |
104 } |
98 } |
105 } |
99 |
106 |
100 def filter(p: (MarkupNode => Boolean)): List[MarkupNode] = { |
107 def filter(p: MarkupNode => Boolean): List[MarkupNode] = { |
101 val filtered = children.flatMap(_.filter(p)) |
108 val filtered = children.flatMap(_.filter(p)) |
102 if (p(this)) List(this set_children(filtered)) |
109 if (p(this)) List(this set_children(filtered)) |
103 else filtered |
110 else filtered |
104 } |
111 } |
105 |
112 |
106 def +(new_child : MarkupNode) : MarkupNode = { |
113 def +(new_child: MarkupNode): MarkupNode = { |
107 if (new_child fitting_into this) { |
114 if (new_child fitting_into this) { |
108 var inserted = false |
115 var inserted = false |
109 val new_children = children.map(c => if((new_child fitting_into c) && !inserted) {inserted = true; c + new_child} else c) |
116 val new_children = |
|
117 children.map(c => |
|
118 if ((new_child fitting_into c) && !inserted) {inserted = true; c + new_child} |
|
119 else c) |
110 if (!inserted) { |
120 if (!inserted) { |
111 // new_child did not fit into children of this -> insert new_child between this and its children |
121 // new_child did not fit into children of this |
|
122 // -> insert new_child between this and its children |
112 val fitting = children filter(_ fitting_into new_child) |
123 val fitting = children filter(_ fitting_into new_child) |
113 (this remove fitting) add ((new_child /: fitting) (_ + _)) |
124 (this remove fitting) add ((new_child /: fitting) (_ + _)) |
114 } |
125 } |
115 else this set_children new_children |
126 else this set_children new_children |
116 } else { |
127 } else { |
117 error("ignored nonfitting markup " + new_child.id + new_child.content + new_child.info.toString |
128 error("ignored nonfitting markup " + new_child.id + new_child.content + |
118 + "(" +new_child.start + ", "+ new_child.stop + ")") |
129 new_child.info.toString + "(" +new_child.start + ", "+ new_child.stop + ")") |
119 } |
130 } |
120 } |
131 } |
121 |
132 |
122 // does this fit into node? |
133 // does this fit into node? |
123 def fitting_into(node : MarkupNode) = node.start <= this.start && node.stop >= this.stop |
134 def fitting_into(node: MarkupNode) = node.start <= this.start && node.stop >= this.stop |
124 |
135 |
125 override def toString = "([" + start + " - " + stop + "] " + id + "( " + content + "): " + info.toString |
136 override def toString = |
|
137 "([" + start + " - " + stop + "] " + id + "( " + content + "): " + info.toString |
126 } |
138 } |