Skip to content

Commit

Permalink
Improved plugin status bar widget to show current state. Added dialog…
Browse files Browse the repository at this point in the history
… with information for user.
  • Loading branch information
MarcinVaadin committed Dec 6, 2024
1 parent b028e18 commit 1f906f9
Show file tree
Hide file tree
Showing 7 changed files with 145 additions and 36 deletions.
30 changes: 0 additions & 30 deletions src/main/kotlin/com/vaadin/plugin/copilot/CopilotStatusBarPanel.kt

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@ package com.vaadin.plugin.copilot.listeners
import com.intellij.openapi.project.Project
import com.intellij.openapi.project.ProjectManager
import com.intellij.openapi.project.ProjectManagerListener
import com.intellij.openapi.wm.WindowManager
import com.vaadin.plugin.copilot.CopilotPluginUtil
import com.vaadin.plugin.copilot.CopilotPluginUtil.Companion.saveDotFile
import com.vaadin.plugin.listeners.VaadinProjectListener
import com.vaadin.plugin.ui.VaadinStatusBarWidget

class CopilotVaadinProjectListener : VaadinProjectListener {

Expand All @@ -16,6 +18,7 @@ class CopilotVaadinProjectListener : VaadinProjectListener {
triggered = true
saveDotFile(project)
removeDotFileOnExit(project)
updateStatusBarWidget(project)
}
}

Expand All @@ -30,4 +33,8 @@ class CopilotVaadinProjectListener : VaadinProjectListener {
},
)
}

