1
0
mirror of https://github.com/chylex/IntelliJ-Rainbow-Brackets.git synced 2025-05-11 03:34:04 +02:00

Fix Don't rainbowify big files notification annoying

This commit is contained in:
张志豪 2021-03-01 13:38:56 +08:00
parent 709d3e10b1
commit 8ddbc17c72
5 changed files with 106 additions and 39 deletions
src/main
kotlin/com/github/izhangzhihao/rainbow/brackets
resources/META-INF

View File

@ -0,0 +1,85 @@
package com.github.izhangzhihao.rainbow.brackets
import com.github.izhangzhihao.rainbow.brackets.settings.RainbowConfigurable
import com.github.izhangzhihao.rainbow.brackets.settings.RainbowSettings
import com.github.izhangzhihao.rainbow.brackets.util.memoizedFileExtension
import com.github.izhangzhihao.rainbow.brackets.visitor.RainbowHighlightVisitor.Companion.checkForBigFile
import com.intellij.icons.AllIcons
import com.intellij.ide.actions.ShowSettingsUtilImpl
import com.intellij.openapi.fileEditor.FileEditor
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.Key
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.ui.EditorNotificationPanel
import com.intellij.ui.EditorNotifications
import org.jetbrains.kotlin.idea.core.util.toPsiFile
import org.jetbrains.kotlin.idea.versions.createComponentActionLabel
class RainbowifyBanner(private val project: Project) : EditorNotifications.Provider<EditorNotificationPanel>() {
override fun getKey(): Key<EditorNotificationPanel> = KEY
override fun createNotificationPanel(file: VirtualFile, fileEditor: FileEditor): EditorNotificationPanel? {
if (!RainbowSettings.instance.isRainbowEnabled) {
if (RainbowSettings.instance.suppressDisabledCheck) return null
return EditorNotificationPanel().apply {
text("Rainbow Brackets is now disabled.")
icon(AllIcons.General.Warning)
createComponentActionLabel("got it, don't show again") {
RainbowSettings.instance.suppressDisabledCheck = true
EditorNotifications.getInstance(project).updateAllNotifications()
}
createComponentActionLabel("open setting") {
ShowSettingsUtilImpl.showSettingsDialog(project, RainbowConfigurable.ID, "")
EditorNotifications.getInstance(project).updateAllNotifications()
}
}
}
val psiFile = file.toPsiFile(project)
if (psiFile != null && !checkForBigFile(psiFile)) {
if (RainbowSettings.instance.suppressBigFileCheck) return null
return EditorNotificationPanel().apply {
text("Rainbowify is disabled by default for files > 1000 lines.")
icon(AllIcons.General.Information)
createComponentActionLabel("got it, don't show again") {
RainbowSettings.instance.suppressBigFileCheck = true
EditorNotifications.getInstance(project).updateAllNotifications()
}
createComponentActionLabel("open setting") {
ShowSettingsUtilImpl.showSettingsDialog(project, RainbowConfigurable.ID, "")
EditorNotifications.getInstance(project).updateAllNotifications()
}
}
}
if (
RainbowSettings.instance.languageBlacklist.contains(file.fileType.name) ||
RainbowSettings.instance.languageBlacklist.contains(memoizedFileExtension(file.name))
) {
if (RainbowSettings.instance.suppressBlackListCheck) return null
return EditorNotificationPanel().apply {
text("This language/file extensions is in the black list, will not be rainbowify")
icon(AllIcons.General.Information)
createComponentActionLabel("got it, don't show again") {
RainbowSettings.instance.suppressBlackListCheck = true
EditorNotifications.getInstance(project).updateAllNotifications()
}
createComponentActionLabel("open setting") {
ShowSettingsUtilImpl.showSettingsDialog(project, RainbowConfigurable.ID, "")
EditorNotifications.getInstance(project).updateAllNotifications()
}
}
}
return null
}
companion object {
private val KEY = Key.create<EditorNotificationPanel>("RainbowifyBanner")
}
}

View File

