override fun documentChanged()

in intellij-plugin/educational-core/src/com/jetbrains/edu/learning/EduDocumentListener.kt [53:101]


  override fun documentChanged(e: DocumentEvent) {
    if (taskFile == null && !e.isInProjectContent()) return
    val taskFile = (taskFile ?: e.taskFile) ?: return
    if (!taskFile.isTrackChanges) {
      return
    }

    val project = holder.course?.project
    if (project != null) {
      SyncChangesStateManager.getInstance(project).taskFileChanged(taskFile)
    }

    if (taskFile.answerPlaceholders.isEmpty()) return

    if (e !is DocumentEventImpl) {
      return
    }

    val offset = e.getOffset()
    val change = e.getNewLength() - e.getOldLength()

    val fragment = e.getNewFragment()
    val oldFragment = e.getOldFragment()

    for (placeholder in taskFile.answerPlaceholders) {
      var placeholderStart = placeholder.offset
      var placeholderEnd = placeholder.endOffset

      val changes = getChangeForOffsets(offset, change, placeholder)
      val changeForStartOffset = changes.getFirst()
      val changeForEndOffset = changes.getSecond()

      placeholderStart += changeForStartOffset
      placeholderEnd += changeForEndOffset

      if (placeholderStart - 1 == offset && fragment.toString().isEmpty() && oldFragment.toString().startsWith("\n")) {
        placeholderStart -= 1
      }

      if (placeholderStart == offset && oldFragment.toString().isEmpty() && fragment.toString().startsWith("\n")) {
        placeholderStart += 1
      }

      val length = placeholderEnd - placeholderStart
      assert(length >= 0)
      assert(placeholderStart >= 0)
      updatePlaceholder(placeholder, placeholderStart, length)
    }
  }