Fix EDU-726 Reuse edit dialog in hint popup view in course creator
[idea/community.git] / python / educational-core / student / src / com / jetbrains / edu / learning / ui / StudyHint.kt
1 package com.jetbrains.edu.learning.ui
2
3 import com.intellij.icons.AllIcons
4 import com.intellij.openapi.actionSystem.AnAction
5 import com.intellij.openapi.actionSystem.AnActionEvent
6 import com.intellij.openapi.actionSystem.DefaultActionGroup
7 import com.intellij.openapi.actionSystem.Separator
8 import com.intellij.openapi.project.Project
9 import com.jetbrains.edu.learning.StudyTaskManager
10 import com.jetbrains.edu.learning.StudyUtils
11 import com.jetbrains.edu.learning.core.EduNames
12 import com.jetbrains.edu.learning.courseFormat.AnswerPlaceholder
13
14 class StudyHint(private val myPlaceholder: AnswerPlaceholder?, 
15                 project: Project) {
16   
17   companion object {
18     private val OUR_WARNING_MESSAGE = "Put the caret in the answer placeholder to get hint"
19     private val HINTS_NOT_AVAILABLE = "There is no hint for this answer placeholder"
20   }
21   
22   val studyToolWindow: StudyToolWindow
23   private var myShownHintNumber = 0
24   private var isEditingMode = false
25   private val newHintDefaultText = "Edit this hint"
26
27   init {
28     val taskManager = StudyTaskManager.getInstance(project)
29     if (StudyUtils.hasJavaFx() && taskManager.shouldUseJavaFx()) {
30       studyToolWindow = StudyJavaFxToolWindow()
31     }
32     else {
33       studyToolWindow = StudySwingToolWindow()
34     }
35     studyToolWindow.init(project, false)
36     
37     if (myPlaceholder == null) {
38       studyToolWindow.setText(OUR_WARNING_MESSAGE)
39     }
40     
41     val course = taskManager.course
42     if (course != null) {
43       val courseMode = course.courseMode
44       val group = DefaultActionGroup()
45       val hints = myPlaceholder?.hints
46       if (hints != null) {
47         if (courseMode == EduNames.STUDY) {
48           if (hints.size > 1) {
49             group.addAll(GoBackward(), GoForward())
50           }
51         }
52         else {
53           group.addAll(GoBackward(), GoForward(), Separator.getInstance(), EditHint())
54         }
55         studyToolWindow.setActionToolbar(group)
56         setHintText(hints)
57       }
58     }
59   }
60
61   private fun setHintText(hints: List<String>) {
62     if (!hints.isEmpty()) {
63       studyToolWindow.setText(hints[myShownHintNumber])
64     }
65     else {
66       myShownHintNumber = -1
67       studyToolWindow.setText(HINTS_NOT_AVAILABLE)
68     }
69   }
70
71   private inner class GoForward : AnAction("Next Hint", "Next Hint", AllIcons.Actions.Forward) {
72
73
74     override fun actionPerformed(e: AnActionEvent) {
75       studyToolWindow.setText(myPlaceholder!!.hints[++myShownHintNumber])
76     }
77
78     override fun update(e: AnActionEvent) {
79       e.presentation.isEnabled = !isEditingMode && myPlaceholder != null && myShownHintNumber + 1 < myPlaceholder.hints.size
80     }
81   }
82
83   private inner class GoBackward : AnAction("Previous Hint", "Previous Hint", AllIcons.Actions.Back) {
84
85     override fun actionPerformed(e: AnActionEvent) {
86       studyToolWindow.setText(myPlaceholder!!.hints[--myShownHintNumber])
87     }
88
89     override fun update(e: AnActionEvent) {
90       e.presentation.isEnabled = !isEditingMode && myShownHintNumber - 1 >= 0
91     }
92   }
93
94   private inner class EditHint : AnAction("Edit Hint", "Edit Hint", AllIcons.Modules.Edit) {
95     
96     override fun actionPerformed(e: AnActionEvent?) {
97       val dialog = CCCreateAnswerPlaceholderDialog(e!!.project!!, myPlaceholder!!)
98       dialog.show()
99     }
100
101     override fun update(e: AnActionEvent) {
102       e.presentation.isEnabled = myPlaceholder?.hints?.isEmpty() == false
103     }
104   }
105
106   private inner class AddHint : AnAction("Add Hint", "Add Hint", AllIcons.General.Add) {
107
108     override fun actionPerformed(e: AnActionEvent) {
109       myPlaceholder!!.addHint(newHintDefaultText)
110       myShownHintNumber++
111       studyToolWindow.setText(newHintDefaultText)
112     }
113
114     override fun update(e: AnActionEvent?) {
115       e?.presentation?.isEnabled = !isEditingMode && myPlaceholder != null
116     }
117   }
118
119   private inner class RemoveHint : AnAction("Remove Hint", "Remove Hint", AllIcons.General.Remove) {
120
121     override fun actionPerformed(e: AnActionEvent) {
122       myPlaceholder!!.removeHint(myShownHintNumber)
123       myShownHintNumber += if (myShownHintNumber < myPlaceholder.hints.size) 0 else -1
124       
125       setHintText(myPlaceholder.hints)
126     }
127
128     override fun update(e: AnActionEvent) {
129       e.presentation.isEnabled = myPlaceholder != null && myPlaceholder.hints.size > 0 && !isEditingMode
130     }
131   }
132 }