diff --git a/.idea/misc.xml b/.idea/misc.xml
index 96e42b646..e93b2f4f6 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -169,6 +169,11 @@
+
+
+
+
+
diff --git a/app/src/main/java/com/itsaky/androidide/actions/filetree/RenameAction.kt b/app/src/main/java/com/itsaky/androidide/actions/filetree/RenameAction.kt
index 7951360c9..a0055d24e 100644
--- a/app/src/main/java/com/itsaky/androidide/actions/filetree/RenameAction.kt
+++ b/app/src/main/java/com/itsaky/androidide/actions/filetree/RenameAction.kt
@@ -75,10 +75,10 @@ class RenameAction(context: Context) :
return@setPositiveButton
}
- notifyFileRenamed(file, context)
+ notifyFileRenamed(file, name, context)
if (lastHeld != null) {
- val parent = lastHeld!!.parent
+ val parent = lastHeld.parent
parent.deleteChild(lastHeld)
val node = TreeNode(File(file.parentFile, name))
node.viewHolder = FileTreeViewHolder(context)
@@ -91,7 +91,7 @@ class RenameAction(context: Context) :
builder.create().show()
}
- private fun notifyFileRenamed(file: File, context: Context) {
- EventBus.getDefault().post(FileRenameEvent(file).apply { putData(context) })
+ private fun notifyFileRenamed(file: File, name: String, context: Context) {
+ EventBus.getDefault().post(FileRenameEvent(file, File(file.parent, name)).apply { putData(context) })
}
}
diff --git a/app/src/main/java/com/itsaky/androidide/activities/editor/EditorHandlerActivity.kt b/app/src/main/java/com/itsaky/androidide/activities/editor/EditorHandlerActivity.kt
index 059dcfb8e..bba4a2be9 100644
--- a/app/src/main/java/com/itsaky/androidide/activities/editor/EditorHandlerActivity.kt
+++ b/app/src/main/java/com/itsaky/androidide/activities/editor/EditorHandlerActivity.kt
@@ -38,6 +38,7 @@ import com.itsaky.androidide.editor.language.treesitter.TSLanguageRegistry
import com.itsaky.androidide.editor.language.xml.XMLLanguage
import com.itsaky.androidide.editor.schemes.IDEColorSchemeProvider
import com.itsaky.androidide.editor.ui.IDEEditor
+import com.itsaky.androidide.eventbus.events.file.FileRenameEvent
import com.itsaky.androidide.interfaces.IEditorHandler
import com.itsaky.androidide.models.OpenedFile
import com.itsaky.androidide.models.OpenedFilesCache
@@ -51,6 +52,8 @@ import com.itsaky.androidide.utils.IntentUtils.openImage
import com.itsaky.androidide.utils.flashSuccess
import io.github.rosemoe.sora.event.ContentChangeEvent
import java.io.File
+import org.greenrobot.eventbus.Subscribe
+import org.greenrobot.eventbus.ThreadMode
/**
* Base class for EditorActivity. Handles logic for working with file editors.
@@ -500,4 +503,19 @@ open class EditorHandlerActivity : ProjectHandlerActivity(), IEditorHandler {
}
builder.show()
}
+
+ @Subscribe(threadMode = ThreadMode.MAIN)
+ fun onFileRenamed(event: FileRenameEvent) {
+ val index = findIndexOfEditorByFile(event.file)
+ if (index < 0 || index >= binding.tabs.tabCount) {
+ return
+ }
+
+ val editor = getEditorAtIndex(index) ?: return
+ viewModel.updateFile(index, event.newFile)
+ editor.updateFile(event.newFile)
+
+ val tab = binding.tabs.getTabAt(index) ?: return
+ tab.text = event.newFile.name
+ }
}
diff --git a/app/src/main/java/com/itsaky/androidide/ui/editor/CodeEditorView.java b/app/src/main/java/com/itsaky/androidide/ui/editor/CodeEditorView.java
index 4b3e83447..61f224ddb 100644
--- a/app/src/main/java/com/itsaky/androidide/ui/editor/CodeEditorView.java
+++ b/app/src/main/java/com/itsaky/androidide/ui/editor/CodeEditorView.java
@@ -44,21 +44,13 @@ import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.widget.LinearLayout;
-
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-
import com.blankj.utilcode.util.FileIOUtils;
import com.blankj.utilcode.util.FileUtils;
import com.blankj.utilcode.util.SizeUtils;
import com.itsaky.androidide.app.BaseApplication;
import com.itsaky.androidide.editor.databinding.LayoutCodeEditorBinding;
-import com.itsaky.androidide.editor.language.treesitter.TreeSitterLanguage;
-import com.itsaky.androidide.editor.language.cpp.CppLanguage;
-import com.itsaky.androidide.editor.language.groovy.GroovyLanguage;
-import com.itsaky.androidide.editor.language.treesitter.TreeSitterLanguageProvider;
-import com.itsaky.androidide.editor.schemes.IDEColorScheme;
-import com.itsaky.androidide.editor.schemes.IDEColorSchemeProvider;
import com.itsaky.androidide.editor.ui.EditorSearchLayout;
import com.itsaky.androidide.editor.ui.IDEEditor;
import com.itsaky.androidide.eventbus.events.preferences.PreferenceChangeEvent;
@@ -69,25 +61,19 @@ import com.itsaky.androidide.lsp.java.JavaLanguageServer;
import com.itsaky.androidide.lsp.xml.XMLLanguageServer;
import com.itsaky.androidide.models.Range;
import com.itsaky.androidide.preferences.internal.EditorPreferencesKt;
-import com.itsaky.androidide.syntax.colorschemes.DynamicColorScheme;
import com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE;
import com.itsaky.androidide.utils.FileUtil;
import com.itsaky.androidide.utils.ILogger;
import com.itsaky.androidide.utils.TypefaceUtilsKt;
-
-import org.greenrobot.eventbus.EventBus;
-import org.greenrobot.eventbus.Subscribe;
-import org.greenrobot.eventbus.ThreadMode;
-
+import io.github.rosemoe.sora.text.LineSeparator;
+import io.github.rosemoe.sora.widget.component.Magnifier;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.CompletableFuture;
-
-import io.github.rosemoe.sora.lang.EmptyLanguage;
-import io.github.rosemoe.sora.lang.Language;
-import io.github.rosemoe.sora.text.LineSeparator;
-import io.github.rosemoe.sora.widget.component.Magnifier;
-import kotlin.io.FilesKt;
+import org.greenrobot.eventbus.EventBus;
+import org.greenrobot.eventbus.Subscribe;
+import org.greenrobot.eventbus.ThreadMode;
+import org.jetbrains.annotations.NotNull;
/**
* A view that handles opened code editors.
@@ -103,7 +89,7 @@ public class CodeEditorView extends LinearLayout {
private final EditorSearchLayout searchLayout;
public CodeEditorView(
- @NonNull Context context, @NonNull File file, final @NonNull Range selection) {
+ @NonNull Context context, @NonNull File file, final @NonNull Range selection) {
super(context);
this.file = file;
@@ -124,21 +110,21 @@ public class CodeEditorView extends LinearLayout {
addView(this.binding.getRoot(), new LayoutParams(LayoutParams.MATCH_PARENT, 0, 1f));
addView(
- this.searchLayout, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
+ this.searchLayout, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
CompletableFuture.runAsync(
- () -> {
- final var contents = FileIOUtils.readFile2String(file);
- final var editor = getEditor();
- editor.post(() -> {
- editor.setText(contents, createEditorArgs());
- postRead();
-
- selection.validate();
- editor.validateRange(selection);
- editor.setSelection(selection);
- });
+ () -> {
+ final var contents = FileIOUtils.readFile2String(file);
+ final var editor = getEditor();
+ editor.post(() -> {
+ editor.setText(contents, createEditorArgs());
+ postRead();
+
+ selection.validate();
+ editor.validateRange(selection);
+ editor.setSelection(selection);
});
+ });
configureEditorIfNeeded();
}
@@ -165,7 +151,7 @@ public class CodeEditorView extends LinearLayout {
protected void postRead() {
binding.editor.setupLanguage(getFile());
-
+
binding.editor.setLanguageServer(createLanguageServer(file));
if (IDELanguageClientImpl.isInitialized()) {
@@ -180,7 +166,7 @@ public class CodeEditorView extends LinearLayout {
((Activity) getContext()).invalidateOptionsMenu();
}
}
-
+
private ILanguageServer createLanguageServer(File file) {
if (!file.isFile()) {
return null;
@@ -390,7 +376,9 @@ public class CodeEditorView extends LinearLayout {
searchLayout.beginSearchMode();
}
- /** Mark this files as saved. Even if it not saved. */
+ /**
+ * Mark this files as saved. Even if it not saved.
+ */
public void markAsSaved() {
notifySaved();
}
@@ -408,4 +396,13 @@ public class CodeEditorView extends LinearLayout {
super.onDetachedFromWindow();
EventBus.getDefault().unregister(this);
}
+
+ public void updateFile(@NotNull File file) {
+ final var editor = getEditor();
+ if (editor == null) {
+ return;
+ }
+
+ editor.updateFile(file);
+ }
}
diff --git a/app/src/main/java/com/itsaky/androidide/viewmodel/EditorViewModel.kt b/app/src/main/java/com/itsaky/androidide/viewmodel/EditorViewModel.kt
index 5e4801118..5f13bf72f 100644
--- a/app/src/main/java/com/itsaky/androidide/viewmodel/EditorViewModel.kt
+++ b/app/src/main/java/com/itsaky/androidide/viewmodel/EditorViewModel.kt
@@ -137,6 +137,11 @@ class EditorViewModel : ViewModel() {
mCurrentFile.value = index to file
}
+ fun updateFile(index: Int, newFile: File) {
+ val files = files.value ?: return
+ files[index] = newFile
+ }
+
/**
* Get the opened file at the given index.
*
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 554c2ec4a..691350190 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
@@ -191,13 +191,17 @@ public class IDEEditor extends CodeEditor implements IEditor, ILspEditor {
* @param file The file to set.
*/
public void setFile(File file) {
- this.file = file;
+ updateFile(file);
if (file != null) {
dispatchDocumentOpenEvent();
}
}
+public void updateFile(File file) {
+ this.file = file;
+}
+
@NonNull
@Override
public Bundle getExtraArguments() {
diff --git a/eventbus-events/src/main/java/com/itsaky/androidide/eventbus/events/file/FileEvents.kt b/eventbus-events/src/main/java/com/itsaky/androidide/eventbus/events/file/FileEvents.kt
index ad1af6693..deea0621c 100644
--- a/eventbus-events/src/main/java/com/itsaky/androidide/eventbus/events/file/FileEvents.kt
+++ b/eventbus-events/src/main/java/com/itsaky/androidide/eventbus/events/file/FileEvents.kt
@@ -44,4 +44,4 @@ data class FileDeletionEvent(override val file: File) : FileEvent()
*
* @author Akash Yadav
*/
-class FileRenameEvent(override val file: File) : FileEvent()
+class FileRenameEvent(override val file: File, val newFile: File) : FileEvent()
\ No newline at end of file