summaryrefslogtreecommitdiff
path: root/python/edu/learn-python/src/com/jetbrains/python/edu/course/TaskFile.java
diff options
context:
space:
mode:
Diffstat (limited to 'python/edu/learn-python/src/com/jetbrains/python/edu/course/TaskFile.java')
-rw-r--r--python/edu/learn-python/src/com/jetbrains/python/edu/course/TaskFile.java48
1 files changed, 40 insertions, 8 deletions
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/course/TaskFile.java b/python/edu/learn-python/src/com/jetbrains/python/edu/course/TaskFile.java
index 4f17fc0d27f3..c46c4f56f937 100644
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/course/TaskFile.java
+++ b/python/edu/learn-python/src/com/jetbrains/python/edu/course/TaskFile.java
@@ -21,7 +21,7 @@ import java.util.List;
* which is visible to student in project view
*/
-public class TaskFile implements Stateful{
+public class TaskFile implements Stateful {
public List<TaskWindow> taskWindows = new ArrayList<TaskWindow>();
private Task myTask;
@Transient
@@ -173,7 +173,18 @@ public class TaskFile implements Stateful{
for (TaskWindow w : taskWindows) {
if ((w.getLine() == line) && (w.getStart() >= oldEndOffsetInLine)) {
int distance = w.getStart() - oldEndOffsetInLine;
- if (lineChange != 0 || newEndOffsetInLine <= w.getStart()) {
+ boolean coveredByPrevTW = false;
+ int prevIndex = w.getIndex() - 1;
+ if (StudyUtils.indexIsValid(prevIndex, taskWindows)) {
+ TaskWindow prevTW = taskWindows.get(prevIndex);
+ if (prevTW.getLine() == line) {
+ int endOffset = prevTW.getStart() + prevTW.getLength();
+ if (endOffset >= newEndOffsetInLine) {
+ coveredByPrevTW = true;
+ }
+ }
+ }
+ if (lineChange != 0 || newEndOffsetInLine <= w.getStart() || coveredByPrevTW) {
w.setStart(distance + newEndOffsetInLine);
w.setLine(line + lineChange);
}
@@ -217,12 +228,33 @@ public class TaskFile implements Stateful{
public void navigateToFirstTaskWindow(@NotNull final Editor editor) {
if (!taskWindows.isEmpty()) {
TaskWindow firstTaskWindow = StudyUtils.getFirst(taskWindows);
- mySelectedTaskWindow = firstTaskWindow;
- LogicalPosition taskWindowStart = new LogicalPosition(firstTaskWindow.getLine(), firstTaskWindow.getStart());
- editor.getCaretModel().moveToLogicalPosition(taskWindowStart);
- int startOffset = firstTaskWindow.getRealStartOffset(editor.getDocument());
- int endOffset = startOffset + firstTaskWindow.getLength();
- editor.getSelectionModel().setSelection(startOffset, endOffset);
+ navigateToTaskWindow(editor, firstTaskWindow);
+ }
+ }
+
+ private void navigateToTaskWindow(@NotNull final Editor editor, @NotNull final TaskWindow firstTaskWindow) {
+ if (!firstTaskWindow.isValid(editor.getDocument())) {
+ return;
}
+ mySelectedTaskWindow = firstTaskWindow;
+ LogicalPosition taskWindowStart = new LogicalPosition(firstTaskWindow.getLine(), firstTaskWindow.getStart());
+ editor.getCaretModel().moveToLogicalPosition(taskWindowStart);
+ int startOffset = firstTaskWindow.getRealStartOffset(editor.getDocument());
+ int endOffset = startOffset + firstTaskWindow.getLength();
+ editor.getSelectionModel().setSelection(startOffset, endOffset);
+ }
+
+ public void navigateToFirstFailedTaskWindow(@NotNull final Editor editor) {
+ for (TaskWindow taskWindow : taskWindows) {
+ if (taskWindow.getStatus() != StudyStatus.Failed) {
+ continue;
+ }
+ navigateToTaskWindow(editor, taskWindow);
+ break;
+ }
+ }
+
+ public boolean hasFailedTaskWindows() {
+ return taskWindows.size() > 0 && getStatus() == StudyStatus.Failed;
}
}