package org.iwakura.larcjb.widget import com.intellij.openapi.project.Project import com.intellij.openapi.util.Disposer import com.intellij.openapi.vcs.ProjectLevelVcsManager import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.wm.StatusBar import com.intellij.openapi.wm.StatusBarWidget import com.intellij.openapi.wm.StatusBarWidgetFactory import com.intellij.util.Consumer import org.iwakura.larcjb.LarcExecutable import org.iwakura.larcjb.LarcVcs import java.awt.event.MouseEvent /** * Status bar widget showing current Larc branch. */ class LarcBranchWidgetFactory : StatusBarWidgetFactory { override fun getId(): String = WIDGET_ID override fun getDisplayName(): String = "Larc Branch" override fun isAvailable(project: Project): Boolean { return ProjectLevelVcsManager.getInstance(project) .allVcsRoots .any { it.vcs?.name == LarcVcs.NAME } } override fun createWidget(project: Project): StatusBarWidget { return LarcBranchWidget(project) } override fun canBeEnabledOn(statusBar: StatusBar): Boolean = true companion object { const val WIDGET_ID = "LarcBranchWidget" } } class LarcBranchWidget(private val project: Project) : StatusBarWidget, StatusBarWidget.TextPresentation { private var statusBar: StatusBar? = null private var currentBranch: String? = null override fun ID(): String = LarcBranchWidgetFactory.WIDGET_ID override fun getPresentation(): StatusBarWidget.WidgetPresentation = this override fun install(statusBar: StatusBar) { this.statusBar = statusBar updateBranch() } override fun dispose() { statusBar = null } override fun getText(): String { return currentBranch?.let { "Larc: $it" } ?: "" } override fun getTooltipText(): String = "Current Larc branch" override fun getAlignment(): Float = 0f override fun getClickConsumer(): Consumer? { return Consumer { /* TODO(kroot): show branch selector popup */ updateBranch() } } fun updateBranch() { val roots = getLarcRoots() if (roots.isEmpty()) { currentBranch = null return } val executable = LarcExecutable(project) currentBranch = executable.currentBranch(roots.first()) statusBar?.updateWidget(ID()) } private fun getLarcRoots(): List { return ProjectLevelVcsManager.getInstance(project) .allVcsRoots .filter { it.vcs?.name == LarcVcs.NAME } .mapNotNull { it.path } } }