fix unpack course action
[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 int line = 0;
17   @Expose private int start = 0;
18   @Expose private String hint = "";
19
20   @SerializedName("possible_answer")
21   @Expose private String possibleAnswer = "";
22   @Expose private int length = 0;
23   private int myIndex = -1;
24   private String myTaskText;
25   private MyInitialState myInitialState;
26   private StudyStatus myStatus = StudyStatus.Uninitialized;
27   private boolean mySelected = false;
28
29   @Transient private TaskFile myTaskFile;
30
31   public void initAnswerPlaceholder(final TaskFile file, boolean isRestarted) {
32     if (!isRestarted) {
33       setInitialState(new MyInitialState(getLine(), getLength(), getStart()));
34       myStatus = file.getTask().getStatus();
35     }
36
37     setTaskFile(file);
38   }
39
40   public int getIndex() {
41     return myIndex;
42   }
43
44   public void setIndex(int index) {
45     myIndex = index;
46   }
47
48   public int getLength() {
49     return length;
50   }
51
52   public void setLength(int length) {
53     this.length = length;
54   }
55
56   public int getStart() {
57     return start;
58   }
59
60   public void setStart(int start) {
61     this.start = start;
62   }
63
64   public int getLine() {
65     return line;
66   }
67
68   public void setLine(int line) {
69     this.line = line;
70   }
71
72   public String getHint() {
73     return hint;
74   }
75
76   public void setHint(@Nullable final String hint) {
77     this.hint = hint;
78   }
79
80   public String getPossibleAnswer() {
81     return possibleAnswer;
82   }
83
84   public void setPossibleAnswer(String possibleAnswer) {
85     this.possibleAnswer = possibleAnswer;
86   }
87
88   public MyInitialState getInitialState() {
89     return myInitialState;
90   }
91
92   public void setInitialState(@NotNull final MyInitialState initialState) {
93     myInitialState = initialState;
94   }
95
96   public String getTaskText() {
97     return myTaskText;
98   }
99
100   public void setTaskText(String taskText) {
101     myTaskText = taskText;
102   }
103
104   @Transient
105   public TaskFile getTaskFile() {
106     return myTaskFile;
107   }
108
109   @Transient
110   public void setTaskFile(TaskFile taskFile) {
111     myTaskFile = taskFile;
112   }
113
114   public int getRealStartOffset(@NotNull final Document document) {
115     return document.getLineStartOffset(line) + start;
116   }
117
118   public int getPossibleAnswerLength() {
119     return possibleAnswer.length();
120   }
121
122   public boolean isValid(@NotNull final Document document) {
123     return isValid(document, length);
124   }
125
126   public boolean isValid(@NotNull final Document document, int length) {
127     boolean isLineValid = line < document.getLineCount() && line >= 0;
128     if (!isLineValid) return false;
129     boolean isStartValid = start >= 0 && start < document.getLineEndOffset(line);
130     boolean isLengthValid = (getRealStartOffset(document) + length) <= document.getTextLength();
131     return isLengthValid && isStartValid;
132   }
133
134   /**
135    * Returns window to its initial state
136    */
137   public void reset() {
138     line = myInitialState.myLine;
139     start = myInitialState.myStart;
140     length = myInitialState.myLength;
141   }
142
143   public StudyStatus getStatus() {
144     return myStatus;
145   }
146
147   public void setStatus(StudyStatus status) {
148     myStatus = status;
149   }
150
151   public boolean getSelected() {
152     return mySelected;
153   }
154
155   public void setSelected(boolean selected) {
156     mySelected = selected;
157   }
158
159   public void init() {
160     setInitialState(new MyInitialState(line, possibleAnswer.length(), start));
161   }
162
163   public static class MyInitialState {
164     public int myLine = -1;
165     public int myLength = -1;
166     public int myStart = -1;
167
168     public MyInitialState() {
169     }
170
171     public MyInitialState(int line, int length, int start) {
172       myLine = line;
173       myLength = length;
174       myStart = start;
175     }
176   }
177
178   @Override
179   public boolean equals(Object o) {
180     if (this == o) return true;
181     if (o == null || getClass() != o.getClass()) return false;
182
183     AnswerPlaceholder that = (AnswerPlaceholder)o;
184
185     if (getLine() != that.getLine()) return false;
186     if (getStart() != that.getStart()) return false;
187     if (getLength() != that.getLength()) return false;
188     if (getIndex() != that.getIndex()) return false;
189     if (getHint() != null ? !getHint().equals(that.getHint()) : that.getHint() != null) return false;
190     if (getPossibleAnswer() != null ? !getPossibleAnswer().equals(that.getPossibleAnswer()) : that.getPossibleAnswer() != null)
191       return false;
192     if (myTaskText != null ? !myTaskText.equals(that.myTaskText) : that.myTaskText != null) return false;
193
194     return true;
195   }
196
197   @Override
198   public int hashCode() {
199     int result = getLine();
200     result = 31 * result + getStart();
201     result = 31 * result + (getHint() != null ? getHint().hashCode() : 0);
202     result = 31 * result + (getPossibleAnswer() != null ? getPossibleAnswer().hashCode() : 0);
203     result = 31 * result + getLength();
204     result = 31 * result + getIndex();
205     result = 31 * result + (myTaskText != null ? myTaskText.hashCode() : 0);
206     return result;
207   }
208 }