1 package com.jetbrains.edu.learning.courseFormat;
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;
13 * Implementation of windows which user should type in
16 public class AnswerPlaceholder {
18 @SerializedName("offset")
19 @Expose private int myOffset = -1;
21 @Expose private int length = -1;
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;
29 @Transient private TaskFile myTaskFile;
31 @Expose private Map<Integer, AnswerPlaceholderSubtaskInfo> mySubtaskInfos = new HashMap<>();
32 public AnswerPlaceholder() {
35 public void initAnswerPlaceholder(final TaskFile file, boolean isRestarted) {
37 setInitialState(new MyInitialState(myOffset, length));
38 myStatus = file.getTask().getStatus();
44 public int getIndex() {
48 public void setIndex(int index) {
53 * in actions {@link AnswerPlaceholder#getRealLength()} should be used
55 public int getLength() {
59 public void setLength(int length) {
64 public String getPossibleAnswer() {
65 return getActiveSubtaskInfo().getPossibleAnswer();
69 public void setPossibleAnswer(String possibleAnswer) {
70 getActiveSubtaskInfo().setPossibleAnswer(possibleAnswer);
73 public MyInitialState getInitialState() {
74 return myInitialState;
77 public void setInitialState(MyInitialState initialState) {
78 myInitialState = initialState;
82 public String getTaskText() {
83 return getActiveSubtaskInfo().getPlaceholderText();
87 public void setTaskText(String taskText) {
88 getActiveSubtaskInfo().setPlaceholderText(taskText);
92 public TaskFile getTaskFile() {
97 public void setTaskFile(TaskFile taskFile) {
98 myTaskFile = taskFile;
101 public int getPossibleAnswerLength() {
102 return getPossibleAnswer().length();
106 * Returns window to its initial state
108 public void reset() {
109 myOffset = myInitialState.getOffset();
110 length = myInitialState.getLength();
113 public StudyStatus getStatus() {
117 public void setStatus(StudyStatus status) {
121 public boolean getSelected() {
125 public void setSelected(boolean selected) {
126 mySelected = selected;
130 setInitialState(new MyInitialState(myOffset, getTaskText().length()));
133 public boolean getUseLength() {
138 * @return length or possible answer length
140 public int getRealLength() {
141 return myUseLength ? getLength() : getPossibleAnswerLength();
144 public void setUseLength(boolean useLength) {
145 myUseLength = useLength;
148 public int getOffset() {
152 public void setOffset(int offset) {
157 public List<String> getHints() {
158 return getActiveSubtaskInfo().getHints();
162 public void setHints(@NotNull final List<String> hints) {
163 getActiveSubtaskInfo().setHints(hints);
166 public void addHint(@NotNull final String text) {
167 getActiveSubtaskInfo().addHint(text);
170 public void removeHint(int i) {
171 getActiveSubtaskInfo().removeHint(i);
174 public Map<Integer, AnswerPlaceholderSubtaskInfo> getSubtaskInfos() {
175 return mySubtaskInfos;
178 public void setSubtaskInfos(Map<Integer, AnswerPlaceholderSubtaskInfo> subtaskInfos) {
179 mySubtaskInfos = subtaskInfos;
182 public static class MyInitialState {
183 private int length = -1;
184 private int offset = -1;
186 public MyInitialState() {
189 public MyInitialState(int initialOffset, int length) {
190 this.offset = initialOffset;
191 this.length = length;
194 public int getLength() {
198 public void setLength(int length) {
199 this.length = length;
202 public int getOffset() {
206 public void setOffset(int offset) {
207 this.offset = offset;
211 public AnswerPlaceholderSubtaskInfo getActiveSubtaskInfo() {
212 if (myTaskFile == null || myTaskFile.getTask() == null) {
213 return mySubtaskInfos.get(0);
215 int activeStepIndex = myTaskFile.getTask().getActiveStepIndex();
216 return mySubtaskInfos.get(activeStepIndex);