diff --git a/editors/datagrip/src/main/kotlin/com/pgtidy/datagrip/PgTidyShowVersionAction.kt b/editors/datagrip/src/main/kotlin/com/pgtidy/datagrip/PgTidyShowVersionAction.kt new file mode 100644 index 0000000..16133a8 --- /dev/null +++ b/editors/datagrip/src/main/kotlin/com/pgtidy/datagrip/PgTidyShowVersionAction.kt @@ -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() + } +} diff --git a/editors/datagrip/src/main/kotlin/com/pgtidy/datagrip/PgTidyStatusBarWidget.kt b/editors/datagrip/src/main/kotlin/com/pgtidy/datagrip/PgTidyStatusBarWidget.kt new file mode 100644 index 0000000..1c9feab --- /dev/null +++ b/editors/datagrip/src/main/kotlin/com/pgtidy/datagrip/PgTidyStatusBarWidget.kt @@ -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 = 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 +} diff --git a/editors/datagrip/src/main/resources/META-INF/plugin.xml b/editors/datagrip/src/main/resources/META-INF/plugin.xml index c64f6b2..4c10102 100644 --- a/editors/datagrip/src/main/resources/META-INF/plugin.xml +++ b/editors/datagrip/src/main/resources/META-INF/plugin.xml @@ -21,8 +21,20 @@ + + + + + + +