10 import sidekick.IAsset |
10 import sidekick.IAsset |
11 import javax.swing._ |
11 import javax.swing._ |
12 import javax.swing.text.Position |
12 import javax.swing.text.Position |
13 import javax.swing.tree._ |
13 import javax.swing.tree._ |
14 |
14 |
15 class MarkupNode (base : Command, val rel_start : Int, val rel_end : Int, |
15 object MarkupNode { |
16 val name : String, val short : String, val long : String) |
|
17 extends DefaultMutableTreeNode{ |
|
18 |
16 |
19 private class MyPos(val o : Int) extends Position { |
17 def markup2default_node(node : MarkupNode) : DefaultMutableTreeNode = { |
20 override def getOffset = o |
18 |
|
19 class MyPos(val o : Int) extends Position { |
|
20 override def getOffset = o |
|
21 } |
|
22 |
|
23 implicit def int2pos(x : Int) : MyPos = new MyPos(x) |
|
24 |
|
25 object RelativeAsset extends IAsset{ |
|
26 override def getIcon : Icon = null |
|
27 override def getShortString : String = node.short |
|
28 override def getLongString : String = node.long |
|
29 override def getName : String = node.name |
|
30 override def setName (name : String) = () |
|
31 override def setStart(start : Position) = () |
|
32 override def getStart : Position = node.base.start + node.start |
|
33 override def setEnd(end : Position) = () |
|
34 override def getEnd : Position = node.base.start + node.end |
|
35 override def toString = node.name + ": " + node.short |
|
36 } |
|
37 |
|
38 new DefaultMutableTreeNode(RelativeAsset) |
|
39 } |
|
40 } |
|
41 |
|
42 class MarkupNode (val base : Command, val start : Int, val end : Int, |
|
43 val name : String, val short : String, val long : String) { |
|
44 |
|
45 val swing_node : DefaultMutableTreeNode = MarkupNode.markup2default_node (this) |
|
46 |
|
47 var parent : MarkupNode = null |
|
48 def orphan = parent == null |
|
49 |
|
50 private var children_cell : List[MarkupNode] = Nil |
|
51 //track changes in swing_node |
|
52 def children = children_cell |
|
53 def children_= (cs : List[MarkupNode]) = { |
|
54 swing_node.removeAllChildren |
|
55 for(c <- cs) swing_node add c.swing_node |
|
56 children_cell = cs |
|
57 } |
|
58 |
|
59 private def add(child : MarkupNode) { |
|
60 child parent = this |
|
61 children_cell = (child :: children) sort ((a, b) => a.start < b.end) |
|
62 |
|
63 swing_node add child.swing_node |
21 } |
64 } |
22 |
65 |
23 private def pos(x : Int) : MyPos = new MyPos(x) |
66 private def remove(nodes : List[MarkupNode]) { |
|
67 children_cell = children diff nodes |
24 |
68 |
25 private object RelativeAsset extends IAsset{ |
69 for(node <- nodes) swing_node remove node.swing_node |
26 override def getIcon : Icon = null |
|
27 override def getShortString : String = short |
|
28 override def getLongString : String = long |
|
29 override def getName : String = name |
|
30 override def setName (name : String) = () |
|
31 override def setStart(start : Position) = () |
|
32 override def getStart : Position = pos(base.start + rel_start) |
|
33 override def setEnd(end : Position) = () |
|
34 override def getEnd : Position = pos(base.start + rel_end) |
|
35 override def toString = name + ": " + short |
|
36 } |
70 } |
37 |
71 |
38 super.setUserObject(RelativeAsset) |
72 def dfs : List[MarkupNode] = { |
|
73 var all = Nil : List[MarkupNode] |
|
74 for(child <- children) |
|
75 all = child.dfs ::: all |
|
76 all = this :: all |
|
77 all |
|
78 } |
39 |
79 |
40 override def add(new_child : MutableTreeNode) = { |
80 def insert(new_child : MarkupNode) : Unit = { |
41 if(new_child.isInstanceOf[MarkupNode]){ |
81 if(new_child fitting_into this){ |
42 val new_node = new_child.asInstanceOf[MarkupNode] |
82 for(child <- children){ |
43 if(!equals(new_node) && fitting(new_node)){ |
83 if(new_child fitting_into child) |
44 val cs = children() |
84 child insert new_child |
45 while (cs.hasMoreElements){ |
85 } |
46 val child = cs.nextElement.asInstanceOf[MarkupNode] |
86 if(new_child orphan){ |
47 if(child.fitting(new_node)) { |
87 // new_child did not fit into children of this |
48 child.add(new_node) |
88 // -> insert new_child between this and its children |
|
89 for(child <- children){ |
|
90 if(child fitting_into new_child) { |
|
91 new_child add child |
49 } |
92 } |
50 } |
93 } |
51 if(new_node.getParent == null){ |
94 this add new_child |
52 val cs = children() |
95 this remove new_child.children |
53 while(cs.hasMoreElements){ |
|
54 val child = cs.nextElement.asInstanceOf[MarkupNode] |
|
55 if(new_node.fitting(child)) { |
|
56 remove(child) |
|
57 new_node.add(child) |
|
58 } |
|
59 } |
|
60 super.add(new_node) |
|
61 } |
|
62 } else { |
|
63 System.err.println("ignored nonfitting markup " + new_node.name + new_node.short + new_node.long |
|
64 + "(" +new_node.rel_start + ", "+ new_node.rel_end + ")") |
|
65 } |
96 } |
66 } else { |
97 } else { |
67 super.add(new_child) |
98 System.err.println("ignored nonfitting markup " + new_child.name + new_child.short + new_child.long |
|
99 + "(" +new_child.start + ", "+ new_child.end + ")") |
68 } |
100 } |
69 } |
101 } |
70 |
102 |
71 // does node fit into this? |
103 // does this fit into node? |
72 def fitting(node : MarkupNode) : boolean = { |
104 def fitting_into(node : MarkupNode) = node.start <= this.start && |
73 return node.rel_start >= this.rel_start && node.rel_end <= this.rel_end |
105 node.end >= this.end |
74 } |
|
75 |
106 |
76 } |
107 } |