diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 112590d2..79154778 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -114,7 +114,7 @@ dependencies { implementation("com.google.code.gson:gson:2.10.1") implementation("com.google.firebase:firebase-analytics-ktx") implementation("com.google.firebase:firebase-crashlytics-ktx") - implementation("com.google.firebase:firebase-perf-ktx:20.3.3") + implementation("com.google.firebase:firebase-perf-ktx:20.4.0") implementation("com.google.gms:google-services:4.3.15") implementation("com.squareup.okhttp3:okhttp:5.0.0-alpha.11") @@ -129,7 +129,7 @@ dependencies { implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.2.0-alpha01") implementation("androidx.viewpager2:viewpager2:1.1.0-beta02") - val editorVersion = "0.21.1-fb69afb-SNAPSHOT" + val editorVersion = "0.21.1-a50ba9c-SNAPSHOT" implementation("io.github.Rosemoe.sora-editor:editor:$editorVersion") implementation("io.github.Rosemoe.sora-editor:language-textmate:$editorVersion") implementation("io.github.dingyi222666:treeview:1.2.1") @@ -139,12 +139,12 @@ dependencies { implementation("com.github.sya-ri:kgit:1.0.5") // markwon - val markwon_version = "4.6.2" - implementation("io.noties.markwon:core:$markwon_version") - implementation("io.noties.markwon:html:$markwon_version") - implementation("io.noties.markwon:image:$markwon_version") - implementation("io.noties.markwon:image-glide:$markwon_version") - implementation("io.noties.markwon:linkify:$markwon_version") + val markwonVersion = "4.6.2" + implementation("io.noties.markwon:core:$markwonVersion") + implementation("io.noties.markwon:html:$markwonVersion") + implementation("io.noties.markwon:image:$markwonVersion") + implementation("io.noties.markwon:image-glide:$markwonVersion") + implementation("io.noties.markwon:linkify:$markwonVersion") implementation("com.aliucord:Aliuhook:main-SNAPSHOT") implementation("de.maxr1998:modernandroidpreferences:2.3.2") diff --git a/app/src/main/kotlin/org/cosmicide/rewrite/adapter/EditorAdapter.kt b/app/src/main/kotlin/org/cosmicide/rewrite/adapter/EditorAdapter.kt index 03d3c65e..55d3bd43 100644 --- a/app/src/main/kotlin/org/cosmicide/rewrite/adapter/EditorAdapter.kt +++ b/app/src/main/kotlin/org/cosmicide/rewrite/adapter/EditorAdapter.kt @@ -14,10 +14,13 @@ import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.viewpager2.adapter.FragmentStateAdapter +import io.github.rosemoe.sora.event.ContentChangeEvent +import io.github.rosemoe.sora.event.SubscriptionReceipt import io.github.rosemoe.sora.lang.EmptyLanguage import io.github.rosemoe.sora.langs.textmate.TextMateColorScheme import io.github.rosemoe.sora.langs.textmate.TextMateLanguage import io.github.rosemoe.sora.langs.textmate.registry.ThemeRegistry +import io.github.rosemoe.sora.widget.subscribeEvent import org.cosmicide.build.Javap import org.cosmicide.editor.analyzers.EditorDiagnosticsMarker import org.cosmicide.rewrite.editor.IdeEditor @@ -70,16 +73,11 @@ class EditorAdapter(val fragment: Fragment, val fileViewModel: FileViewModel) : fragments.forEach { it.save() } } - fun destroyAll() { - fragments.forEach { fg -> - fg.editor.release() - fragment.childFragmentManager.beginTransaction().remove(fg).commit() - } - } - class CodeEditorFragment(val file: File) : Fragment() { lateinit var editor: IdeEditor + private lateinit var eventReceiver: SubscriptionReceipt + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -91,28 +89,25 @@ class EditorAdapter(val fragment: Fragment, val fileViewModel: FileViewModel) : override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + setText() setEditorLanguage() setColorScheme() - setText() } private fun setEditorLanguage() { + val project = ProjectHandler.getProject() ?: return when (file.extension) { "java" -> { if (editor.editorLanguage is JavaLanguage) return editor.setEditorLanguage( JavaLanguage( editor, - ProjectHandler.getProject()!!, + project, file ) ) - editor.text.addContentListener(EditorDiagnosticsMarker.INSTANCE) - EditorDiagnosticsMarker.INSTANCE.init( - editor, - file, - ProjectHandler.getProject()!! - ) + eventReceiver = + editor.subscribeEvent(EditorDiagnosticsMarker(editor, file, project)) } "kt" -> { @@ -120,7 +115,7 @@ class EditorAdapter(val fragment: Fragment, val fileViewModel: FileViewModel) : editor.setEditorLanguage( KotlinLanguage( editor, - ProjectHandler.getProject()!!, + project, file ) ) @@ -135,10 +130,6 @@ class EditorAdapter(val fragment: Fragment, val fileViewModel: FileViewModel) : } } - if (file.extension != "java") { - editor.text.removeContentListener(EditorDiagnosticsMarker.INSTANCE) - } - editor.setFont() } @@ -154,6 +145,9 @@ class EditorAdapter(val fragment: Fragment, val fileViewModel: FileViewModel) : return } + println("Reading file: ${file.absolutePath}") + println("File exists: ${file.exists()}") + println("Contents: ${file.readText()}") editor.setText(file.readText()) } @@ -166,5 +160,10 @@ class EditorAdapter(val fragment: Fragment, val fileViewModel: FileViewModel) : super.onConfigurationChanged(newConfig) setColorScheme() } + + override fun onDestroy() { + super.onDestroy() + editor.release() + } } } diff --git a/app/src/main/kotlin/org/cosmicide/rewrite/editor/IdeEditor.kt b/app/src/main/kotlin/org/cosmicide/rewrite/editor/IdeEditor.kt index d56bd6ec..baa53f45 100644 --- a/app/src/main/kotlin/org/cosmicide/rewrite/editor/IdeEditor.kt +++ b/app/src/main/kotlin/org/cosmicide/rewrite/editor/IdeEditor.kt @@ -14,6 +14,8 @@ import com.google.common.collect.ImmutableSet import io.github.rosemoe.sora.langs.textmate.TextMateColorScheme import io.github.rosemoe.sora.langs.textmate.registry.ThemeRegistry import io.github.rosemoe.sora.widget.CodeEditor +import io.github.rosemoe.sora.widget.component.EditorDiagnosticTooltipWindow +import io.github.rosemoe.sora.widget.schemes.EditorColorScheme import org.cosmicide.rewrite.common.Prefs import org.cosmicide.rewrite.extension.setCompletionLayout import org.cosmicide.rewrite.extension.setFont @@ -32,11 +34,13 @@ class IdeEditor @JvmOverloads constructor( init { colorScheme = TextMateColorScheme.create(ThemeRegistry.getInstance()) setCompletionLayout() + setTooltipImprovements() setFont() inputType = createInputFlags() updateNonPrintablePaintingFlags() updateTextSize() updateTabSize() + setInterceptParentHorizontalScrollIfNeeded(true) isLigatureEnabled = Prefs.useLigatures isWordwrap = Prefs.wordWrap setScrollBarEnabled(Prefs.scrollbarEnabled) @@ -93,4 +97,11 @@ class IdeEditor @JvmOverloads constructor( EditorInfo.TYPE_TEXT_FLAG_NO_SUGGESTIONS or EditorInfo.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD } -} \ No newline at end of file + + private fun setTooltipImprovements() { + getComponent(EditorDiagnosticTooltipWindow::class.java).apply { + setSize(500, 100) + parentView.setBackgroundColor(colorScheme.getColor(EditorColorScheme.WHOLE_BACKGROUND)) + } + } +} diff --git a/app/src/main/kotlin/org/cosmicide/rewrite/fragment/EditorFragment.kt b/app/src/main/kotlin/org/cosmicide/rewrite/fragment/EditorFragment.kt index 09f6c4ae..dade3e11 100644 --- a/app/src/main/kotlin/org/cosmicide/rewrite/fragment/EditorFragment.kt +++ b/app/src/main/kotlin/org/cosmicide/rewrite/fragment/EditorFragment.kt @@ -71,6 +71,7 @@ class EditorFragment( binding.pager.apply { editorAdapter = EditorAdapter(this@EditorFragment, fileViewModel) adapter = editorAdapter + isUserInputEnabled = false } binding.tabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { @@ -79,7 +80,7 @@ class EditorFragment( } override fun onTabUnselected(tab: TabLayout.Tab?) { - + binding.pager.currentItem = tab!!.position } override fun onTabReselected(tab: TabLayout.Tab?) { @@ -228,7 +229,7 @@ class EditorFragment( fun getCurrentFragment(): EditorAdapter.CodeEditorFragment? { - return editorAdapter.getItem(binding.tabLayout.selectedTabPosition) + return editorAdapter.getItem(binding.pager.currentItem) } private fun configureToolbar() { @@ -448,9 +449,7 @@ class EditorFragment( } private fun navigateToCompileInfoFragment() { - for (i in 0 until editorAdapter.itemCount) { - editorAdapter.getItem(i)?.save() - } + editorAdapter.saveAll() parentFragmentManager.beginTransaction().apply { add(R.id.fragment_container, CompileInfoFragment()) addToBackStack(null) @@ -490,7 +489,7 @@ class EditorFragment( popup.setOnMenuItemClickListener { when (it.itemId) { R.id.close_tab -> { - fileViewModel.removeFile(fileViewModel.files.value!![position]) + fileViewModel.removeFile(position) } R.id.close_all_tab -> fileViewModel.removeAll() diff --git a/app/src/main/kotlin/org/cosmicide/rewrite/model/FileViewModel.kt b/app/src/main/kotlin/org/cosmicide/rewrite/model/FileViewModel.kt index 45d2020f..9f43a409 100644 --- a/app/src/main/kotlin/org/cosmicide/rewrite/model/FileViewModel.kt +++ b/app/src/main/kotlin/org/cosmicide/rewrite/model/FileViewModel.kt @@ -53,12 +53,13 @@ class FileViewModel : ViewModel() { /** * Removes the given file from the list of files. */ - fun removeFile(file: File) { - files.value = files.value?.toMutableList()?.apply { remove(file) } + fun removeFile(pos: Int) { + files.value = files.value?.toMutableList()?.apply { removeAt(pos + 1) } + if (files.value!!.isEmpty()) { setCurrentPosition(-1) } else { - setCurrentPosition(currentPosition.value?.minus(1) ?: 0) + setCurrentPosition(pos - 1) } } diff --git a/build-tools/src/main/java/org/cosmicide/editor/analyzers/EditorDiagnosticsMarker.kt b/build-tools/src/main/java/org/cosmicide/editor/analyzers/EditorDiagnosticsMarker.kt index 1648a7c2..de9c6c04 100644 --- a/build-tools/src/main/java/org/cosmicide/editor/analyzers/EditorDiagnosticsMarker.kt +++ b/build-tools/src/main/java/org/cosmicide/editor/analyzers/EditorDiagnosticsMarker.kt @@ -7,82 +7,43 @@ package org.cosmicide.editor.analyzers +import io.github.rosemoe.sora.event.ContentChangeEvent +import io.github.rosemoe.sora.event.EventReceiver +import io.github.rosemoe.sora.event.Unsubscribe import io.github.rosemoe.sora.lang.diagnostic.DiagnosticsContainer import io.github.rosemoe.sora.text.Content -import io.github.rosemoe.sora.text.ContentListener import io.github.rosemoe.sora.widget.CodeEditor -import io.github.rosemoe.sora.widget.component.EditorDiagnosticTooltipWindow -import io.github.rosemoe.sora.widget.schemes.EditorColorScheme import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import org.cosmicide.project.Project import java.io.File -class EditorDiagnosticsMarker : ContentListener { +class EditorDiagnosticsMarker( + val editor: CodeEditor, + val file: File, + val project: Project +) : EventReceiver { - private val analyzer: JavaAnalyzer by lazy { JavaAnalyzer(editor, project, file) } private val diagnostics = DiagnosticsContainer() - private lateinit var editor: CodeEditor - private lateinit var file: File - private lateinit var project: Project + private var analyzer = JavaAnalyzer(editor, project) - fun init(editor: CodeEditor, file: File, project: Project) { - this.editor = editor - this.file = file - this.project = project + init { analyze(editor.text) - editor.post { - val window = editor.getComponent(EditorDiagnosticTooltipWindow::class.java) - window.setSize(500, 100) - window.parentView.setBackgroundColor(editor.colorScheme.getColor(EditorColorScheme.WHOLE_BACKGROUND)) - } } - override fun beforeReplace(content: Content) {} - - override fun afterInsert( - content: Content, - startLine: Int, - startColumn: Int, - endLine: Int, - endColumn: Int, - insertedContent: CharSequence - ) { - analyze(content) - } - - override fun afterDelete( - content: Content, - startLine: Int, - startColumn: Int, - endLine: Int, - endColumn: Int, - deletedContent: CharSequence - ) { - analyze(content) + override fun onReceive(event: ContentChangeEvent, unsubscribe: Unsubscribe) { + analyze(event.editor.text) } private fun analyze(content: Content) = CoroutineScope(Dispatchers.IO).launch { - val code = content.toString() - file.writeText(code) + file.writeText(content.toString()) analyzer.reset() - try { - if (file.extension != "java") { - return@launch - } - analyzer.analyze() - diagnostics.reset() - diagnostics.addDiagnostics(analyzer.getDiagnostics()) - editor.post { - editor.diagnostics = diagnostics - } - } catch (e: Exception) { - e.printStackTrace() - } - } - companion object { - val INSTANCE = EditorDiagnosticsMarker() + analyzer.analyze() + diagnostics.reset() + diagnostics.addDiagnostics(analyzer.getDiagnostics()) + + editor.diagnostics = diagnostics } } \ No newline at end of file diff --git a/build-tools/src/main/java/org/cosmicide/editor/analyzers/JavaAnalyzer.kt b/build-tools/src/main/java/org/cosmicide/editor/analyzers/JavaAnalyzer.kt index 3338bd19..7dc49130 100644 --- a/build-tools/src/main/java/org/cosmicide/editor/analyzers/JavaAnalyzer.kt +++ b/build-tools/src/main/java/org/cosmicide/editor/analyzers/JavaAnalyzer.kt @@ -25,8 +25,7 @@ import javax.tools.StandardLocation class JavaAnalyzer( val editor: CodeEditor, - val project: Project, - val currentFile: File + val project: Project ) { private val args by lazy { listOf( diff --git a/feature/java-completion/src/main/java/org/cosmicide/completion/java/parser/CompletionProvider.kt b/feature/java-completion/src/main/java/org/cosmicide/completion/java/parser/CompletionProvider.kt index 7ba5714f..41ec4d68 100644 --- a/feature/java-completion/src/main/java/org/cosmicide/completion/java/parser/CompletionProvider.kt +++ b/feature/java-completion/src/main/java/org/cosmicide/completion/java/parser/CompletionProvider.kt @@ -30,6 +30,7 @@ import com.intellij.psi.JavaTokenType import com.intellij.psi.PsiAssignmentExpression import com.intellij.psi.PsiComment import com.intellij.psi.PsiElement +import com.intellij.psi.PsiElementFactory import com.intellij.psi.PsiElementFinder import com.intellij.psi.PsiExpressionStatement import com.intellij.psi.PsiField @@ -138,31 +139,56 @@ class CompletionProvider { @Suppress("DEPRECATION") fun registerExtensions(extensionArea: ExtensionsAreaImpl) { - extensionArea.registerExtensionPoint( - "com.intellij.virtualFileManagerListener", - VirtualFileManagerImpl::class.java.name, - ExtensionPoint.Kind.INTERFACE - ) - Extensions.getRootArea().registerExtensionPoint( - "com.intellij.treeCopyHandler", - TreeCopyHandler::class.java.name, - ExtensionPoint.Kind.INTERFACE - ) - Extensions.getRootArea().registerExtensionPoint( - "com.intellij.lang.psiAugmentProvider", - PsiAugmentProvider::class.java.name, - ExtensionPoint.Kind.INTERFACE - ) - extensionArea.registerExtensionPoint( - "com.intellij.java.elementFinder", - PsiElementFinder::class.java.name, - ExtensionPoint.Kind.INTERFACE - ) - Extensions.getRootArea().registerExtensionPoint( - "com.intellij.java.elementFinder", - PsiElementFinder::class.java.name, - ExtensionPoint.Kind.INTERFACE - ) + if (extensionArea.hasExtensionPoint("com.intellij.virtualFileManagerListener").not()) { + extensionArea.registerExtensionPoint( + "com.intellij.virtualFileManagerListener", + VirtualFileManagerImpl::class.java.name, + ExtensionPoint.Kind.INTERFACE + ) + } + if (extensionArea.hasExtensionPoint("com.intellij.java.elementFinder").not()) { + extensionArea.registerExtensionPoint( + "com.intellij.java.elementFinder", + PsiElementFinder::class.java.name, + ExtensionPoint.Kind.INTERFACE + ) + } + val rootArea = Extensions.getRootArea() + if (rootArea.hasExtensionPoint("com.intellij.treeCopyHandler").not()) { + rootArea.registerExtensionPoint( + "com.intellij.treeCopyHandler", + TreeCopyHandler::class.java.name, + ExtensionPoint.Kind.INTERFACE + ) + } + if (rootArea.hasExtensionPoint("com.intellij.codeStyleManager").not()) { + rootArea.registerExtensionPoint( + "com.intellij.codeStyleManager", + CodeStyleManager::class.java.name, + ExtensionPoint.Kind.INTERFACE + ) + } + if (rootArea.hasExtensionPoint("com.intellij.psiElementFactory").not()) { + rootArea.registerExtensionPoint( + "com.intellij.psiElementFactory", + PsiElementFactory::class.java.name, + ExtensionPoint.Kind.INTERFACE + ) + } + if (rootArea.hasExtensionPoint("com.intellij.lang.psiAugmentProvider").not()) { + rootArea.registerExtensionPoint( + "com.intellij.lang.psiAugmentProvider", + PsiAugmentProvider::class.java.name, + ExtensionPoint.Kind.INTERFACE + ) + } + if (rootArea.hasExtensionPoint("com.intellij.psiElementFinder").not()) { + rootArea.registerExtensionPoint( + "com.intellij.psiElementFinder", + PsiElementFinder::class.java.name, + ExtensionPoint.Kind.INTERFACE + ) + } } }