src/Pure/PIDE/text_edit.scala
author wenzelm
Thu, 12 Aug 2010 15:19:11 +0200
changeset 38363 af7f41a8a0a8
parent 38154 343cb5d4034a
permissions -rw-r--r--
clarified "state" (accumulated data) vs. "exec" (execution that produces data); generic type Document.id (ML) / Document.ID;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
36676
ac7961d42ac3 some rearrangement of Scala sources;
wenzelm
parents: 34315
diff changeset
     1
/*  Title:      Pure/PIDE/text_edit.scala
34276
12436485c244 Basic edits on plain text.
wenzelm
parents:
diff changeset
     2
    Author:     Fabian Immler, TU Munich
12436485c244 Basic edits on plain text.
wenzelm
parents:
diff changeset
     3
    Author:     Makarius
12436485c244 Basic edits on plain text.
wenzelm
parents:
diff changeset
     4
12436485c244 Basic edits on plain text.
wenzelm
parents:
diff changeset
     5
Basic edits on plain text.
12436485c244 Basic edits on plain text.
wenzelm
parents:
diff changeset
     6
*/
12436485c244 Basic edits on plain text.
wenzelm
parents:
diff changeset
     7
12436485c244 Basic edits on plain text.
wenzelm
parents:
diff changeset
     8
package isabelle
12436485c244 Basic edits on plain text.
wenzelm
parents:
diff changeset
     9
12436485c244 Basic edits on plain text.
wenzelm
parents:
diff changeset
    10
34312
265075989f01 simplified Text_Edit -- deflated class hierarchy;
wenzelm
parents: 34302
diff changeset
    11
class Text_Edit(val is_insert: Boolean, val start: Int, val text: String)
34276
12436485c244 Basic edits on plain text.
wenzelm
parents:
diff changeset
    12
{
34315
c47a2228fead Text_Edit.toString;
wenzelm
parents: 34312
diff changeset
    13
  override def toString =
c47a2228fead Text_Edit.toString;
wenzelm
parents: 34312
diff changeset
    14
    (if (is_insert) "Insert(" else "Remove(") + (start, text).toString + ")"
c47a2228fead Text_Edit.toString;
wenzelm
parents: 34312
diff changeset
    15
c47a2228fead Text_Edit.toString;
wenzelm
parents: 34312
diff changeset
    16
34286
951aa92d06bb more text edit operations;
wenzelm
parents: 34276
diff changeset
    17
  /* transform offsets */
951aa92d06bb more text edit operations;
wenzelm
parents: 34276
diff changeset
    18
34312
265075989f01 simplified Text_Edit -- deflated class hierarchy;
wenzelm
parents: 34302
diff changeset
    19
  private def transform(do_insert: Boolean, offset: Int): Int =
265075989f01 simplified Text_Edit -- deflated class hierarchy;
wenzelm
parents: 34302
diff changeset
    20
    if (offset < start) offset
265075989f01 simplified Text_Edit -- deflated class hierarchy;
wenzelm
parents: 34302
diff changeset
    21
    else if (is_insert == do_insert) offset + text.length
265075989f01 simplified Text_Edit -- deflated class hierarchy;
wenzelm
parents: 34302
diff changeset
    22
    else (offset - text.length) max start
34286
951aa92d06bb more text edit operations;
wenzelm
parents: 34276
diff changeset
    23
38154
343cb5d4034a Text_Edit.convert/revert;
wenzelm
parents: 36676
diff changeset
    24
  def convert(offset: Int): Int = transform(true, offset)
343cb5d4034a Text_Edit.convert/revert;
wenzelm
parents: 36676
diff changeset
    25
  def revert(offset: Int): Int = transform(false, offset)
34286
951aa92d06bb more text edit operations;
wenzelm
parents: 34276
diff changeset
    26
951aa92d06bb more text edit operations;
wenzelm
parents: 34276
diff changeset
    27
951aa92d06bb more text edit operations;
wenzelm
parents: 34276
diff changeset
    28
  /* edit strings */
951aa92d06bb more text edit operations;
wenzelm
parents: 34276
diff changeset
    29
34312
265075989f01 simplified Text_Edit -- deflated class hierarchy;
wenzelm
parents: 34302
diff changeset
    30
  private def insert(index: Int, string: String): String =
34286
951aa92d06bb more text edit operations;
wenzelm
parents: 34276
diff changeset
    31
    string.substring(0, index) + text + string.substring(index)
951aa92d06bb more text edit operations;
wenzelm
parents: 34276
diff changeset
    32
951aa92d06bb more text edit operations;
wenzelm
parents: 34276
diff changeset
    33
  private def remove(index: Int, count: Int, string: String): String =
951aa92d06bb more text edit operations;
wenzelm
parents: 34276
diff changeset
    34
    string.substring(0, index) + string.substring(index + count)
951aa92d06bb more text edit operations;
wenzelm
parents: 34276
diff changeset
    35
34312
265075989f01 simplified Text_Edit -- deflated class hierarchy;
wenzelm
parents: 34302
diff changeset
    36
  def can_edit(string: String, shift: Int): Boolean =
265075989f01 simplified Text_Edit -- deflated class hierarchy;
wenzelm
parents: 34302
diff changeset
    37
    shift <= start && start < shift + string.length
34276
12436485c244 Basic edits on plain text.
wenzelm
parents:
diff changeset
    38
34312
265075989f01 simplified Text_Edit -- deflated class hierarchy;
wenzelm
parents: 34302
diff changeset
    39
  def edit(string: String, shift: Int): (Option[Text_Edit], String) =
265075989f01 simplified Text_Edit -- deflated class hierarchy;
wenzelm
parents: 34302
diff changeset
    40
    if (!can_edit(string, shift)) (Some(this), string)
265075989f01 simplified Text_Edit -- deflated class hierarchy;
wenzelm
parents: 34302
diff changeset
    41
    else if (is_insert) (None, insert(start - shift, string))
265075989f01 simplified Text_Edit -- deflated class hierarchy;
wenzelm
parents: 34302
diff changeset
    42
    else {
265075989f01 simplified Text_Edit -- deflated class hierarchy;
wenzelm
parents: 34302
diff changeset
    43
      val index = start - shift
265075989f01 simplified Text_Edit -- deflated class hierarchy;
wenzelm
parents: 34302
diff changeset
    44
      val count = text.length min (string.length - index)
265075989f01 simplified Text_Edit -- deflated class hierarchy;
wenzelm
parents: 34302
diff changeset
    45
      val rest =
265075989f01 simplified Text_Edit -- deflated class hierarchy;
wenzelm
parents: 34302
diff changeset
    46
        if (count == text.length) None
265075989f01 simplified Text_Edit -- deflated class hierarchy;
wenzelm
parents: 34302
diff changeset
    47
        else Some(new Text_Edit(false, start, text.substring(count)))
265075989f01 simplified Text_Edit -- deflated class hierarchy;
wenzelm
parents: 34302
diff changeset
    48
      (rest, remove(index, count, string))
265075989f01 simplified Text_Edit -- deflated class hierarchy;
wenzelm
parents: 34302
diff changeset
    49
    }
34276
12436485c244 Basic edits on plain text.
wenzelm
parents:
diff changeset
    50
}
12436485c244 Basic edits on plain text.
wenzelm
parents:
diff changeset
    51