private fun updateStatusBarWidget(project: Project) {
WindowManager.getInstance().getStatusBar(project).updateWidget(VaadinStatusBarWidget.ID)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.vaadin.plugin.ui

import com.intellij.icons.AllIcons
import com.intellij.openapi.ui.DialogPanel
import com.intellij.ui.components.JBLabel
import com.intellij.util.ui.JBEmptyBorder
import com.intellij.util.ui.JBFont
import com.intellij.util.ui.UIUtil
import java.awt.Component
import javax.swing.JLabel
import javax.swing.JPanel
import org.jdesktop.swingx.HorizontalLayout
import org.jdesktop.swingx.VerticalLayout

class VaadinStatusBarInfoPopupPanel(copilotInitialized: Boolean, endpointsAvailable: Boolean) : JPanel() {

init {
val p = DialogPanel(VerticalLayout(UIUtil.LARGE_VGAP))
p.border = JBEmptyBorder(UIUtil.getRegularPanelInsets())
add(p)

val header = JBLabel("Vaadin plugin information")
header.font = JBFont.h4()

p.add(header)
p.add(
statusRow(
"Copilot service is running",
copilotInitialized,
"Service will be available after indexing is completed"))
p.add(
statusRow(
"Endpoints are available",
endpointsAvailable,
"Feature is available for IntelliJ Ultimate with installed Endpoints plugin"))
}

private fun statusRow(label: String, checked: Boolean, description: String): Component {
val wrapper = JPanel(VerticalLayout())

val panel = JPanel(HorizontalLayout(UIUtil.DEFAULT_HGAP))
panel.add(JBLabel(label))
panel.add(JLabel(if (checked) AllIcons.Actions.Checked else AllIcons.Actions.Cancel))
wrapper.add(panel)

if (!checked) {
val desc = JLabel(description)
desc.font = JBFont.smallOrNewUiMedium().asItalic()
wrapper.add(desc)
}
return wrapper
}
}
73 changes: 73 additions & 0 deletions src/main/kotlin/com/vaadin/plugin/ui/VaadinStatusBarWidget.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package com.vaadin.plugin.ui

import com.intellij.openapi.actionSystem.DataContext
import com.intellij.openapi.project.Project
import com.intellij.openapi.ui.popup.JBPopupFactory
import com.intellij.openapi.ui.popup.ListPopup
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.openapi.wm.StatusBarWidget
import com.intellij.openapi.wm.impl.status.EditorBasedStatusBarPopup
import com.intellij.ui.BadgeIconSupplier
import com.vaadin.plugin.copilot.CopilotPluginUtil
import com.vaadin.plugin.utils.VaadinIcons
import com.vaadin.plugin.utils.hasEndpoints
import javax.swing.Icon

class VaadinStatusBarWidget(project: Project) : EditorBasedStatusBarPopup(project, false) {

companion object {
const val ID = "VaadinStatusBarPanel"
}

private val iconSupplier: BadgeIconSupplier = BadgeIconSupplier(VaadinIcons.VAADIN)

private var clicked: Boolean = false

override fun ID(): String {
return ID
}

override fun createInstance(project: Project): StatusBarWidget {
return VaadinStatusBarWidget(project)
}

override fun createPopup(context: DataContext): ListPopup? {
clicked = true
val popup = VaadinStatusBarInfoPopupPanel(isCopilotActive(), hasEndpoints())
JBPopupFactory.getInstance()
.createComponentPopupBuilder(popup, null)
.createPopup()
.showInBestPositionFor(context)
return null
}

override fun getWidgetState(file: VirtualFile?): WidgetState {
val state = WidgetState(getTooltip(), null, true)
state.icon = getIcon()
return state
}

private fun getTooltip(): String {
if (!isCopilotActive() || !hasEndpoints()) {
return "There are issues while running Vaadin plugin, click to see details"
}

return "Vaadin plugin is active"
}

private fun getIcon(): Icon {
if (clicked) {
return iconSupplier.originalIcon
}

if (!isCopilotActive() || !hasEndpoints()) {
return iconSupplier.warningIcon
}

return iconSupplier.originalIcon
}

private fun isCopilotActive(): Boolean {
return CopilotPluginUtil.getDotFile(project) !== null
}
}
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
package com.vaadin.plugin.copilot
package com.vaadin.plugin.ui

import com.intellij.openapi.project.Project
import com.intellij.openapi.wm.StatusBarWidget
import com.intellij.openapi.wm.StatusBarWidgetFactory

class CopilotStatusBarWidgetFactory : StatusBarWidgetFactory {
class VaadinStatusBarWidgetFactory : StatusBarWidgetFactory {

override fun getId(): String {
return "CopilotStatusBarWidgetFactory"
return "VaadinStatusBarWidgetFactory"
}

override fun getDisplayName(): String {
return "Vaadin"
}

override fun createWidget(project: Project): StatusBarWidget {
return CopilotStatusBarPanel(project)
return VaadinStatusBarWidget(project)
}
}
6 changes: 6 additions & 0 deletions src/main/kotlin/com/vaadin/plugin/utils/VaadinProjectUtil.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.vaadin.plugin.utils

import com.intellij.ide.plugins.PluginManager
import com.intellij.java.library.JavaLibraryUtil.hasLibraryClass
import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.extensions.PluginId
import com.intellij.openapi.observable.properties.GraphProperty
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.Key
Expand All @@ -18,6 +20,8 @@ import java.util.zip.ZipFile

internal const val VAADIN_SERVICE = "com.vaadin.flow.server.VaadinService"

internal const val ENDPOINTS_PLUGIN_ID = "com.intellij.microservices.ui"

class VaadinProjectUtil {

companion object {
Expand Down Expand Up @@ -78,3 +82,5 @@ class VaadinProjectUtil {
internal fun hasVaadin(project: Project): Boolean = hasLibraryClass(project, VAADIN_SERVICE)

internal fun hasVaadin(module: com.intellij.openapi.module.Module): Boolean = hasLibraryClass(module, VAADIN_SERVICE)

internal fun hasEndpoints(): Boolean = PluginManager.isPluginInstalled(PluginId.findId(ENDPOINTS_PLUGIN_ID))
4 changes: 2 additions & 2 deletions src/main/resources/META-INF/plugin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,8 @@
<!-- Vaadin Copilot -->
<notificationGroup id="Vaadin Copilot" displayType="BALLOON"/>
<errorHandler implementation="com.vaadin.plugin.copilot.CopilotErrorHandler"/>
<statusBarWidgetFactory implementation="com.vaadin.plugin.copilot.CopilotStatusBarWidgetFactory"
id="CopilotStatusBarWidgetFactory" order="last"/>
<statusBarWidgetFactory implementation="com.vaadin.plugin.ui.VaadinStatusBarWidgetFactory"
id="VaadinStatusBarWidgetFactory" order="last"/>
<httpRequestHandler implementation="com.vaadin.plugin.copilot.service.CopilotRestService"/>
<projectService
serviceInterface="com.vaadin.plugin.copilot.service.CopilotUndoManager"
Expand Down

0 comments on commit 1f906f9

Please sign in to comment.