a1532e804b2d7ac7dce0acee5fd0734a916ed582
[idea/community.git] / python / educational-core / student / src / com / jetbrains / edu / learning / courseFormat / AnswerPlaceholder.java
1 package com.jetbrains.edu.learning.courseFormat;
2
3 import com.google.gson.annotations.Expose;
4 import com.google.gson.annotations.SerializedName;
5 import com.intellij.util.containers.HashMap;
6 import com.intellij.util.xmlb.annotations.Transient;
7 import org.jetbrains.annotations.NotNull;
8
9 import java.util.List;
10 import java.util.Map;
11
12 /**
13  * Implementation of windows which user should type in
14  */
15
16 public class AnswerPlaceholder {
17
18   @SerializedName("offset")
19   @Expose private int myOffset = -1;
20
21   @Expose private int length = -1;
22
23   private int myIndex = -1;
24   private MyInitialState myInitialState;
25   private StudyStatus myStatus = StudyStatus.Unchecked;
26   private boolean mySelected = false;
27   private boolean myUseLength = true;
28
29   @Transient private TaskFile myTaskFile;
30
31   @Expose private Map<Integer, AnswerPlaceholderSubtaskInfo> mySubtaskInfos = new HashMap<>();
32   public AnswerPlaceholder() {
33   }
34
35   public void initAnswerPlaceholder(final TaskFile file, boolean isRestarted) {
36     if (!isRestarted) {
37       setInitialState(new MyInitialState(myOffset, length));
38       myStatus = file.getTask().getStatus();
39     }
40
41     setTaskFile(file);
42   }
43
44   public int getIndex() {
45     return myIndex;
46   }
47
48   public void setIndex(int index) {
49     myIndex = index;
50   }
51
52   /**
53    * in actions {@link AnswerPlaceholder#getRealLength()} should be used
54    */
55   public int getLength() {
56     return length;
57   }
58
59   public void setLength(int length) {
60     this.length = length;
61   }
62
63   @Transient
64   public String getPossibleAnswer() {
65     return getActiveSubtaskInfo().getPossibleAnswer();
66   }
67
68   @Transient
69   public void setPossibleAnswer(String possibleAnswer) {
70     getActiveSubtaskInfo().setPossibleAnswer(possibleAnswer);
71   }
72
73   public MyInitialState getInitialState() {
74     return myInitialState;
75   }
76
77   public void setInitialState(MyInitialState initialState) {
78     myInitialState = initialState;
79   }
80
81   @Transient
82   public String getTaskText() {
83     return getActiveSubtaskInfo().getPlaceholderText();
84   }
85
86   @Transient
87   public void setTaskText(String taskText) {
88     getActiveSubtaskInfo().setPlaceholderText(taskText);
89   }
90
91   @Transient
92   public TaskFile getTaskFile() {
93     return myTaskFile;
94   }
95
96   @Transient
97   public void setTaskFile(TaskFile taskFile) {
98     myTaskFile = taskFile;
99   }
100
101   public int getPossibleAnswerLength() {
102     return getPossibleAnswer().length();
103   }
104
105   /**
106    * Returns window to its initial state
107    */
108   public void reset() {
109     myOffset = myInitialState.getOffset();
110     length = myInitialState.getLength();
111   }
112
113   public StudyStatus getStatus() {
114     return myStatus;
115   }
116
117   public void setStatus(StudyStatus status) {
118     myStatus = status;
119   }
120
121   public boolean getSelected() {
122     return mySelected;
123   }
124
125   public void setSelected(boolean selected) {
126     mySelected = selected;
127   }
128
129   public void init() {
130     setInitialState(new MyInitialState(myOffset, getTaskText().length()));
131   }
132
133   public boolean getUseLength() {
134     return myUseLength;
135   }
136
137   /**
138    * @return length or possible answer length
139    */
140   public int getRealLength() {
141     return myUseLength ? getLength() : getPossibleAnswerLength();
142   }
143
144   public void setUseLength(boolean useLength) {
145     myUseLength = useLength;
146   }
147
148   public int getOffset() {
149     return myOffset;
150   }
151
152   public void setOffset(int offset) {
153     myOffset = offset;
154   }
155
156   @Transient
157   public List<String> getHints() {
158     return getActiveSubtaskInfo().getHints();
159   }
160
161   @Transient
162   public void setHints(@NotNull final List<String> hints) {
163    getActiveSubtaskInfo().setHints(hints);
164   }
165
166   public void addHint(@NotNull final String text) {
167     getActiveSubtaskInfo().addHint(text);
168   }
169
170   public void removeHint(int i) {
171     getActiveSubtaskInfo().removeHint(i);
172   }
173
174   public Map<Integer, AnswerPlaceholderSubtaskInfo> getSubtaskInfos() {
175     return mySubtaskInfos;
176   }
177
178   public void setSubtaskInfos(Map<Integer, AnswerPlaceholderSubtaskInfo> subtaskInfos) {
179     mySubtaskInfos = subtaskInfos;
180   }
181
182   public static class MyInitialState {
183     private int length = -1;
184     private int offset = -1;
185
186     public MyInitialState() {
187     }
188
189     public MyInitialState(int initialOffset, int length) {
190       this.offset = initialOffset;
191       this.length = length;
192     }
193
194     public int getLength() {
195       return length;
196     }
197
198     public void setLength(int length) {
199       this.length = length;
200     }
201
202     public int getOffset() {
203       return offset;
204     }
205
206     public void setOffset(int offset) {
207       this.offset = offset;
208     }
209   }
210
211   public AnswerPlaceholderSubtaskInfo getActiveSubtaskInfo() {
212     if (myTaskFile == null || myTaskFile.getTask() == null) {
213       return mySubtaskInfos.get(0);
214     }
215     int activeStepIndex = myTaskFile.getTask().getActiveStepIndex();
216     return mySubtaskInfos.get(activeStepIndex);
217   }
218 }