9ccc793a5b461fea34488a5417515a4ee795f435
[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       studyToolWindow.setActionToolbar(DefaultActionGroup())
40     }
41     
42     val course = taskManager.course
43     if (course != null) {
44       val courseMode = course.courseMode
45       val group = DefaultActionGroup()
46       val hints = myPlaceholder?.hints
47       if (hints != null) {
48         if (courseMode == EduNames.STUDY) {
49           if (hints.size > 1) {
50             group.addAll(GoBackward(), GoForward())
51           }
52         }
53         else {
54           group.addAll(GoBackward(), GoForward(), Separator.getInstance(), EditHint())
55         }
56         studyToolWindow.setActionToolbar(group)
57         setHintText(hints)
58       }
59     }
60   }
61
62   private fun setHintText(hints: List<String>) {
63     if (!hints.isEmpty()) {
64       studyToolWindow.setText(hints[myShownHintNumber])
65     }
66     else {
67       myShownHintNumber = -1
68       studyToolWindow.setText(HINTS_NOT_AVAILABLE)
69     }
70   }
71
72   private inner class GoForward : AnAction("Next Hint", "Next Hint", AllIcons.Actions.Forward) {
73
74
75     override fun actionPerformed(e: AnActionEvent) {
76       studyToolWindow.setText(myPlaceholder!!.hints[++myShownHintNumber])
77     }
78
79     override fun update(e: AnActionEvent) {
80       e.presentation.isEnabled = !isEditingMode && myPlaceholder != null && myShownHintNumber + 1 < myPlaceholder.hints.size
81     }
82   }
83
84   private inner class GoBackward : AnAction("Previous Hint", "Previous Hint", AllIcons.Actions.Back) {
85
86     override fun actionPerformed(e: AnActionEvent) {
87       studyToolWindow.setText(myPlaceholder!!.hints[--myShownHintNumber])
88     }
89
90     override fun update(e: AnActionEvent) {
91       e.presentation.isEnabled = !isEditingMode && myShownHintNumber - 1 >= 0
92     }
93   }
94
95   private inner class EditHint : AnAction("Edit Hint", "Edit Hint", AllIcons.Modules.Edit) {
96     
97     override fun actionPerformed(e: AnActionEvent?) {
98       val dialog = CCCreateAnswerPlaceholderDialog(e!!.project!!, myPlaceholder!!)
99       dialog.show()
100     }
101
102     override fun update(e: AnActionEvent) {
103       e.presentation.isEnabled = myPlaceholder?.hints?.isEmpty() == false
104     }
105   }
106
107   private inner class AddHint : AnAction("Add Hint", "Add Hint", AllIcons.General.Add) {
108
109     override fun actionPerformed(e: AnActionEvent) {
110       myPlaceholder!!.addHint(newHintDefaultText)
111       myShownHintNumber++
112       studyToolWindow.setText(newHintDefaultText)
113     }
114
115     override fun update(e: AnActionEvent?) {
116       e?.presentation?.isEnabled = !isEditingMode && myPlaceholder != null
117     }
118   }
119
120   private inner class RemoveHint : AnAction("Remove Hint", "Remove Hint", AllIcons.General.Remove) {
121
122     override fun actionPerformed(e: AnActionEvent) {
123       myPlaceholder!!.removeHint(myShownHintNumber)
124       myShownHintNumber += if (myShownHintNumber < myPlaceholder.hints.size) 0 else -1
125       
126       setHintText(myPlaceholder.hints)
127     }
128
129     override fun update(e: AnActionEvent) {
130       e.presentation.isEnabled = myPlaceholder != null && myPlaceholder.hints.size > 0 && !isEditingMode
131     }
132   }
133 }