equal
deleted
inserted
replaced
21 import javax.swing.SwingUtilities |
21 import javax.swing.SwingUtilities |
22 |
22 |
23 import org.gjt.sp.jedit.View |
23 import org.gjt.sp.jedit.View |
24 |
24 |
25 |
25 |
26 private object Simplifier_Trace_Window |
26 private object Simplifier_Trace_Window { |
27 { |
27 sealed trait Trace_Tree { |
28 sealed trait Trace_Tree |
|
29 { |
|
30 // FIXME replace with immutable tree builder |
28 // FIXME replace with immutable tree builder |
31 var children: SortedMap[Long, Either[Simplifier_Trace.Item.Data, Elem_Tree]] = SortedMap.empty |
29 var children: SortedMap[Long, Either[Simplifier_Trace.Item.Data, Elem_Tree]] = SortedMap.empty |
32 val serial: Long |
30 val serial: Long |
33 val parent: Option[Trace_Tree] |
31 val parent: Option[Trace_Tree] |
34 val markup: String |
32 val markup: String |
37 def tree_children: List[Elem_Tree] = children.values.toList.collect { |
35 def tree_children: List[Elem_Tree] = children.values.toList.collect { |
38 case Right(tree) => tree |
36 case Right(tree) => tree |
39 } |
37 } |
40 } |
38 } |
41 |
39 |
42 final class Root_Tree(val serial: Long) extends Trace_Tree |
40 final class Root_Tree(val serial: Long) extends Trace_Tree { |
43 { |
|
44 val parent = None |
41 val parent = None |
45 val interesting = true |
42 val interesting = true |
46 val markup = "" |
43 val markup = "" |
47 |
44 |
48 def format: XML.Body = |
45 def format: XML.Body = |
49 Pretty.separate(tree_children.flatMap(_.format)) |
46 Pretty.separate(tree_children.flatMap(_.format)) |
50 } |
47 } |
51 |
48 |
52 final class Elem_Tree(data: Simplifier_Trace.Item.Data, val parent: Option[Trace_Tree]) |
49 final class Elem_Tree(data: Simplifier_Trace.Item.Data, val parent: Option[Trace_Tree]) |
53 extends Trace_Tree |
50 extends Trace_Tree { |
54 { |
|
55 val serial = data.serial |
51 val serial = data.serial |
56 val markup = data.markup |
52 val markup = data.markup |
57 |
53 |
58 lazy val interesting: Boolean = |
54 lazy val interesting: Boolean = |
59 data.markup == Markup.SIMP_TRACE_STEP || |
55 data.markup == Markup.SIMP_TRACE_STEP || |
61 tree_children.exists(_.interesting) |
57 tree_children.exists(_.interesting) |
62 |
58 |
63 private def body_contains(regex: Regex, body: XML.Body): Boolean = |
59 private def body_contains(regex: Regex, body: XML.Body): Boolean = |
64 body.exists(tree => regex.findFirstIn(XML.content(tree)).isDefined) |
60 body.exists(tree => regex.findFirstIn(XML.content(tree)).isDefined) |
65 |
61 |
66 def format: Option[XML.Tree] = |
62 def format: Option[XML.Tree] = { |
67 { |
|
68 def format_hint(data: Simplifier_Trace.Item.Data): XML.Tree = |
63 def format_hint(data: Simplifier_Trace.Item.Data): XML.Tree = |
69 Pretty.block(Pretty.separate(XML.Text(data.text) :: data.content)) |
64 Pretty.block(Pretty.separate(XML.Text(data.text) :: data.content)) |
70 |
65 |
71 lazy val bodies: XML.Body = |
66 lazy val bodies: XML.Body = |
72 children.values.toList.collect { |
67 children.values.toList.collect { |
92 case Nil => |
87 case Nil => |
93 () |
88 () |
94 case head :: tail => |
89 case head :: tail => |
95 lookup.get(head.parent) match { |
90 lookup.get(head.parent) match { |
96 case Some(parent) => |
91 case Some(parent) => |
97 if (head.markup == Markup.SIMP_TRACE_HINT) |
92 if (head.markup == Markup.SIMP_TRACE_HINT) { |
98 { |
|
99 head.props match { |
93 head.props match { |
100 case Simplifier_Trace.Success(x) |
94 case Simplifier_Trace.Success(x) |
101 if x || |
95 if x || |
102 parent.markup == Markup.SIMP_TRACE_LOG || |
96 parent.markup == Markup.SIMP_TRACE_LOG || |
103 parent.markup == Markup.SIMP_TRACE_STEP => |
97 parent.markup == Markup.SIMP_TRACE_STEP => |
105 case _ => |
99 case _ => |
106 // ignore |
100 // ignore |
107 } |
101 } |
108 walk_trace(tail, lookup) |
102 walk_trace(tail, lookup) |
109 } |
103 } |
110 else if (head.markup == Markup.SIMP_TRACE_IGNORE) |
104 else if (head.markup == Markup.SIMP_TRACE_IGNORE) { |
111 { |
|
112 parent.parent match { |
105 parent.parent match { |
113 case None => |
106 case None => |
114 Output.error_message( |
107 Output.error_message( |
115 "Simplifier_Trace_Window: malformed ignore message with parent " + head.parent) |
108 "Simplifier_Trace_Window: malformed ignore message with parent " + head.parent) |
116 case Some(tree) => |
109 case Some(tree) => |
117 tree.children -= head.parent |
110 tree.children -= head.parent |
118 walk_trace(tail, lookup) |
111 walk_trace(tail, lookup) |
119 } |
112 } |
120 } |
113 } |
121 else |
114 else { |
122 { |
|
123 val entry = new Elem_Tree(head, Some(parent)) |
115 val entry = new Elem_Tree(head, Some(parent)) |
124 parent.children += ((head.serial, Right(entry))) |
116 parent.children += ((head.serial, Right(entry))) |
125 walk_trace(tail, lookup + (head.serial -> entry)) |
117 walk_trace(tail, lookup + (head.serial -> entry)) |
126 } |
118 } |
127 |
119 |
132 |
124 |
133 } |
125 } |
134 |
126 |
135 |
127 |
136 class Simplifier_Trace_Window( |
128 class Simplifier_Trace_Window( |
137 view: View, snapshot: Document.Snapshot, trace: Simplifier_Trace.Trace) extends Frame |
129 view: View, |
138 { |
130 snapshot: Document.Snapshot, |
|
131 trace: Simplifier_Trace.Trace |
|
132 ) extends Frame { |
139 GUI_Thread.require {} |
133 GUI_Thread.require {} |
140 |
134 |
141 private val pretty_text_area = new Pretty_Text_Area(view) |
135 private val pretty_text_area = new Pretty_Text_Area(view) |
142 private val zoom = new Font_Info.Zoom_Box { def changed = do_paint() } |
136 private val zoom = new Font_Info.Zoom_Box { def changed = do_paint() } |
143 |
137 |
157 |
151 |
158 do_update() |
152 do_update() |
159 open() |
153 open() |
160 do_paint() |
154 do_paint() |
161 |
155 |
162 def do_update(): Unit = |
156 def do_update(): Unit = { |
163 { |
|
164 val xml = tree.format |
157 val xml = tree.format |
165 pretty_text_area.update(snapshot, Command.Results.empty, xml) |
158 pretty_text_area.update(snapshot, Command.Results.empty, xml) |
166 } |
159 } |
167 |
160 |
168 def do_paint(): Unit = |
161 def do_paint(): Unit = { |
169 { |
|
170 GUI_Thread.later { |
162 GUI_Thread.later { |
171 pretty_text_area.resize( |
163 pretty_text_area.resize( |
172 Font_Info.main(PIDE.options.real("jedit_font_scale") * zoom.factor / 100)) |
164 Font_Info.main(PIDE.options.real("jedit_font_scale") * zoom.factor / 100)) |
173 } |
165 } |
174 } |
166 } |