JetBrains Plugin 建立狀態列小工具

之前我們建立了第一個 JetBrains 編輯器擴充套件,現在來加上下方狀態列小工具(Widget)

首先要先建立一個繼承 StatusBarWidgetFactory 的 MyStatusBarWidgetFactory 類別,並複寫 getId 和 getDisplayName 兩個方法
    
import com.intellij.openapi.wm.StatusBarWidgetFactory


class MyStatusBarWidgetFactory : StatusBarWidgetFactory {
    override fun getId(): String {
        return "MyStatusBarWidgetFactory"
    }

    override fun getDisplayName(): String {
        return "My Status Bar Widget Factory"
    }
}
    

這裡的 getId 中的回傳值和 package name 要用在 plugin.xml 中註冊:
    
<idea-plugin>
    <extensions defaultExtensionNs="com.intellij">
        <statusBarWidgetFactory id="MyStatusBarWidgetFactory"
                                implementation="com.example.ideaplugintest0405.MyStatusBarWidgetFactory"
        />
    </extensions>
</idea-plugin>
    

接下來就是要設定小工具的內容了,直接在剛剛建立的 MyStatusBarWidgetFactory 類別內建立一個實作 StatusBarWidget 介面的類別,但是我們可以直接使用更輕鬆的 CustomStatusBarWidget 介面。
然後再依照小工具要顯示的內容可以選用已實作的類別快速鍵例,例如單純顯示文字的話就可以直接繼承 TextPanel 類別。然後再放入 MyStatusBarWidgetFactory 的 createWidget 中
    
import com.intellij.openapi.project.Project
import com.intellij.openapi.wm.CustomStatusBarWidget
import com.intellij.openapi.wm.StatusBarWidget
import com.intellij.openapi.wm.StatusBarWidgetFactory
import com.intellij.openapi.wm.impl.status.TextPanel
import javax.swing.JComponent

class MyStatusBarWidgetFactory : StatusBarWidgetFactory {

    override fun getId(): String {
        return "MyStatusBarWidgetFactory"
    }

    override fun getDisplayName(): String {
        return "My Status Bar Widget Factory"
    }

    override fun createWidget(project: Project): StatusBarWidget {
        return MyStatusBarWidget()
    }


    private class MyStatusBarWidget : TextPanel(), CustomStatusBarWidget {
        override fun ID(): String {
            return "MyStatusBarWidgetFactory"
        }

        override fun getComponent(): JComponent {
            text = "Hello, World!"
            return this
        }

    }

}
    

執行後就可以看到出現在狀態列小工具選單和狀態列中了:

這裡也示範訂製狀態列小工具的方式,其實就是使用 Java Swing 套件製作介面:
    

import com.intellij.openapi.project.Project
import com.intellij.openapi.wm.CustomStatusBarWidget
import com.intellij.openapi.wm.StatusBarWidget
import com.intellij.openapi.wm.StatusBarWidgetFactory
import java.awt.BorderLayout
import java.awt.Component
import javax.swing.JComponent
import javax.swing.JLabel
import javax.swing.JPanel

class MyStatusBarWidgetFactory : StatusBarWidgetFactory {

    override fun getId(): String {
        return "MyStatusBarWidgetFactory"
    }

    override fun getDisplayName(): String {
        return "My Status Bar Widget Factory"
    }

    override fun createWidget(project: Project): StatusBarWidget {
        return MyStatusBarWidget()
    }

    private class MyStatusBarWidget : com.intellij.openapi.wm.StatusBarWidget.TextPresentation, CustomStatusBarWidget {
        override fun getAlignment(): Float {
            return Component.RIGHT_ALIGNMENT
        }

        override fun getText(): String {
            return "Hello, World!"
        }

        override fun getTooltipText(): String? {
            return "this is a tooltip"
        }

        override fun ID(): String {
            return "MyStatusBarWidgetFactory"
        }

        private val statusBarComponent = JPanel(BorderLayout())

        init {
            val label = JLabel("...")
            label.text = "Hello, World!"
            statusBarComponent.add(label)
        }

        override fun getComponent(): JComponent {
            return statusBarComponent
        }
    }
}
    



然後發現了官方文件有個連結錯誤,順手修正了

參考資料:
JetBrains - Status Bar Widgets

留言