@ -1,12 +1,12 @@
package com.github.izhangzhihao.rainbow.brackets.settings
import com.github.izhangzhihao.rainbow.brackets.settings.form.RainbowSettingsForm
import com.intellij.openapi.options.Configurable
import com.intellij.openapi.options.ConfigurationException
import com.intellij.openapi.options.SearchableConfigurable
import org.jetbrains.annotations.Nls
import javax.swing.JComponent
class RainbowConfigurable : Configurable {
class RainbowConfigurable : SearchableConfigurable {
var settingsForm: RainbowSettingsForm? = null
override fun createComponent(): JComponent? {
@ -55,4 +55,10 @@ class RainbowConfigurable : Configurable {
@Nls
override fun getDisplayName() = "Rainbow Brackets"
override fun getId(): String = ID
companion object {
val ID = "preferences.rainbow.brackets"
}
}

View File

@ -43,6 +43,10 @@ class RainbowSettings : PersistentStateComponent<RainbowSettings> {
var languageBlacklist: Set<String> = setOf("hocon", "mxml")
var suppressDisabledCheck = false
var suppressBigFileCheck = false
var suppressBlackListCheck = false
@Nullable
override fun getState() = this

View File

@ -2,15 +2,11 @@ package com.github.izhangzhihao.rainbow.brackets.visitor
import com.github.izhangzhihao.rainbow.brackets.RainbowHighlighter.getHighlightInfo
import com.github.izhangzhihao.rainbow.brackets.RainbowInfo
import com.github.izhangzhihao.rainbow.brackets.RainbowUpdateNotifyActivity.Companion.pluginId
import com.github.izhangzhihao.rainbow.brackets.settings.RainbowSettings
import com.github.izhangzhihao.rainbow.brackets.util.memoizedFileExtension
import com.intellij.codeInsight.daemon.impl.HighlightVisitor
import com.intellij.codeInsight.daemon.impl.analysis.HighlightInfoHolder
import com.intellij.ide.plugins.PluginManagerCore
import com.intellij.notification.NotificationDisplayType
import com.intellij.notification.NotificationGroup
import com.intellij.notification.NotificationType
import com.intellij.openapi.editor.colors.EditorColorsManager
import com.intellij.openapi.extensions.PluginId
import com.intellij.openapi.util.TextRange
@ -33,36 +29,7 @@ abstract class RainbowHighlightVisitor : HighlightVisitor {
fileIsNotHaskellOrIntelliJHaskellPluginNotEnabled(file.fileType.name)
}
private fun checkForBigFile(file: PsiFile): Boolean {
if (RainbowSettings.instance.doNOTRainbowifyBigFiles && file.getLineCount() > 1000) {
if (!bigFilesNotified) {
bigFilesNotified = true
val group = NotificationGroup(
pluginId,
NotificationDisplayType.BALLOON,
true
)
val notification = group.createNotification(
"Rainbowify big files is disabled by default",
"File with line count > 1000 will not rainbowify by default. If you still want to rainbowify it, please config it in <b>Settings > Other Settings > Rainbow Brackets > Do NOT rainbowify big files</b>",
NotificationType.INFORMATION
)
notification.notify(file.project)
}
return false
}
return true
}
private fun fileIsNotHaskellOrIntelliJHaskellPluginNotEnabled(fileType: String) =
fileType != "Haskell" || !isIntelliJHaskellEnabled
final override fun analyze(file: PsiFile, updateWholeFile: Boolean, holder: HighlightInfoHolder, action: Runnable)
: Boolean {
final override fun analyze(file: PsiFile, updateWholeFile: Boolean, holder: HighlightInfoHolder, action: Runnable): Boolean {
highlightInfoHolder = holder
onBeforeAnalyze(file, updateWholeFile)
action.run()
@ -81,7 +48,7 @@ abstract class RainbowHighlightVisitor : HighlightVisitor {
startElement: PsiElement?,
endElement: PsiElement?) {
val holder = highlightInfoHolder ?: return
@Suppress("USELESS_ELVIS") val schema = holder.colorsScheme?: EditorColorsManager.getInstance().globalScheme
@Suppress("USELESS_ELVIS") val schema = holder.colorsScheme ?: EditorColorsManager.getInstance().globalScheme
getHighlightInfo(schema, this, level)
?.also {
holder.add(it)
@ -113,11 +80,15 @@ abstract class RainbowHighlightVisitor : HighlightVisitor {
PluginManagerCore.getPlugin(
PluginId.getId("intellij.haskell"))?.isEnabled ?: false
}
fun checkForBigFile(file: PsiFile): Boolean =
!(RainbowSettings.instance.doNOTRainbowifyBigFiles && file.getLineCount() > 1000)
private fun fileIsNotHaskellOrIntelliJHaskellPluginNotEnabled(fileType: String) =
fileType != "Haskell" || !isIntelliJHaskellEnabled
}
}
private var bigFilesNotified = false
fun PsiElement.getLineCount(): Int {
try {
val doc = containingFile?.let { PsiDocumentManager.getInstance(project).getDocument(it) }

View File

@ -704,6 +704,7 @@
<errorHandler implementation="com.github.izhangzhihao.rainbow.brackets.util.GitHubErrorReporter"/>
<highlightingPassFactory implementation="com.github.izhangzhihao.rainbow.brackets.indents.RainbowIndentsPassFactory"/>
<applicationService serviceImplementation="com.github.izhangzhihao.rainbow.brackets.ApplicationServicePlaceholder" id="ApplicationServicePlaceholder"/>
<editorNotificationProvider implementation="com.github.izhangzhihao.rainbow.brackets.RainbowifyBanner"/>
</extensions>
<applicationListeners>