diff --git a/src/main/kotlin/io/gitlab/jfronny/sdom/actions/SDContestSelectionAction.kt b/src/main/kotlin/io/gitlab/jfronny/sdom/actions/SDContestSelectionAction.kt new file mode 100644 index 0000000..b4477f3 --- /dev/null +++ b/src/main/kotlin/io/gitlab/jfronny/sdom/actions/SDContestSelectionAction.kt @@ -0,0 +1,83 @@ +package io.gitlab.jfronny.sdom.actions + +import com.intellij.icons.AllIcons +import com.intellij.notification.Notification +import com.intellij.notification.NotificationAction +import com.intellij.openapi.actionSystem.* +import com.intellij.openapi.actionSystem.ex.ComboBoxAction +import com.intellij.openapi.project.DumbAware +import com.intellij.openapi.project.DumbAwareAction +import com.intellij.openapi.ui.popup.JBPopup +import com.intellij.openapi.ui.popup.JBPopupFactory +import com.intellij.openapi.util.Condition +import io.gitlab.jfronny.sdom.SDom +import io.gitlab.jfronny.sdom.model.Contest +import java.awt.Dimension +import javax.swing.JComponent + +class SDContestSelectionComboBoxAction : ComboBoxAction(), DumbAware { + override fun getActionUpdateThread(): ActionUpdateThread = ActionUpdateThread.BGT + + private val icon = AllIcons.Actions.ListChanges + override fun update(e: AnActionEvent) { + e.presentation.isEnabledAndVisible = SDom.loggedIn + e.presentation.icon = icon + SDom.currentContest?.let { e.presentation.setText(it.name, false) } + } + + override fun createPopupActionGroup(button: JComponent, dataContext: DataContext): DefaultActionGroup { + val actionGroup = DefaultActionGroup() + + actionGroup.addAll(SDom.contests.map { SelectContestAction(it, it == SDom.currentContest) }) + + return actionGroup + } + + override fun createActionPopup( + group: DefaultActionGroup, + context: DataContext, + disposeCallback: Runnable? + ): JBPopup { + val popup = JBPopupFactory.getInstance().createActionGroupPopup( + myPopupTitle, + group, + context, + null, + shouldShowDisabledActions(), + disposeCallback, + maxRows, + preselectCondition, + null + ) + popup.setMinimumSize(Dimension(minWidth, minHeight)) + return popup + } + + override fun getPreselectCondition(): Condition = + Condition { if (it is SelectContestAction) it.isSelected else false } + + override fun shouldShowDisabledActions(): Boolean = true + + private class SelectContestAction( + private val contest: Contest, + val isSelected: Boolean + ) : DumbAwareAction() { + init { + val name = contest.name + templatePresentation.setText(name, false) + } + + override fun getActionUpdateThread(): ActionUpdateThread = ActionUpdateThread.BGT + + override fun actionPerformed(e: AnActionEvent) { + SDom.currentContest = contest + } + } +} + +class SDContestSelectionNotificationAction(text: String) : NotificationAction(text) { + constructor() : this("") + + private val selectionAction = SDContestSelectionComboBoxAction() + override fun actionPerformed(e: AnActionEvent, notification: Notification) = selectionAction.actionPerformed(e) +} \ No newline at end of file diff --git a/src/main/kotlin/io/gitlab/jfronny/sdom/actions/SDGetContestsAction.kt b/src/main/kotlin/io/gitlab/jfronny/sdom/actions/SDGetContestsAction.kt new file mode 100644 index 0000000..6c21e7c --- /dev/null +++ b/src/main/kotlin/io/gitlab/jfronny/sdom/actions/SDGetContestsAction.kt @@ -0,0 +1,21 @@ +package io.gitlab.jfronny.sdom.actions + +import com.intellij.openapi.actionSystem.ActionUpdateThread +import com.intellij.openapi.actionSystem.AnActionEvent +import com.intellij.openapi.project.DumbAwareAction +import io.gitlab.jfronny.sdom.SDom +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch + +class SDGetContestsAction : DumbAwareAction() { + override fun getActionUpdateThread(): ActionUpdateThread = ActionUpdateThread.BGT + + override fun actionPerformed(e: AnActionEvent) { + CoroutineScope(Job() + Dispatchers.IO).launch { + SDom.getContests() + SDom.loadProperties(e.project) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/io/gitlab/jfronny/sdom/actions/SDGetProblemsAction.kt b/src/main/kotlin/io/gitlab/jfronny/sdom/actions/SDGetProblemsAction.kt new file mode 100644 index 0000000..16dd7ed --- /dev/null +++ b/src/main/kotlin/io/gitlab/jfronny/sdom/actions/SDGetProblemsAction.kt @@ -0,0 +1,20 @@ +package io.gitlab.jfronny.sdom.actions + +import com.intellij.openapi.actionSystem.ActionUpdateThread +import com.intellij.openapi.actionSystem.AnActionEvent +import com.intellij.openapi.project.DumbAwareAction +import io.gitlab.jfronny.sdom.SDom +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch + +class SDGetProblemsAction : DumbAwareAction() { + override fun getActionUpdateThread(): ActionUpdateThread = ActionUpdateThread.BGT + + override fun actionPerformed(e: AnActionEvent) { + CoroutineScope(Job() + Dispatchers.IO).launch { + SDom.getProblems() + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/io/gitlab/jfronny/sdom/actions/SDProblemSelectionAction.kt b/src/main/kotlin/io/gitlab/jfronny/sdom/actions/SDProblemSelectionAction.kt new file mode 100644 index 0000000..0acbafb --- /dev/null +++ b/src/main/kotlin/io/gitlab/jfronny/sdom/actions/SDProblemSelectionAction.kt @@ -0,0 +1,83 @@ +package io.gitlab.jfronny.sdom.actions + +import com.intellij.icons.AllIcons +import com.intellij.notification.Notification +import com.intellij.notification.NotificationAction +import com.intellij.openapi.actionSystem.* +import com.intellij.openapi.actionSystem.ex.ComboBoxAction +import com.intellij.openapi.project.DumbAware +import com.intellij.openapi.project.DumbAwareAction +import com.intellij.openapi.ui.popup.JBPopup +import com.intellij.openapi.ui.popup.JBPopupFactory +import com.intellij.openapi.util.Condition +import io.gitlab.jfronny.sdom.SDom +import io.gitlab.jfronny.sdom.model.Problem +import java.awt.Dimension +import javax.swing.JComponent + +class SDProblemSelectionComboBoxAction : ComboBoxAction(), DumbAware { + override fun getActionUpdateThread(): ActionUpdateThread = ActionUpdateThread.BGT + + private val icon = AllIcons.Actions.ListChanges + override fun update(e: AnActionEvent) { + e.presentation.isEnabledAndVisible = SDom.loggedIn + e.presentation.icon = icon + SDom.currentProblem?.let { e.presentation.setText(it.name, false) } + } + + override fun createPopupActionGroup(button: JComponent, dataContext: DataContext): DefaultActionGroup { + val actionGroup = DefaultActionGroup() + + actionGroup.addAll(SDom.problems.map { SelectProblemAction(it, it == SDom.currentProblem) }) + + return actionGroup + } + + override fun createActionPopup( + group: DefaultActionGroup, + context: DataContext, + disposeCallback: Runnable? + ): JBPopup { + val popup = JBPopupFactory.getInstance().createActionGroupPopup( + myPopupTitle, + group, + context, + null, + shouldShowDisabledActions(), + disposeCallback, + maxRows, + preselectCondition, + null + ) + popup.setMinimumSize(Dimension(minWidth, minHeight)) + return popup + } + + override fun getPreselectCondition(): Condition = + Condition { if (it is SelectProblemAction) it.isSelected else false } + + override fun shouldShowDisabledActions(): Boolean = true + + private class SelectProblemAction( + private val problem: Problem, + val isSelected: Boolean + ) : DumbAwareAction() { + init { + val name = problem.name + templatePresentation.setText(name, false) + } + + override fun getActionUpdateThread(): ActionUpdateThread = ActionUpdateThread.BGT + + override fun actionPerformed(e: AnActionEvent) { + SDom.currentProblem = problem + } + } +} + +class SDProblemSelectionNotificationAction(text: String) : NotificationAction(text) { + constructor() : this("") + + private val selectionAction = SDProblemSelectionComboBoxAction() + override fun actionPerformed(e: AnActionEvent, notification: Notification) = selectionAction.actionPerformed(e) +} \ No newline at end of file