[editor] IJPL-164140 Floating code toolbar is not configurable for JSON, XML, YAML and SQL files

(cherry picked from commit 9d3a74bf1433284ed0fb7e6e2b554926966110e7)
IJ-CR-148640

GitOrigin-RevId: 3c215330677d9e7730aaa04fbdd9fcffdbf3d7ba
This commit is contained in:
Yuriy Artamonov
2024-10-22 17:16:16 +02:00
committed by intellij-monorepo-bot
parent 7c6d11a5be
commit 0ad7df3289
12 changed files with 120 additions and 44 deletions

View File

@@ -1525,8 +1525,8 @@
<lang.unwrapDescriptor language="JAVA" implementationClass="com.intellij.codeInsight.unwrap.JavaUnwrapDescriptor"/>
<codeInsight.surroundWithRangeAdjuster
implementation="com.intellij.codeInsight.generation.surroundWith.JavaSurroundWithStatementRangeAdjuster"/>
<lang.floatingToolbarCustomizer language="JAVA"
implementationClass="com.intellij.ui.codeFloatingToolbar.FloatingToolbarCustomizer$DefaultGroup"/>
<lang.floatingToolbar language="JAVA"/>
<lang.surroundDescriptor language="JAVA"
implementationClass="com.intellij.codeInsight.generation.surroundWith.JavaExpressionSurroundDescriptor"/>
<lang.surroundDescriptor language="JAVA"

View File

@@ -130,8 +130,7 @@
<json.jsonStandardComplianceProvider implementation="com.intellij.json.jsonc.JsoncComplianceProvider"/>
<lang.floatingToolbarCustomizer language="JSON"
implementationClass="com.intellij.ui.codeFloatingToolbar.FloatingToolbarCustomizer$MinimalGroup"/>
<lang.floatingToolbar language="JSON" minimal="true"/>
<pluginSuggestionProvider implementation="com.jetbrains.jsonSchema.wiremock.WireMockSuggestionProvider"/>
</extensions>

View File

@@ -382,16 +382,14 @@ c:com.intellij.openapi.wm.impl.welcomeScreen.TabbedWelcomeScreen
- com.intellij.ui.components.JBLayeredPane
- <init>(javax.swing.JComponent,java.lang.String,Z,Z,java.lang.Runnable):V
- getPreferredSize():java.awt.Dimension
*:com.intellij.ui.codeFloatingToolbar.FloatingToolbarCustomization
- a:isToolbarAvailable():Z
*:com.intellij.ui.codeFloatingToolbar.FloatingToolbarCustomizer
- a:getActionGroup():java.lang.String
*f:com.intellij.ui.codeFloatingToolbar.FloatingToolbarCustomizer$DefaultGroup
- com.intellij.ui.codeFloatingToolbar.FloatingToolbarCustomizer
- <init>():V
- getActionGroup():java.lang.String
*c:com.intellij.ui.codeFloatingToolbar.FloatingToolbarCustomizer$MinimalGroup
- com.intellij.ui.codeFloatingToolbar.FloatingToolbarCustomizer
- <init>():V
- getActionGroup():java.lang.String
*c:com.intellij.ui.components.JBTreeTable
- javax.swing.JComponent
- com.intellij.ui.tree.TreePathBackgroundSupplier

View File

