src/Tools/jEdit/src/prover/MarkupNode.scala
changeset 34582 5d5d253c7c29
parent 34577 aef72e071725
child 34597 a0c84b0edb9a
equal deleted inserted replaced
34581:abab3a577e10 34582:5d5d253c7c29
    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 }