equal
deleted
inserted
replaced
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 |