diff --git a/editor/src/main/java/com/itsaky/androidide/editor/ui/IDEEditor.java b/editor/src/main/java/com/itsaky/androidide/editor/ui/IDEEditor.java index cb6efe1d7..d21c68292 100644 --- a/editor/src/main/java/com/itsaky/androidide/editor/ui/IDEEditor.java +++ b/editor/src/main/java/com/itsaky/androidide/editor/ui/IDEEditor.java @@ -755,7 +755,7 @@ public class IDEEditor extends CodeEditor implements IEditor, ILspEditor { new Position(end.line, end.column, end.index)); final var changedText = event.getChangedText().toString(); - final var changeEvent = new DocumentChangeEvent(file, changedText, ++fileVersion, type, + final var changeEvent = new DocumentChangeEvent(file, changedText, getText().toString(), ++fileVersion, type, changeDelta, changeRange); // Notify FileManager first diff --git a/eventbus-events/src/main/java/com/itsaky/androidide/eventbus/events/editor/DocumentEvents.kt b/eventbus-events/src/main/java/com/itsaky/androidide/eventbus/events/editor/DocumentEvents.kt index f70d619bf..f4576263e 100644 --- a/eventbus-events/src/main/java/com/itsaky/androidide/eventbus/events/editor/DocumentEvents.kt +++ b/eventbus-events/src/main/java/com/itsaky/androidide/eventbus/events/editor/DocumentEvents.kt @@ -45,6 +45,7 @@ constructor(var closedFile: Path, val selectionRange: Range = Range.NONE) : data class DocumentChangeEvent( var changedFile: Path, var changedText: String, + var newText: String?, var version: Int, var changeType: ChangeType, var changeDelta: Int, diff --git a/subprojects/projects/src/main/java/com/itsaky/androidide/projects/FileManager.kt b/subprojects/projects/src/main/java/com/itsaky/androidide/projects/FileManager.kt index 3dd58779d..3c4f889c2 100644 --- a/subprojects/projects/src/main/java/com/itsaky/androidide/projects/FileManager.kt +++ b/subprojects/projects/src/main/java/com/itsaky/androidide/projects/FileManager.kt @@ -17,7 +17,6 @@ package com.itsaky.androidide.projects -import com.itsaky.androidide.eventbus.events.EventReceiver import com.itsaky.androidide.eventbus.events.editor.DocumentChangeEvent import com.itsaky.androidide.eventbus.events.editor.DocumentCloseEvent import com.itsaky.androidide.eventbus.events.editor.DocumentOpenEvent @@ -27,6 +26,7 @@ import com.itsaky.androidide.progress.ProcessCancelledException import com.itsaky.androidide.progress.ProgressManager import com.itsaky.androidide.projects.models.ActiveDocument import com.itsaky.androidide.utils.ILogger +import org.apache.commons.io.FileUtils import java.io.BufferedReader import java.io.InputStream import java.net.URI @@ -36,9 +36,6 @@ import java.nio.file.Path import java.nio.file.Paths import java.time.Instant import java.util.concurrent.ConcurrentHashMap -import org.apache.commons.io.FileUtils -import org.greenrobot.eventbus.Subscribe -import org.greenrobot.eventbus.ThreadMode.BACKGROUND /** * Manages active documents. @@ -119,14 +116,12 @@ object FileManager { document.version = event.version document.modified = Instant.now() - - // document is already open - // patch the changes - document.patch(event) + document.content = event.newText!! + event.newText = null } fun onDocumentClose(event: DocumentCloseEvent) { - activeDocuments.remove(event.closedFile.normalize())?.close() + activeDocuments.remove(event.closedFile.normalize()) } fun onFileRenamed(event: FileRenameEvent) { @@ -138,7 +133,7 @@ object FileManager { fun onFileDeleted(event: FileDeletionEvent) { // If the file was an active document, remove the document cache - activeDocuments.remove(event.file.toPath().normalize())?.close() + activeDocuments.remove(event.file.toPath().normalize()) } private fun createDocument(event: DocumentOpenEvent): ActiveDocument { diff --git a/subprojects/projects/src/main/java/com/itsaky/androidide/projects/models/ActiveDocument.kt b/subprojects/projects/src/main/java/com/itsaky/androidide/projects/models/ActiveDocument.kt index d3f806221..53ff36aee 100644 --- a/subprojects/projects/src/main/java/com/itsaky/androidide/projects/models/ActiveDocument.kt +++ b/subprojects/projects/src/main/java/com/itsaky/androidide/projects/models/ActiveDocument.kt @@ -37,46 +37,9 @@ open class ActiveDocument( var version: Int, var modified: Instant, content: String = "" -) : Closeable { - - private val _content = StringBuilder(content) - private val semaphore = Semaphore(1) - private val log = ILogger.newInstance("ActiveDocument") - - val content: String - get() = _content.toString() - - fun patch(event: DocumentChangeEvent) { - try { - semaphore.acquire() - } catch (e: Exception) { - log.error("Failed to acquire", e) - throw RuntimeException(e) - } - - try { - val text = event.changedText - val start = event.changeRange.start.requireIndex() - val end = event.changeRange.end.requireIndex() - - when (event.changeType) { - ChangeType.DELETE -> _content.delete(start, end) - ChangeType.INSERT -> _content.insert(start, text) - else -> { - _content.clear() - _content.append(text) - } - } - } catch (err: Throwable) { - throw RuntimeException(err) - } finally { - semaphore.release() - } - } - - override fun close() { - _content.clear() - } +) { + var content: String = content + internal set fun inputStream(): BufferedInputStream { return content.byteInputStream().buffered()