mirror of
https://github.com/chylex/IntelliJ-Inspection-Lens.git
synced 2025-01-30 12:46:05 +01:00
Compare commits
4 Commits
603b35abdb
...
c2004c77d5
Author | SHA1 | Date | |
---|---|---|---|
c2004c77d5 | |||
2a4764fa15 | |||
4bd0931d71 | |||
0f41b22872 |
1
.github/FUNDING.yml
vendored
1
.github/FUNDING.yml
vendored
@ -1,3 +1,2 @@
|
|||||||
github: chylex
|
github: chylex
|
||||||
patreon: chylex
|
|
||||||
ko_fi: chylex
|
ko_fi: chylex
|
||||||
|
@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
Displays errors, warnings, and other inspections inline. Highlights the background of lines with inspections. Supports light and dark themes out of the box.
|
Displays errors, warnings, and other inspections inline. Highlights the background of lines with inspections. Supports light and dark themes out of the box.
|
||||||
|
|
||||||
By default, the plugin shows **Errors**, **Warnings**, **Weak Warnings**, **Server Problems**, **Grammar Errors**, **Typos**, and other inspections with a high enough severity level. Configure visible severities in **Settings | Tools | Inspection Lens**.
|
By default, the plugin shows **Errors**, **Warnings**, **Weak Warnings**, **Server Problems**, **Grammar Errors**, **Typos**, and other inspections with a high enough severity level. Left-click an inspection to show quick fixes. Middle-click an inspection to navigate to the relevant code in the editor.
|
||||||
|
|
||||||
Left-click an inspection to show quick fixes. Middle-click an inspection to navigate to the relevant code in the editor.
|
Configure appearance, behavior of clicking on inspections, and visible severities in **Settings | Tools | Inspection Lens**.
|
||||||
|
|
||||||
Inspired by [Error Lens](https://marketplace.visualstudio.com/items?itemName=usernamehw.errorlens) for Visual Studio Code, and [Inline Error](https://plugins.jetbrains.com/plugin/17302-inlineerror) for IntelliJ Platform.
|
Inspired by [Error Lens](https://marketplace.visualstudio.com/items?itemName=usernamehw.errorlens) for Visual Studio Code, and [Inline Error](https://plugins.jetbrains.com/plugin/17302-inlineerror) for IntelliJ Platform.
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@ plugins {
|
|||||||
}
|
}
|
||||||
|
|
||||||
group = "com.chylex.intellij.inspectionlens"
|
group = "com.chylex.intellij.inspectionlens"
|
||||||
version = "1.5"
|
version = "1.5.1"
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package com.chylex.intellij.inspectionlens.editor.lens
|
package com.chylex.intellij.inspectionlens.editor.lens
|
||||||
|
|
||||||
|
import com.chylex.intellij.inspectionlens.settings.LensHoverMode
|
||||||
import com.chylex.intellij.inspectionlens.settings.LensSettingsState
|
import com.chylex.intellij.inspectionlens.settings.LensSettingsState
|
||||||
import com.intellij.codeInsight.daemon.impl.HighlightInfo
|
import com.intellij.codeInsight.daemon.impl.HighlightInfo
|
||||||
import com.intellij.codeInsight.daemon.impl.HintRenderer
|
import com.intellij.codeInsight.daemon.impl.HintRenderer
|
||||||
@ -16,6 +17,7 @@ import com.intellij.ui.paint.EffectPainter
|
|||||||
import java.awt.Cursor
|
import java.awt.Cursor
|
||||||
import java.awt.Graphics
|
import java.awt.Graphics
|
||||||
import java.awt.Graphics2D
|
import java.awt.Graphics2D
|
||||||
|
import java.awt.MouseInfo
|
||||||
import java.awt.Point
|
import java.awt.Point
|
||||||
import java.awt.Rectangle
|
import java.awt.Rectangle
|
||||||
import java.awt.event.MouseEvent
|
import java.awt.event.MouseEvent
|
||||||
@ -25,8 +27,7 @@ import javax.swing.SwingUtilities
|
|||||||
/**
|
/**
|
||||||
* Renders the text of an inspection lens.
|
* Renders the text of an inspection lens.
|
||||||
*/
|
*/
|
||||||
class LensRenderer(private var info: HighlightInfo, settings: LensSettingsState) : HintRenderer(null), InputHandler {
|
class LensRenderer(private var info: HighlightInfo, private val settings: LensSettingsState) : HintRenderer(null), InputHandler {
|
||||||
private val useEditorFont = settings.useEditorFont
|
|
||||||
private lateinit var inlay: Inlay<*>
|
private lateinit var inlay: Inlay<*>
|
||||||
private lateinit var attributes: LensSeverityTextAttributes
|
private lateinit var attributes: LensSeverityTextAttributes
|
||||||
private var extraRightPadding = 0
|
private var extraRightPadding = 0
|
||||||
@ -54,7 +55,7 @@ class LensRenderer(private var info: HighlightInfo, settings: LensSettingsState)
|
|||||||
fixBaselineForTextRendering(r)
|
fixBaselineForTextRendering(r)
|
||||||
super.paint(inlay, g, r, textAttributes)
|
super.paint(inlay, g, r, textAttributes)
|
||||||
|
|
||||||
if (hovered) {
|
if (hovered && isHoveringText()) {
|
||||||
paintHoverEffect(inlay, g, r)
|
paintHoverEffect(inlay, g, r)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -80,7 +81,7 @@ class LensRenderer(private var info: HighlightInfo, settings: LensSettingsState)
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun useEditorFont(): Boolean {
|
override fun useEditorFont(): Boolean {
|
||||||
return useEditorFont
|
return settings.useEditorFont
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun mouseMoved(event: MouseEvent, translated: Point) {
|
override fun mouseMoved(event: MouseEvent, translated: Point) {
|
||||||
@ -92,6 +93,10 @@ class LensRenderer(private var info: HighlightInfo, settings: LensSettingsState)
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun setHovered(hovered: Boolean) {
|
private fun setHovered(hovered: Boolean) {
|
||||||
|
if (hovered && settings.lensHoverMode == LensHoverMode.DISABLED) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if (this.hovered == hovered) {
|
if (this.hovered == hovered) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -108,22 +113,33 @@ class LensRenderer(private var info: HighlightInfo, settings: LensSettingsState)
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun mousePressed(event: MouseEvent, translated: Point) {
|
override fun mousePressed(event: MouseEvent, translated: Point) {
|
||||||
if (!isHoveringText(translated)) {
|
val hoverMode = settings.lensHoverMode
|
||||||
|
if (hoverMode == LensHoverMode.DISABLED || !isHoveringText(translated)) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SwingUtilities.isLeftMouseButton(event) || SwingUtilities.isMiddleMouseButton(event)) {
|
if (event.button.let { it == MouseEvent.BUTTON1 || it == MouseEvent.BUTTON2 }) {
|
||||||
event.consume()
|
event.consume()
|
||||||
|
|
||||||
val editor = inlay.editor
|
val editor = inlay.editor
|
||||||
moveToOffset(editor, info.actualStartOffset)
|
moveToOffset(editor, info.actualStartOffset)
|
||||||
|
|
||||||
if (SwingUtilities.isLeftMouseButton(event)) {
|
if ((event.button == MouseEvent.BUTTON1) xor (hoverMode != LensHoverMode.DEFAULT)) {
|
||||||
IntentionsPopup.show(editor)
|
IntentionsPopup.show(editor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun isHoveringText(): Boolean {
|
||||||
|
val bounds = inlay.bounds ?: return false
|
||||||
|
val translatedPoint = MouseInfo.getPointerInfo().location.apply {
|
||||||
|
SwingUtilities.convertPointFromScreen(this, inlay.editor.contentComponent)
|
||||||
|
translate(-bounds.x, -bounds.y)
|
||||||
|
}
|
||||||
|
|
||||||
|
return isHoveringText(translatedPoint)
|
||||||
|
}
|
||||||
|
|
||||||
private fun isHoveringText(point: Point): Boolean {
|
private fun isHoveringText(point: Point): Boolean {
|
||||||
return point.x >= HOVER_HORIZONTAL_PADDING
|
return point.x >= HOVER_HORIZONTAL_PADDING
|
||||||
&& point.y >= 4
|
&& point.y >= 4
|
||||||
|
@ -13,11 +13,13 @@ import com.intellij.openapi.ui.DialogPanel
|
|||||||
import com.intellij.openapi.util.Disposer
|
import com.intellij.openapi.util.Disposer
|
||||||
import com.intellij.ui.DisabledTraversalPolicy
|
import com.intellij.ui.DisabledTraversalPolicy
|
||||||
import com.intellij.ui.EditorTextFieldCellRenderer.SimpleRendererComponent
|
import com.intellij.ui.EditorTextFieldCellRenderer.SimpleRendererComponent
|
||||||
|
import com.intellij.ui.SimpleListCellRenderer
|
||||||
import com.intellij.ui.components.JBCheckBox
|
import com.intellij.ui.components.JBCheckBox
|
||||||
import com.intellij.ui.dsl.builder.Cell
|
import com.intellij.ui.dsl.builder.Cell
|
||||||
import com.intellij.ui.dsl.builder.RightGap
|
import com.intellij.ui.dsl.builder.RightGap
|
||||||
import com.intellij.ui.dsl.builder.Row
|
import com.intellij.ui.dsl.builder.Row
|
||||||
import com.intellij.ui.dsl.builder.RowLayout
|
import com.intellij.ui.dsl.builder.RowLayout
|
||||||
|
import com.intellij.ui.dsl.builder.bindItem
|
||||||
import com.intellij.ui.dsl.builder.bindSelected
|
import com.intellij.ui.dsl.builder.bindSelected
|
||||||
import com.intellij.ui.dsl.builder.panel
|
import com.intellij.ui.dsl.builder.panel
|
||||||
import java.awt.Cursor
|
import java.awt.Cursor
|
||||||
@ -74,6 +76,20 @@ class LensApplicationConfigurable : BoundConfigurable("Inspection Lens"), Config
|
|||||||
val settings = settingsService.state
|
val settings = settingsService.state
|
||||||
|
|
||||||
return panel {
|
return panel {
|
||||||
|
group("Appearance") {
|
||||||
|
row {
|
||||||
|
checkBox("Use editor font").bindSelected(settings::useEditorFont)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
group("Behavior") {
|
||||||
|
row("Hover mode:") {
|
||||||
|
val items = LensHoverMode.values().toList()
|
||||||
|
val renderer = SimpleListCellRenderer.create("", LensHoverMode::description)
|
||||||
|
comboBox(items, renderer).bindItem(settings::lensHoverMode) { settings.lensHoverMode = it ?: LensHoverMode.DEFAULT }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
group("Shown Severities") {
|
group("Shown Severities") {
|
||||||
for ((id, severity, textAttributes) in allSeverities) {
|
for ((id, severity, textAttributes) in allSeverities) {
|
||||||
row {
|
row {
|
||||||
@ -89,12 +105,6 @@ class LensApplicationConfigurable : BoundConfigurable("Inspection Lens"), Config
|
|||||||
checkBox("Other").bindSelected(settings::showUnknownSeverities)
|
checkBox("Other").bindSelected(settings::showUnknownSeverities)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
group("Appearance") {
|
|
||||||
row {
|
|
||||||
checkBox("Use editor font").bindSelected(settings::useEditorFont)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,7 @@
|
|||||||
|
package com.chylex.intellij.inspectionlens.settings
|
||||||
|
|
||||||
|
enum class LensHoverMode(val description: String) {
|
||||||
|
DISABLED("Disabled"),
|
||||||
|
DEFAULT("Left click shows intentions, middle click jumps to highlight"),
|
||||||
|
SWAPPED("Left click jumps to highlight, middle click shows intentions")
|
||||||
|
}
|
@ -21,6 +21,7 @@ class LensSettingsState : SimplePersistentStateComponent<LensSettingsState.State
|
|||||||
|
|
||||||
var showUnknownSeverities by property(true)
|
var showUnknownSeverities by property(true)
|
||||||
var useEditorFont by property(true)
|
var useEditorFont by property(true)
|
||||||
|
var lensHoverMode by enum(LensHoverMode.DEFAULT)
|
||||||
}
|
}
|
||||||
|
|
||||||
@get:Synchronized
|
@get:Synchronized
|
||||||
@ -31,6 +32,9 @@ class LensSettingsState : SimplePersistentStateComponent<LensSettingsState.State
|
|||||||
val useEditorFont
|
val useEditorFont
|
||||||
get() = state.useEditorFont
|
get() = state.useEditorFont
|
||||||
|
|
||||||
|
val lensHoverMode
|
||||||
|
get() = state.lensHoverMode
|
||||||
|
|
||||||
override fun loadState(state: State) {
|
override fun loadState(state: State) {
|
||||||
super.loadState(state)
|
super.loadState(state)
|
||||||
update()
|
update()
|
||||||
|
@ -6,14 +6,20 @@
|
|||||||
<description><![CDATA[
|
<description><![CDATA[
|
||||||
Displays errors, warnings, and other inspections inline. Highlights the background of lines with inspections. Supports light and dark themes out of the box.
|
Displays errors, warnings, and other inspections inline. Highlights the background of lines with inspections. Supports light and dark themes out of the box.
|
||||||
<br><br>
|
<br><br>
|
||||||
By default, the plugin shows <b>Errors</b>, <b>Warnings</b>, <b>Weak Warnings</b>, <b>Server Problems</b>, <b>Grammar Errors</b>, <b>Typos</b>, and other inspections with a high enough severity level. Configure visible severities in <b>Settings | Tools | Inspection Lens</a>.
|
By default, the plugin shows <b>Errors</b>, <b>Warnings</b>, <b>Weak Warnings</b>, <b>Server Problems</b>, <b>Grammar Errors</b>, <b>Typos</b>, and other inspections with a high enough severity level. Left-click an inspection to show quick fixes. Middle-click an inspection to navigate to the relevant code in the editor.
|
||||||
<br><br>
|
<br><br>
|
||||||
Left-click an inspection to show quick fixes. Middle-click an inspection to navigate to the relevant code in the editor.
|
Configure appearance, behavior of clicking on inspections, and visible severities in <b>Settings | Tools | Inspection Lens</b>.
|
||||||
<br><br>
|
<br><br>
|
||||||
Inspired by <a href="https://marketplace.visualstudio.com/items?itemName=usernamehw.errorlens">Error Lens</a> for VS Code, and <a href="https://plugins.jetbrains.com/plugin/17302-inlineerror">Inline Error</a> for IntelliJ Platform.
|
Inspired by <a href="https://marketplace.visualstudio.com/items?itemName=usernamehw.errorlens">Error Lens</a> for VS Code, and <a href="https://plugins.jetbrains.com/plugin/17302-inlineerror">Inline Error</a> for IntelliJ Platform.
|
||||||
]]></description>
|
]]></description>
|
||||||
|
|
||||||
<change-notes><![CDATA[
|
<change-notes><![CDATA[
|
||||||
|
<b>Version 1.5.1</b>
|
||||||
|
<ul>
|
||||||
|
<li>Added option to change the behavior of clicking on inspections.</li>
|
||||||
|
<li>Fixed broken quick fixes in Rider and CLion Nova.</li>
|
||||||
|
<li>Fixed hover underline not rendering correctly with some combinations of high DPI and line height settings.</li>
|
||||||
|
</ul>
|
||||||
<b>Version 1.5</b>
|
<b>Version 1.5</b>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Added possibility to left-click an inspection to show quick fixes.</li>
|
<li>Added possibility to left-click an inspection to show quick fixes.</li>
|
||||||
|
Loading…
Reference in New Issue
Block a user