feat(ui): add version display action and status bar widget
* Implement PgTidyShowVersionAction to show pgtidy version * Create PgTidyStatusBarWidget for real-time version display * Update plugin.xml to register new action and widget
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
package com.pgtidy.datagrip
|
||||
|
||||
import com.intellij.openapi.actionSystem.AnAction
|
||||
import com.intellij.openapi.actionSystem.AnActionEvent
|
||||
import com.intellij.openapi.application.ApplicationManager
|
||||
import com.intellij.openapi.progress.ProgressIndicator
|
||||
import com.intellij.openapi.progress.Task
|
||||
import com.intellij.openapi.ui.Messages
|
||||
|
||||
class PgTidyShowVersionAction : AnAction() {
|
||||
|
||||
override fun actionPerformed(e: AnActionEvent) {
|
||||
val project = e.project
|
||||
|
||||
object : Task.Backgroundable(project, "PgTidy: checking version…", false) {
|
||||
override fun run(indicator: ProgressIndicator) {
|
||||
val proc = try {
|
||||
ProcessBuilder("pgtidy", "version")
|
||||
.redirectErrorStream(false)
|
||||
.start()
|
||||
} catch (ex: Exception) {
|
||||
ApplicationManager.getApplication().invokeLater {
|
||||
Messages.showErrorDialog(project, "Cannot start pgtidy: ${ex.message}", "PgTidy")
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
val output = proc.inputStream.bufferedReader().readText()
|
||||
val stderr = proc.errorStream.bufferedReader().readText()
|
||||
val exit = proc.waitFor()
|
||||
|
||||
ApplicationManager.getApplication().invokeLater {
|
||||
if (exit != 0) {
|
||||
Messages.showErrorDialog(project, stderr.ifBlank { "pgtidy exited with code $exit" }, "PgTidy")
|
||||
return@invokeLater
|
||||
}
|
||||
Messages.showInfoMessage(project, output.trim(), "PgTidy Version")
|
||||
}
|
||||
}
|
||||
}.queue()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
package com.pgtidy.datagrip
|
||||
|
||||
import com.intellij.openapi.application.ApplicationManager
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.openapi.wm.StatusBar
|
||||
import com.intellij.openapi.wm.StatusBarWidget
|
||||
import com.intellij.openapi.wm.StatusBarWidgetFactory
|
||||
import com.intellij.util.Consumer
|
||||
import java.awt.event.MouseEvent
|
||||
|
||||
private const val WIDGET_ID = "com.pgtidy.StatusBarWidget"
|
||||
|
||||
class PgTidyStatusBarWidget(private val project: Project) : StatusBarWidget, StatusBarWidget.TextPresentation {
|
||||
|
||||
private var statusBar: StatusBar? = null
|
||||
private var text: String = "pgtidy: …"
|
||||
|
||||
override fun ID(): String = WIDGET_ID
|
||||
|
||||
override fun install(statusBar: StatusBar) {
|
||||
this.statusBar = statusBar
|
||||
refresh()
|
||||
}
|
||||
|
||||
override fun dispose() {
|
||||
statusBar = null
|
||||
}
|
||||
|
||||
override fun getPresentation(): StatusBarWidget.WidgetPresentation = this
|
||||
|
||||
override fun getText(): String = text
|
||||
|
||||
override fun getAlignment(): Float = java.awt.Component.CENTER_ALIGNMENT
|
||||
|
||||
override fun getTooltipText(): String = "PgTidy version — click to refresh"
|
||||
|
||||
override fun getClickConsumer(): Consumer<MouseEvent> = Consumer { refresh() }
|
||||
|
||||
fun refresh() {
|
||||
ApplicationManager.getApplication().executeOnPooledThread {
|
||||
text = try {
|
||||
val proc = ProcessBuilder("pgtidy", "version")
|
||||
.redirectErrorStream(true)
|
||||
.start()
|
||||
val output = proc.inputStream.bufferedReader().readText().trim()
|
||||
val exit = proc.waitFor()
|
||||
if (exit == 0 && output.isNotBlank()) output else "pgtidy: not found"
|
||||
} catch (ex: Exception) {
|
||||
"pgtidy: not found"
|
||||
}
|
||||
ApplicationManager.getApplication().invokeLater {
|
||||
statusBar?.updateWidget(WIDGET_ID)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class PgTidyStatusBarWidgetFactory : StatusBarWidgetFactory {
|
||||
override fun getId(): String = WIDGET_ID
|
||||
|
||||
override fun getDisplayName(): String = "PgTidy Version"
|
||||
|
||||
override fun isAvailable(project: Project): Boolean = true
|
||||
|
||||
override fun createWidget(project: Project): StatusBarWidget = PgTidyStatusBarWidget(project)
|
||||
|
||||
override fun disposeWidget(widget: StatusBarWidget) {
|
||||
widget.dispose()
|
||||
}
|
||||
|
||||
override fun canBeEnabledOn(statusBar: StatusBar): Boolean = true
|
||||
}
|
||||
@@ -21,8 +21,20 @@
|
||||
<add-to-group group-id="EditorPopupMenu" anchor="first"/>
|
||||
<keyboard-shortcut keymap="$default" first-keystroke="ctrl alt shift P"/>
|
||||
</action>
|
||||
<action id="com.pgtidy.ShowVersion"
|
||||
class="com.pgtidy.datagrip.PgTidyShowVersionAction"
|
||||
text="Show PgTidy Version"
|
||||
description="Show the installed pgtidy binary version">
|
||||
<add-to-group group-id="ToolsMenu" anchor="last"/>
|
||||
</action>
|
||||
</actions>
|
||||
|
||||
<extensions defaultExtensionNs="com.intellij">
|
||||
<statusBarWidgetFactory id="com.pgtidy.StatusBarWidget"
|
||||
implementation="com.pgtidy.datagrip.PgTidyStatusBarWidgetFactory"
|
||||
order="last"/>
|
||||
</extensions>
|
||||
|
||||
<extensions defaultExtensionNs="com.redhat.devtools.lsp4ij">
|
||||
<server id="com.pgtidy.lsp"
|
||||
name="PgTidy"
|
||||
|
||||
Reference in New Issue
Block a user