src/Tools/jEdit/src/prover/MarkupNode.scala
changeset 34401 44241a37b74a
parent 34400 1b61a92f8675
child 34402 bd8d70cd9baf
equal deleted inserted replaced
34400:1b61a92f8675 34401:44241a37b74a
    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 }