src/Pure/PIDE/document.scala
changeset 64819 bebe7a164068
parent 64815 899c69bad0a9
child 64827 4ef1eb75f1cd
equal deleted inserted replaced
64818:67a0a563d2b3 64819:bebe7a164068
   158         this match {
   158         this match {
   159           case Edits(Nil) => true
   159           case Edits(Nil) => true
   160           case _ => false
   160           case _ => false
   161         }
   161         }
   162     }
   162     }
   163     case class Clear[A, B]() extends Edit[A, B]
       
   164     case class Blob[A, B](blob: Document.Blob) extends Edit[A, B]
   163     case class Blob[A, B](blob: Document.Blob) extends Edit[A, B]
   165 
   164 
   166     case class Edits[A, B](edits: List[A]) extends Edit[A, B]
   165     case class Edits[A, B](edits: List[A]) extends Edit[A, B]
   167     case class Deps[A, B](header: Header) extends Edit[A, B]
   166     case class Deps[A, B](header: Header) extends Edit[A, B]
   168     case class Perspective[A, B](required: Boolean, visible: B, overlays: Overlays) extends Edit[A, B]
   167     case class Perspective[A, B](required: Boolean, visible: B, overlays: Overlays) extends Edit[A, B]
   261 
   260 
   262     def commands: Linear_Set[Command] = _commands.commands
   261     def commands: Linear_Set[Command] = _commands.commands
   263     def load_commands: List[Command] = _commands.load_commands
   262     def load_commands: List[Command] = _commands.load_commands
   264     def load_commands_changed(doc_blobs: Blobs): Boolean =
   263     def load_commands_changed(doc_blobs: Blobs): Boolean =
   265       load_commands.exists(_.blobs_changed(doc_blobs))
   264       load_commands.exists(_.blobs_changed(doc_blobs))
   266 
       
   267     def clear: Node = new Node(header = header, syntax = syntax)
       
   268 
   265 
   269     def init_blob(blob: Blob): Node = new Node(get_blob = Some(blob.unchanged))
   266     def init_blob(blob: Blob): Node = new Node(get_blob = Some(blob.unchanged))
   270 
   267 
   271     def update_header(new_header: Node.Header): Node =
   268     def update_header(new_header: Node.Header): Node =
   272       new Node(get_blob, new_header, syntax, text_perspective, perspective, _commands)
   269       new Node(get_blob, new_header, syntax, text_perspective, perspective, _commands)
   759           change <- history.undo_list.takeWhile(_ != stable)
   756           change <- history.undo_list.takeWhile(_ != stable)
   760           (a, edits) <- change.rev_edits
   757           (a, edits) <- change.rev_edits
   761           if a == name
   758           if a == name
   762         } yield edits
   759         } yield edits
   763 
   760 
   764       val is_cleared = rev_pending_changes.exists({ case Node.Clear() => true case _ => false })
       
   765       val edits =
   761       val edits =
   766         if (is_cleared) Nil
   762         (pending_edits /: rev_pending_changes)({
   767         else
   763           case (edits, Node.Edits(es)) => es ::: edits
   768           (pending_edits /: rev_pending_changes)({
   764           case (edits, _) => edits
   769             case (edits, Node.Edits(es)) => es ::: edits
   765         })
   770             case (edits, _) => edits
       
   771           })
       
   772       lazy val reverse_edits = edits.reverse
   766       lazy val reverse_edits = edits.reverse
   773 
   767 
   774       new Snapshot
   768       new Snapshot
   775       {
   769       {
   776         /* global information */
   770         /* global information */
   780         val is_outdated: Boolean = pending_edits.nonEmpty || latest != stable
   774         val is_outdated: Boolean = pending_edits.nonEmpty || latest != stable
   781 
   775 
   782 
   776 
   783         /* local node content */
   777         /* local node content */
   784 
   778 
   785         def convert(offset: Text.Offset) =
   779         def convert(offset: Text.Offset) = (offset /: edits)((i, edit) => edit.convert(i))
   786           if (is_cleared) 0 else (offset /: edits)((i, edit) => edit.convert(i))
   780         def revert(offset: Text.Offset) = (offset /: reverse_edits)((i, edit) => edit.revert(i))
   787         def revert(offset: Text.Offset) =
       
   788           if (is_cleared) 0 else (offset /: reverse_edits)((i, edit) => edit.revert(i))
       
   789 
   781 
   790         def convert(range: Text.Range) = range.map(convert(_))
   782         def convert(range: Text.Range) = range.map(convert(_))
   791         def revert(range: Text.Range) = range.map(revert(_))
   783         def revert(range: Text.Range) = range.map(revert(_))
   792 
   784 
   793         val node_name: Node.Name = name
   785         val node_name: Node.Name = name