int toSubtaskIndex) {
taskFile.setTrackLengths(false);
for (AnswerPlaceholder placeholder : taskFile.getAnswerPlaceholders()) {
- AnswerPlaceholderSubtaskInfo fromSubtaskInfo = placeholder.getSubtaskInfos().get(fromSubtaskIndex);
- if (fromSubtaskIndex == toSubtaskIndex && fromSubtaskInfo != null) {
- String placeholderText = fromSubtaskInfo.getPlaceholderText();
- if (placeholderText != null) {
- EduUtils.replaceAnswerPlaceholder(project, document, placeholder, placeholder.getRealLength(), placeholderText);
- }
- continue;
- }
- Set<Integer> indexes = placeholder.getSubtaskInfos().keySet();
- Integer minIndex = Collections.min(indexes);
- int visibleLength = placeholder.getVisibleLength(fromSubtaskIndex);
- if (indexes.contains(toSubtaskIndex) && indexes.contains(fromSubtaskIndex)) {
- if (!placeholder.getUseLength()) {
- String replacementText = placeholder.getSubtaskInfos().get(toSubtaskIndex).getPossibleAnswer();
- EduUtils.replaceAnswerPlaceholder(project, document, placeholder, visibleLength, replacementText);
- }
- continue;
- }
- if (fromSubtaskIndex < toSubtaskIndex) {
- if (minIndex > fromSubtaskIndex && minIndex <= toSubtaskIndex) {
- Integer maxIndex = Collections.max(ContainerUtil.filter(indexes, integer -> integer <= toSubtaskIndex));
- AnswerPlaceholderSubtaskInfo maxInfo = placeholder.getSubtaskInfos().get(maxIndex);
- String replacementText = placeholder.getUseLength() ? maxInfo.getPlaceholderText() : maxInfo.getPossibleAnswer();
- EduUtils.replaceAnswerPlaceholder(project, document, placeholder, visibleLength, replacementText);
- }
- }
- else {
- if (minIndex > toSubtaskIndex && minIndex <= fromSubtaskIndex) {
- AnswerPlaceholderSubtaskInfo minInfo = placeholder.getSubtaskInfos().get(minIndex);
- if (minInfo.isNeedInsertText()) {
- EduUtils.replaceAnswerPlaceholder(project, document, placeholder, visibleLength, "");
- }
- else {
- String replacementText = minInfo.getPlaceholderText();
- EduUtils.replaceAnswerPlaceholder(project, document, placeholder, visibleLength, replacementText);
- }
- }
- }
+ placeholder.switchSubtask(project, document, fromSubtaskIndex, toSubtaskIndex);
}
taskFile.setTrackLengths(true);
}
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileManager;
import com.intellij.psi.PsiDirectory;
-import com.jetbrains.edu.learning.StudySubtaskUtils;
+import com.intellij.util.containers.ContainerUtil;
import com.jetbrains.edu.learning.StudyUtils;
import com.jetbrains.edu.learning.courseFormat.*;
import org.jetbrains.annotations.NonNls;
}
EduDocumentListener listener = new EduDocumentListener(taskFile, false);
studentDocument.addDocumentListener(listener);
- StudySubtaskUtils.updatePlaceholderTexts(project, studentDocument, taskFile, task.getActiveSubtaskIndex(), toSubtaskIndex);
+ taskFile.setTrackLengths(false);
+ for (AnswerPlaceholder placeholder : taskFile.getAnswerPlaceholders()) {
+ int fromSubtask = task.getActiveSubtaskIndex();
+ placeholder.switchSubtask(project, studentDocument, fromSubtask, toSubtaskIndex);
+ }
+ for (AnswerPlaceholder placeholder : taskFile.getAnswerPlaceholders()) {
+ replaceWithTaskText(project, studentDocument, placeholder, toSubtaskIndex);
+ }
+ taskFile.setTrackChanges(true);
studentDocument.removeDocumentListener(listener);
return Pair.create(studentFile, taskFile);
}
+ private static void replaceWithTaskText(Project project, Document studentDocument, AnswerPlaceholder placeholder, int toSubtaskIndex) {
+ AnswerPlaceholderSubtaskInfo info = placeholder.getSubtaskInfos().get(toSubtaskIndex);
+ if (info == null) {
+ return;
+ }
+ String replacementText;
+ if (Collections.min(placeholder.getSubtaskInfos().keySet()) == toSubtaskIndex) {
+ replacementText = info.getPlaceholderText();
+ }
+ else {
+ Integer max = Collections.max(ContainerUtil.filter(placeholder.getSubtaskInfos().keySet(), i -> i < toSubtaskIndex));
+ replacementText = placeholder.getSubtaskInfos().get(max).getPossibleAnswer();
+ }
+ replaceAnswerPlaceholder(project, studentDocument, placeholder, placeholder.getVisibleLength(toSubtaskIndex), replacementText);
+ }
+
public static void replaceAnswerPlaceholder(@NotNull final Project project,
@NotNull final Document document,
@NotNull final AnswerPlaceholder answerPlaceholder,
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
+import com.intellij.openapi.editor.Document;
+import com.intellij.openapi.project.Project;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.hash.HashMap;
import com.intellij.util.xmlb.annotations.Transient;
+import com.jetbrains.edu.learning.core.EduUtils;
import org.jetbrains.annotations.NotNull;
import java.util.Collections;
import java.util.List;
import java.util.Map;
+import java.util.Set;
/**
* Implementation of windows which user should type in
int maxIndex = Collections.max(ContainerUtil.filter(mySubtaskInfos.keySet(), i -> i < subtaskIndex));
return getUseLength() ? length : mySubtaskInfos.get(maxIndex).getPossibleAnswer().length();
}
+
+ public void switchSubtask(@NotNull Project project, @NotNull Document document, int fromSubtask, int toSubtask) {
+ Set<Integer> indexes = mySubtaskInfos.keySet();
+ int visibleLength = getVisibleLength(fromSubtask);
+ if (indexes.contains(fromSubtask) && indexes.contains(toSubtask)) {
+ if (!myUseLength) {
+ String replacementText = mySubtaskInfos.get(toSubtask).getPossibleAnswer();
+ EduUtils.replaceAnswerPlaceholder(project, document, this, visibleLength, replacementText);
+ }
+ return;
+ }
+ Integer minIndex = Collections.min(indexes);
+ if (fromSubtask < toSubtask) {
+ if (minIndex > fromSubtask && minIndex <= toSubtask) {
+ Integer maxIndex = Collections.max(ContainerUtil.filter(indexes, integer -> integer <= toSubtask));
+ AnswerPlaceholderSubtaskInfo maxInfo = mySubtaskInfos.get(maxIndex);
+ String replacementText = myUseLength ? maxInfo.getPlaceholderText() : maxInfo.getPossibleAnswer();
+ EduUtils.replaceAnswerPlaceholder(project, document, this, visibleLength, replacementText);
+ return;
+ }
+ }
+ if (fromSubtask > toSubtask) {
+ if (minIndex > toSubtask && minIndex <= fromSubtask) {
+ AnswerPlaceholderSubtaskInfo minInfo = mySubtaskInfos.get(minIndex);
+ if (minInfo.isNeedInsertText()) {
+ EduUtils.replaceAnswerPlaceholder(project, document, this, visibleLength, "");
+ }
+ else {
+ String replacementText = minInfo.getPlaceholderText();
+ EduUtils.replaceAnswerPlaceholder(project, document, this, visibleLength, replacementText);
+ }
+ }
+ }
+ }
}