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