src/Pure/PIDE/markup_node.scala
changeset 38478 7766812a01e7
parent 38426 2858ec7b6dd8
equal deleted inserted replaced
38477:f01f4ab2a0af 38478:7766812a01e7
    11 import javax.swing.tree.DefaultMutableTreeNode
    11 import javax.swing.tree.DefaultMutableTreeNode
    12 
    12 
    13 
    13 
    14 
    14 
    15 case class Markup_Node(val range: Text.Range, val info: Any)
    15 case class Markup_Node(val range: Text.Range, val info: Any)
    16 {
       
    17   def fits_into(that: Markup_Node): Boolean =
       
    18     that.range.start <= this.range.start && this.range.stop <= that.range.stop
       
    19 }
       
    20 
       
    21 
    16 
    22 case class Markup_Tree(val node: Markup_Node, val branches: List[Markup_Tree])
    17 case class Markup_Tree(val node: Markup_Node, val branches: List[Markup_Tree])
    23 {
    18 {
    24   private def add(branch: Markup_Tree) =   // FIXME avoid sort
    19   private def add(branch: Markup_Tree) =   // FIXME avoid sort
    25     copy(branches = (branch :: branches).sortWith((a, b) => a.node.range.start < b.node.range.start))
    20     copy(branches = (branch :: branches).sortWith((a, b) => a.node.range.start < b.node.range.start))
    28     copy(branches = branches.filterNot(bs.contains(_)))
    23     copy(branches = branches.filterNot(bs.contains(_)))
    29 
    24 
    30   def + (new_tree: Markup_Tree): Markup_Tree =
    25   def + (new_tree: Markup_Tree): Markup_Tree =
    31   {
    26   {
    32     val new_node = new_tree.node
    27     val new_node = new_tree.node
    33     if (new_node fits_into node) {
    28     if (node.range contains new_node.range) {
    34       var inserted = false
    29       var inserted = false
    35       val new_branches =
    30       val new_branches =
    36         branches.map(branch =>
    31         branches.map(branch =>
    37           if ((new_node fits_into branch.node) && !inserted) {
    32           if ((branch.node.range contains new_node.range) && !inserted) {
    38             inserted = true
    33             inserted = true
    39             branch + new_tree
    34             branch + new_tree
    40           }
    35           }
    41           else branch)
    36           else branch)
    42       if (!inserted) {
    37       if (!inserted) {
    43         // new_tree did not fit into children of this
    38         // new_tree did not fit into children of this
    44         // -> insert between this and its branches
    39         // -> insert between this and its branches
    45         val fitting = branches filter(_.node fits_into new_node)
    40         val fitting = branches filter(new_node.range contains _.node.range)
    46         (this remove fitting) add ((new_tree /: fitting)(_ + _))
    41         (this remove fitting) add ((new_tree /: fitting)(_ + _))
    47       }
    42       }
    48       else copy(branches = new_branches)
    43       else copy(branches = new_branches)
    49     }
    44     }
    50     else {
    45     else {
    92       else branches
    87       else branches
    93     }
    88     }
    94     new Markup_Text(markup.flatMap(filt(_)), content)
    89     new Markup_Text(markup.flatMap(filt(_)), content)
    95   }
    90   }
    96 
    91 
    97   def flatten: List[Markup_Node] = markup.flatten(_.flatten)
    92   def flatten: List[Markup_Node] = markup.flatMap(_.flatten)
    98 
    93 
    99   def swing_tree(swing_node: Markup_Node => DefaultMutableTreeNode): DefaultMutableTreeNode =
    94   def swing_tree(swing_node: Markup_Node => DefaultMutableTreeNode): DefaultMutableTreeNode =
   100   {
    95   {
   101     def swing(tree: Markup_Tree): DefaultMutableTreeNode =
    96     def swing(tree: Markup_Tree): DefaultMutableTreeNode =
   102     {
    97     {