@@ -1,4 +1,4 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.ui.codeFloatingToolbar
import com.intellij.openapi.actionSystem.*
@@ -6,6 +6,7 @@ import com.intellij.openapi.actionSystem.ex.CustomComponentAction
import com.intellij.openapi.actionSystem.impl.ActionButtonWithText
import javax.swing.JComponent
@Deprecated("Implement such group on your own")
class DropdownActionGroup: DefaultActionGroup(), CustomComponentAction {
override fun createCustomComponent(presentation: Presentation, place: String): JComponent {

View File

@@ -4,12 +4,79 @@ package com.intellij.ui.codeFloatingToolbar
import com.intellij.lang.IdeLanguageCustomization
import com.intellij.lang.Language
import com.intellij.lang.LanguageExtension
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.extensions.ExtensionPointName
import com.intellij.openapi.extensions.PluginAware
import com.intellij.openapi.extensions.PluginDescriptor
import com.intellij.openapi.extensions.RequiredElement
import com.intellij.util.xmlb.annotations.Attribute
import org.jetbrains.annotations.ApiStatus
private val EP = LanguageExtension<FloatingToolbarCustomizer>("com.intellij.lang.floatingToolbarCustomizer")
@Deprecated("Use lang.floatingToolbar instead")
private val DEPRECATED_EP = LanguageExtension<FloatingToolbarCustomizer>("com.intellij.lang.floatingToolbarCustomizer")
private val EP: ExtensionPointName<FloatingToolbarLanguageBean> = ExtensionPointName.create("com.intellij.lang.floatingToolbar")
private const val FLOATING_CODE_TOOLBAR_GROUP_ID = "Floating.CodeToolbar"
private fun forLanguage(language: Language): FloatingToolbarLanguageBean? {
return EP.extensionList.firstOrNull { bean -> bean.language == language.id }
}
internal fun findActionGroupFor(language: Language): String? {
return EP.allForLanguage(language).firstNotNullOfOrNull { it.getActionGroup() }
val bean = forLanguage(language)
if (bean != null) {
if (bean.isMinimal) {
// check if any of the primary languages have full toolbar available
val hasPrimaryToolbar = IdeLanguageCustomization.getInstance().primaryIdeLanguages.any {
val bean = forLanguage(it)
bean != null && !bean.isMinimal
}
if (!hasPrimaryToolbar) return null
}
val customization = bean.getCustomization()
if (customization != null && !customization.isToolbarAvailable()) {
return null
}
return FLOATING_CODE_TOOLBAR_GROUP_ID
}
return DEPRECATED_EP.allForLanguage(language)
.firstNotNullOfOrNull { it.getActionGroup() }
}
internal fun hasMinimalFloatingToolbar(language: Language): Boolean {
return forLanguage(language)?.isMinimal == true
}
@ApiStatus.Experimental
interface FloatingToolbarCustomization {
fun isToolbarAvailable(): Boolean
}
internal class FloatingToolbarLanguageBean : PluginAware {
private var pluginDescriptor: PluginDescriptor? = null
override fun setPluginDescriptor(pluginDescriptor: PluginDescriptor) {
this.pluginDescriptor = pluginDescriptor
}
@Attribute("language")
@RequiredElement
var language: String? = null
@Attribute("minimal")
var isMinimal: Boolean = false
@Attribute("customizationClass")
var customizationClass: String? = null
fun getCustomization(): FloatingToolbarCustomization? {
if (customizationClass == null) return null
return ApplicationManager.getApplication().instantiateClass(customizationClass!!, pluginDescriptor!!)
}
}
/**
@@ -17,9 +84,9 @@ internal fun findActionGroupFor(language: Language): String? {
*
* @see CodeFloatingToolbar
* @see [FloatingToolbarCustomizer.DefaultGroup]
* @see [FloatingToolbarCustomizer.MinimalGroup]
*/
@ApiStatus.Experimental
@Deprecated("Use lang.floatingToolbar instead")
interface FloatingToolbarCustomizer {
/**
* @return id of the action group to be shown in the toolbar, or null if the toolbar shouldn't be available
@@ -27,25 +94,8 @@ interface FloatingToolbarCustomizer {
fun getActionGroup(): String?
@ApiStatus.Experimental
@Deprecated("Use lang.floatingToolbar instead")
class DefaultGroup : FloatingToolbarCustomizer {
override fun getActionGroup(): String {
return "Floating.CodeToolbar"
}
}
/**
* Actions for languages that do not support refactoring capabilities such as Extract and Surround, e.g., JSON and XML.
*/
@ApiStatus.Experimental
open class MinimalGroup : FloatingToolbarCustomizer {
override fun getActionGroup(): String? {
val hasPrimaryToolbar = IdeLanguageCustomization.getInstance().primaryIdeLanguages
.any { EP.allForLanguage(it).isNotEmpty() }
// primary language does not support floating toolbar, ignore in this IDE
if (!hasPrimaryToolbar) return null
return "Floating.CodeToolbar.Minimal"
}
override fun getActionGroup(): String = FLOATING_CODE_TOOLBAR_GROUP_ID
}
}

View File

@@ -0,0 +1,31 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.ui.codeFloatingToolbar
import com.intellij.openapi.actionSystem.*
import com.intellij.openapi.actionSystem.ex.CustomComponentAction
import com.intellij.openapi.actionSystem.impl.ActionButtonWithText
import javax.swing.JComponent
internal class RefactorDropdownActionGroup: DefaultActionGroup(), CustomComponentAction {
override fun getActionUpdateThread(): ActionUpdateThread = ActionUpdateThread.BGT
override fun createCustomComponent(presentation: Presentation, place: String): JComponent {
return object: ActionButtonWithText(this, presentation, place, ActionToolbar.DEFAULT_MINIMUM_BUTTON_SIZE) {
override fun actionPerformed(event: AnActionEvent) {
showActionGroupPopup(this@RefactorDropdownActionGroup, event)
}
}
}
override fun update(e: AnActionEvent) {
val language = e.getData(PlatformDataKeys.LANGUAGE)
if (language != null) {
e.presentation.isEnabledAndVisible = !hasMinimalFloatingToolbar(language)
}
else {
val activeActions = ActionGroupUtil.getActiveActions(this, e)
e.presentation.isVisible = true
e.presentation.isEnabled = activeActions.isNotEmpty
}
}
}

View File

@@ -2379,7 +2379,6 @@ action.DeleteRunConfiguration.text=Delete
action.DeleteRunConfiguration.description=Delete the run configuration
group.Floating.CodeToolbar.text=Floating Code Toolbar
group.Floating.CodeToolbar.Minimal.text=Floating Code Toolbar (Minimal)
action.Floating.CodeToolbar.Disable.text=Don't Show Toolbar
action.CodeFloatingToolbar.GotoNextMenu.text=Go to Next Toolbar Menu
action.CodeFloatingToolbar.GotoPrevMenu.text=Go to Previous Toolbar Menu

View File

@@ -432,6 +432,11 @@
<with attribute="implementationClass" implements="com.intellij.ui.codeFloatingToolbar.FloatingToolbarCustomizer"/>
</extensionPoint>
<extensionPoint name="lang.floatingToolbar" beanClass="com.intellij.ui.codeFloatingToolbar.FloatingToolbarLanguageBean"
dynamic="true">
<with attribute="customizationClass" implements="com.intellij.ui.codeFloatingToolbar.FloatingToolbarCustomization"/>
</extensionPoint>
<extensionPoint name="codeInsight.typeInfo" beanClass="com.intellij.lang.LanguageExtensionPoint" dynamic="true">
<with attribute="implementationClass" implements="com.intellij.lang.ExpressionTypeProvider"/>
</extensionPoint>

View File

@@ -384,8 +384,7 @@
<inspection.basicVisitor class="com.intellij.psi.XmlElementVisitor"/>
<lang.floatingToolbarCustomizer language="XML"
implementationClass="com.intellij.ui.codeFloatingToolbar.FloatingToolbarCustomizer$MinimalGroup"/>
<lang.floatingToolbar language="XML" minimal="true"/>
<localInspection language="XML" shortName="CheckTagEmptyBody" enabledByDefault="true" level="WARNING"
bundle="messages.XmlBundle" key="xml.inspections.check.tag.empty.body"

View File

@@ -468,13 +468,10 @@
</group>
<!-- Code -->
<group id="Floating.CodeToolbar.Minimal" popup="false" searchable="false">
</group>
<group id="Floating.CodeToolbar" popup="false" searchable="false">
<group id="Floating.CodeToolbar.Extract" popup="true" class="com.intellij.ui.codeFloatingToolbar.DropdownActionGroup"
<group id="Floating.CodeToolbar.Extract" popup="true" class="com.intellij.ui.codeFloatingToolbar.RefactorDropdownActionGroup"
searchable="false" />
<group id="Floating.CodeToolbar.Surround" popup="true" class="com.intellij.ui.codeFloatingToolbar.DropdownActionGroup"
<group id="Floating.CodeToolbar.Surround" popup="true" class="com.intellij.ui.codeFloatingToolbar.RefactorDropdownActionGroup"
searchable="false">
<!--suppress PluginXmlCapitalization -->
<action id="Floating.CodeToolbar.SurroundWithTryCatch" class="com.intellij.codeInsight.generation.actions.SurroundWithActionBase" />
@@ -619,7 +616,6 @@
<action id="CommentByLineComment" class="com.intellij.codeInsight.generation.actions.CommentByLineCommentAction"
icon="AllIcons.Actions.InlayRenameInComments">
<add-to-group group-id="Floating.CodeToolbar" anchor="after" relative-to-action="Floating.CodeToolbar.Surround" />
<add-to-group group-id="Floating.CodeToolbar.Minimal" anchor="last" />
</action>
<action id="CommentByBlockComment" class="com.intellij.codeInsight.generation.actions.CommentByBlockCommentAction"/>
</group>
@@ -627,7 +623,6 @@
<group id="CodeFormatGroup">
<action id="ReformatCode" class="com.intellij.codeInsight.actions.ReformatCodeAction" icon="AllIcons.Actions.ReformatCode">
<add-to-group group-id="Floating.CodeToolbar" anchor="after" relative-to-action="CommentByLineComment" />
<add-to-group group-id="Floating.CodeToolbar.Minimal" anchor="after" relative-to-action="CommentByLineComment" />
<synonym key="action.ReformatCode.synonym1"/>
</action>
<action id="ShowReformatFileDialog" class="com.intellij.codeInsight.actions.ShowReformatFileDialog"/>

View File

@@ -148,7 +148,7 @@
<gotoDeclarationHandler implementation="org.jetbrains.kotlin.idea.codeInsight.KotlinGotoValVarTypeHandler"/>
<focusModeProvider language="kotlin" implementationClass="org.jetbrains.kotlin.idea.core.KotlinFocusModeProvider" />
<lang.floatingToolbarCustomizer language="kotlin" implementationClass="com.intellij.ui.codeFloatingToolbar.FloatingToolbarCustomizer$DefaultGroup"/>
<lang.floatingToolbar language="kotlin"/>
<lang.foldingBuilder
language="kotlin"

View File

@@ -128,8 +128,7 @@
<psi.referenceContributor language="yaml" implementation="org.jetbrains.yaml.YAMLJsonSchemaIdReferenceContributor"/>
<completion.contributor language="yaml" implementationClass="org.jetbrains.yaml.YAMLJsonSchemaInCommentCompletionContributor"/>
<lang.floatingToolbarCustomizer language="yaml"
implementationClass="com.intellij.ui.codeFloatingToolbar.FloatingToolbarCustomizer$MinimalGroup"/>
<lang.floatingToolbar language="yaml" minimal="true"/>
<pluginSuggestionProvider implementation="org.jetbrains.yaml.swagger.OpenApiSuggestionProvider"/>
<intentionAction>