Skip to content

Commit

Permalink
feat(json-text-provider): refactor to use extension point and remove …
Browse files Browse the repository at this point in the history
…duplicate code. #183
  • Loading branch information
phodal committed May 11, 2024
1 parent 33a6491 commit 2f04ba2
Show file tree
Hide file tree
Showing 5 changed files with 133 additions and 59 deletions.
@@ -0,0 +1,62 @@
package cc.unitmesh.local.provider

import cc.unitmesh.devti.custom.schema.CUSTOM_AGENT_FILE_NAME
import cc.unitmesh.devti.provider.local.JsonTextProvider
import com.intellij.json.JsonLanguage
import com.intellij.lang.Language
import com.intellij.openapi.editor.Document
import com.intellij.openapi.editor.colors.EditorColorsUtil
import com.intellij.openapi.editor.ex.EditorEx
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiFile
import com.intellij.ui.LanguageTextField
import java.awt.Dimension
import java.awt.FontMetrics

class LocalJsonTextProvider : JsonTextProvider {
override fun createComponent(
myProject: Project,
value: String,
placeholder: String,
fileName: String
): LanguageTextField {
return JsonLanguageField(myProject, value, placeholder, fileName)
}
}

class JsonLanguageField(
private val myProject: Project,
val value: String,
private val placeholder: String,
private val fileName: String
) :
LanguageTextField(
JsonLanguage.INSTANCE, myProject, value,
object : SimpleDocumentCreator() {
override fun createDocument(value: String?, language: Language?, project: Project?): Document {
return createDocument(value, language, project, this)
}

override fun customizePsiFile(file: PsiFile?) {
file?.name = CUSTOM_AGENT_FILE_NAME
}
}
) {

override fun createEditor(): EditorEx {
return super.createEditor().apply {
setShowPlaceholderWhenFocused(true)
setHorizontalScrollbarVisible(false)
setVerticalScrollbarVisible(true)
setPlaceholder(placeholder)

val scheme = EditorColorsUtil.getColorSchemeForBackground(this.colorsScheme.defaultBackground)
this.colorsScheme = this.createBoundColorSchemeDelegate(scheme)

val metrics: FontMetrics = getFontMetrics(font)
val columnWidth = metrics.charWidth('m')
isOneLineMode = false
preferredSize = Dimension(25 * columnWidth, 25 * metrics.height)
}
}
}
6 changes: 3 additions & 3 deletions local-bundle/src/main/resources/cc.unitmesh.local.xml
Expand Up @@ -5,7 +5,7 @@
<plugin id="com.intellij.modules.json"/>
</dependencies>

<actions>

</actions>
<extensions defaultExtensionNs="cc.unitmesh">
<jsonTextProvider implementation="cc.unitmesh.local.provider.LocalJsonTextProvider"/>
</extensions>
</idea-plugin>
@@ -1,45 +1,10 @@
package cc.unitmesh.devti.gui.component

import cc.unitmesh.devti.custom.schema.CUSTOM_AGENT_FILE_NAME
import com.intellij.json.JsonLanguage
import com.intellij.lang.Language
import com.intellij.openapi.editor.Document
import com.intellij.openapi.editor.colors.EditorColorsUtil
import com.intellij.openapi.editor.ex.EditorEx
import cc.unitmesh.devti.provider.local.JsonTextProvider
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiFile
import com.intellij.ui.LanguageTextField
import java.awt.Dimension
import java.awt.FontMetrics

class JsonLanguageField(private val myProject: Project, val value: String, private val placeholder: String, private val fileName: String) :
LanguageTextField(JsonLanguage.INSTANCE, myProject, value,
object : SimpleDocumentCreator() {
override fun createDocument(value: String?, language: Language?, project: Project?): Document {
return createDocument(value, language, project, this)
}

override fun customizePsiFile(file: PsiFile?) {
file?.name = CUSTOM_AGENT_FILE_NAME
}
}
) {

override fun createEditor(): EditorEx {
return super.createEditor().apply {
setShowPlaceholderWhenFocused(true)
setHorizontalScrollbarVisible(false)
setVerticalScrollbarVisible(true)
setPlaceholder(placeholder)

val scheme = EditorColorsUtil.getColorSchemeForBackground(this.colorsScheme.defaultBackground)
this.colorsScheme = this.createBoundColorSchemeDelegate(scheme)

val metrics: FontMetrics = getFontMetrics(font)
val columnWidth = metrics.charWidth('m')
isOneLineMode = false
preferredSize = Dimension(25 * columnWidth, 25 * metrics.height)
}
}
fun JsonLanguageField(myProject: Project, value: String, placeholder: String, fileName: String) : LanguageTextField {
return JsonTextProvider.create(myProject, value, placeholder, fileName)
}

@@ -0,0 +1,65 @@
package cc.unitmesh.devti.provider.local

import cc.unitmesh.devti.custom.schema.CUSTOM_AGENT_FILE_NAME
import com.intellij.lang.Language
import com.intellij.openapi.editor.Document
import com.intellij.openapi.editor.colors.EditorColorsUtil
import com.intellij.openapi.editor.ex.EditorEx
import com.intellij.openapi.extensions.ExtensionPointName
import com.intellij.openapi.fileTypes.PlainTextLanguage
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiFile
import com.intellij.ui.LanguageTextField
import java.awt.Dimension
import java.awt.FontMetrics

interface JsonTextProvider {
fun createComponent(myProject: Project, value: String, placeholder: String, fileName: String): LanguageTextField

companion object {
private val EP_NAME: ExtensionPointName<JsonTextProvider> =
ExtensionPointName("cc.unitmesh.jsonTextProvider")

fun create(myProject: Project, value: String, placeholder: String, fileName: String): LanguageTextField {
return EP_NAME.extensionList.map {
it.createComponent(myProject, value, placeholder, fileName)
}.firstOrNull() ?: DefaultLanguageField(myProject, value, placeholder, fileName)
}
}
}

class DefaultLanguageField(
private val myProject: Project,
val value: String,
private val placeholder: String,
private val fileName: String
) :
LanguageTextField(PlainTextLanguage.INSTANCE, myProject, value,
object : SimpleDocumentCreator() {
override fun createDocument(value: String?, language: Language?, project: Project?): Document {
return createDocument(value, language, project, this)
}

override fun customizePsiFile(file: PsiFile?) {
file?.name = CUSTOM_AGENT_FILE_NAME
}
}
) {

override fun createEditor(): EditorEx {
return super.createEditor().apply {
setShowPlaceholderWhenFocused(true)
setHorizontalScrollbarVisible(false)
setVerticalScrollbarVisible(true)
setPlaceholder(placeholder)

val scheme = EditorColorsUtil.getColorSchemeForBackground(this.colorsScheme.defaultBackground)
this.colorsScheme = this.createBoundColorSchemeDelegate(scheme)

val metrics: FontMetrics = getFontMetrics(font)
val columnWidth = metrics.charWidth('m')
isOneLineMode = false
preferredSize = Dimension(25 * columnWidth, 25 * metrics.height)
}
}
}

This file was deleted.

0 comments on commit 2f04ba2

Please sign in to comment.