Fix problem with hint migration from v3EAP to v3
[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.xmlb.annotations.Transient;
6 import org.jetbrains.annotations.NotNull;
7 import org.jetbrains.annotations.Nullable;
8
9 import java.util.ArrayList;
10 import java.util.List;
11
12 /**
13  * Implementation of windows which user should type in
14  */
15
16 public class AnswerPlaceholder {
17   
18   @SerializedName("hint")
19   @Expose private String myHint = "";
20
21   @SerializedName("hints")
22   @Expose private List<String> myAdditionalHints = new ArrayList<String>();
23
24   @SerializedName("possible_answer")
25   @Expose private String possibleAnswer = "";
26
27   @SerializedName("offset")
28   @Expose private int myOffset = -1;
29
30   @Expose private int length = -1;
31
32   private int myIndex = -1;
33   private String myTaskText;
34   private MyInitialState myInitialState;
35   private StudyStatus myStatus = StudyStatus.Unchecked;
36   private boolean mySelected = false;
37   private boolean myUseLength = true;
38
39
40   @Transient private TaskFile myTaskFile;
41
42   public AnswerPlaceholder() {
43   }
44
45   public void initAnswerPlaceholder(final TaskFile file, boolean isRestarted) {
46     if (!isRestarted) {
47       setInitialState(new MyInitialState(myOffset, length));
48       myStatus = file.getTask().getStatus();
49     }
50
51     setTaskFile(file);
52   }
53
54   public int getIndex() {
55     return myIndex;
56   }
57
58   public void setIndex(int index) {
59     myIndex = index;
60   }
61
62   /**
63    * in actions {@link AnswerPlaceholder#getRealLength()} should be used
64    */
65   public int getLength() {
66     return length;
67   }
68
69   public void setLength(int length) {
70     this.length = length;
71   }
72
73   @NotNull
74   public List<String> getAdditionalHints() {
75     return myAdditionalHints;
76   }
77
78   public void setAdditionalHints(@Nullable final List<String> additionalHints) {
79     myAdditionalHints = additionalHints;
80   }
81
82   public String getPossibleAnswer() {
83     return possibleAnswer;
84   }
85
86   public void setPossibleAnswer(String possibleAnswer) {
87     this.possibleAnswer = possibleAnswer;
88   }
89
90   public MyInitialState getInitialState() {
91     return myInitialState;
92   }
93
94   public void setInitialState(MyInitialState initialState) {
95     myInitialState = initialState;
96   }
97
98   public String getTaskText() {
99     return myTaskText;
100   }
101
102   public void setTaskText(String taskText) {
103     myTaskText = taskText;
104   }
105
106   @Transient
107   public TaskFile getTaskFile() {
108     return myTaskFile;
109   }
110
111   @Transient
112   public void setTaskFile(TaskFile taskFile) {
113     myTaskFile = taskFile;
114   }
115
116   public int getPossibleAnswerLength() {
117     return possibleAnswer.length();
118   }
119
120   /**
121    * Returns window to its initial state
122    */
123   public void reset() {
124     myOffset = myInitialState.getOffset();
125     length = myInitialState.getLength();
126     if (!myUseLength) {
127       possibleAnswer = myTaskText;
128     }
129   }
130
131   public StudyStatus getStatus() {
132     return myStatus;
133   }
134
135   public void setStatus(StudyStatus status) {
136     myStatus = status;
137   }
138
139   public boolean getSelected() {
140     return mySelected;
141   }
142
143   public void setSelected(boolean selected) {
144     mySelected = selected;
145   }
146
147   public void init() {
148     setInitialState(new MyInitialState(myOffset, myTaskText.length()));
149   }
150
151   public boolean getUseLength() {
152     return myUseLength;
153   }
154
155   /**
156    * @return length or possible answer length
157    */
158   public int getRealLength() {
159     return myUseLength ? getLength() : getPossibleAnswerLength();
160   }
161
162   public void setUseLength(boolean useLength) {
163     myUseLength = useLength;
164   }
165
166   public int getOffset() {
167     return myOffset;
168   }
169
170   public void setOffset(int offset) {
171     myOffset = offset;
172   }
173
174   public String getHint() {
175     return myHint;
176   }
177
178   public void setHint(String hint) {
179     myHint = hint;
180   }
181
182   @Transient
183   public List<String> getHints() {
184     final ArrayList<String> result = new ArrayList<>();
185     result.add(myHint);
186     result.addAll(myAdditionalHints);
187     return result;
188   }
189
190   @Transient
191   public void setHints(@NotNull final List<String> hints) {
192     if (hints.isEmpty()) return;
193     myHint = hints.get(0);
194     myAdditionalHints = hints.subList(1, hints.size());
195   }
196
197   public void setHintByIndex(int i, @NotNull final String text) {
198     if (i == 0) {
199       myHint = text;
200     }
201     else {
202       myAdditionalHints.set(i - 1, text);
203     }
204   }
205
206   public void addHint(@NotNull final String text) {
207     if (myHint.isEmpty() && myAdditionalHints.isEmpty()) {
208       myHint = text;
209     }
210     else {
211       myAdditionalHints.add(text);
212     }
213   }
214
215   public void removeHint(int i) {
216     if (i == 0) {
217       myHint = "";
218     }
219     else {
220       myAdditionalHints.remove(i);
221     }
222   }
223
224   public static class MyInitialState {
225     private int length = -1;
226     private int offset = -1;
227
228     public MyInitialState() {
229     }
230
231     public MyInitialState(int initialOffset, int length) {
232       this.offset = initialOffset;
233       this.length = length;
234     }
235
236     public int getLength() {
237       return length;
238     }
239
240     public void setLength(int length) {
241       this.length = length;
242     }
243
244     public int getOffset() {
245       return offset;
246     }
247
248     public void setOffset(int offset) {
249       this.offset = offset;
250     }
251   }
252 }