diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyNextWindowAction.java b/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyNextWindowAction.java index a4ecfda8baba..595aeeff42e3 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyNextWindowAction.java +++ b/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyNextWindowAction.java @@ -1,23 +1,16 @@ package com.jetbrains.python.edu.actions; -import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.fileEditor.FileDocumentManager; -import com.intellij.openapi.project.DumbAwareAction; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.vfs.VirtualFile; -import com.jetbrains.python.edu.StudyTaskManager; import com.jetbrains.python.edu.StudyUtils; -import com.jetbrains.python.edu.course.StudyStatus; -import com.jetbrains.python.edu.course.TaskFile; import com.jetbrains.python.edu.course.TaskWindow; -import com.jetbrains.python.edu.editor.StudyEditor; import icons.StudyIcons; +import org.jetbrains.annotations.NotNull; + +import java.util.List; /** * move caret to next task window */ -public class StudyNextWindowAction extends DumbAwareAction { +public class StudyNextWindowAction extends StudyWindowNavigationAction { public static final String ACTION_ID = "NextWindow"; public static final String SHORTCUT = "ctrl pressed PERIOD"; public static final String SHORTCUT2 = "ctrl pressed ENTER"; @@ -26,37 +19,14 @@ public class StudyNextWindowAction extends DumbAwareAction { super("NextWindowAction", "Select next window", StudyIcons.Next); } - public void actionPerformed(AnActionEvent e) { - Project project = e.getProject(); - if (project != null) { - Editor selectedEditor = StudyEditor.getSelectedEditor(project); - if (selectedEditor != null) { - FileDocumentManager fileDocumentManager = FileDocumentManager.getInstance(); - VirtualFile openedFile = fileDocumentManager.getFile(selectedEditor.getDocument()); - if (openedFile != null) { - StudyTaskManager taskManager = StudyTaskManager.getInstance(project); - TaskFile selectedTaskFile = taskManager.getTaskFile(openedFile); - if (selectedTaskFile != null) { - TaskWindow selectedTaskWindow = selectedTaskFile.getSelectedTaskWindow(); - boolean ifDraw = false; - for (TaskWindow taskWindow : selectedTaskFile.getTaskWindows()) { - if (ifDraw) { - selectedTaskFile.setSelectedTaskWindow(taskWindow); - taskWindow.draw(selectedEditor, taskWindow.getStatus() != StudyStatus.Solved, true); - return; - } - if (taskWindow == selectedTaskWindow) { - ifDraw = true; - } - } - } - } - } - } - } - @Override - public void update(AnActionEvent e) { - StudyUtils.updateAction(e); + protected TaskWindow getNextTaskWindow(@NotNull final TaskWindow window) { + int index = window.getIndex(); + List windows = window.getTaskFile().getTaskWindows(); + if (StudyUtils.indexIsValid(index, windows)) { + int newIndex = index + 1; + return newIndex == windows.size() ? windows.get(0) : windows.get(newIndex); + } + return null; } } diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyPrevWindowAction.java b/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyPrevWindowAction.java index 3cc41511c069..347456189a00 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyPrevWindowAction.java +++ b/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyPrevWindowAction.java @@ -1,24 +1,18 @@ package com.jetbrains.python.edu.actions; -import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.fileEditor.FileDocumentManager; -import com.intellij.openapi.project.DumbAwareAction; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.vfs.VirtualFile; -import com.jetbrains.python.edu.StudyTaskManager; import com.jetbrains.python.edu.StudyUtils; -import com.jetbrains.python.edu.course.StudyStatus; -import com.jetbrains.python.edu.course.TaskFile; import com.jetbrains.python.edu.course.TaskWindow; -import com.jetbrains.python.edu.editor.StudyEditor; import icons.StudyIcons; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; /** * author: liana * data: 6/30/14. */ -public class StudyPrevWindowAction extends DumbAwareAction { +public class StudyPrevWindowAction extends StudyWindowNavigationAction { public static final String ACTION_ID = "PrevWindowAction"; public static final String SHORTCUT = "ctrl pressed COMMA"; @@ -26,37 +20,15 @@ public class StudyPrevWindowAction extends DumbAwareAction { super("PrevWindowAction", "Select previous window", StudyIcons.Prev); } - public void actionPerformed(AnActionEvent e) { - Project project = e.getProject(); - assert project != null; - Editor selectedEditor = StudyEditor.getSelectedEditor(project); - if (selectedEditor != null) { - FileDocumentManager fileDocumentManager = FileDocumentManager.getInstance(); - VirtualFile openedFile = fileDocumentManager.getFile(selectedEditor.getDocument()); - if (openedFile != null) { - StudyTaskManager taskManager = StudyTaskManager.getInstance(project); - TaskFile selectedTaskFile = taskManager.getTaskFile(openedFile); - if (selectedTaskFile != null) { - TaskWindow selectedTaskWindow = selectedTaskFile.getSelectedTaskWindow(); - TaskWindow prev = null; - for (TaskWindow taskWindow : selectedTaskFile.getTaskWindows()) { - if (taskWindow == selectedTaskWindow) { - break; - } - prev = taskWindow; - } - - if (prev != null) { - selectedTaskFile.setSelectedTaskWindow(prev); - prev.draw(selectedEditor, prev.getStatus() != StudyStatus.Solved, true); - } - } - } - } - } + @Nullable @Override - public void update(AnActionEvent e) { - StudyUtils.updateAction(e); + protected TaskWindow getNextTaskWindow(@NotNull final TaskWindow window) { + int prevIndex = window.getIndex() - 1; + List windows = window.getTaskFile().getTaskWindows(); + if (StudyUtils.indexIsValid(prevIndex, windows)) { + return windows.get(prevIndex); + } + return null; } } diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyWindowNavigationAction.java b/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyWindowNavigationAction.java new file mode 100644 index 000000000000..8c6b90221555 --- /dev/null +++ b/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyWindowNavigationAction.java @@ -0,0 +1,65 @@ +package com.jetbrains.python.edu.actions; + +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.fileEditor.FileDocumentManager; +import com.intellij.openapi.project.DumbAwareAction; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; +import com.jetbrains.python.edu.StudyTaskManager; +import com.jetbrains.python.edu.StudyUtils; +import com.jetbrains.python.edu.course.TaskFile; +import com.jetbrains.python.edu.course.TaskWindow; +import com.jetbrains.python.edu.editor.StudyEditor; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; + +abstract public class StudyWindowNavigationAction extends DumbAwareAction { + + public StudyWindowNavigationAction(String actionId, String description, Icon icon) { + super(actionId, description, icon); + } + + public void navigateWindow(@NotNull final Project project) { + Editor selectedEditor = StudyEditor.getSelectedEditor(project); + if (selectedEditor != null) { + FileDocumentManager fileDocumentManager = FileDocumentManager.getInstance(); + VirtualFile openedFile = fileDocumentManager.getFile(selectedEditor.getDocument()); + if (openedFile != null) { + StudyTaskManager taskManager = StudyTaskManager.getInstance(project); + TaskFile selectedTaskFile = taskManager.getTaskFile(openedFile); + if (selectedTaskFile != null) { + TaskWindow selectedTaskWindow = selectedTaskFile.getSelectedTaskWindow(); + if (selectedTaskWindow == null) { + return; + } + TaskWindow nextTaskWindow = getNextTaskWindow(selectedTaskWindow); + if (nextTaskWindow == null) { + return; + } + nextTaskWindow.draw(selectedEditor, true, true); + selectedTaskFile.setSelectedTaskWindow(nextTaskWindow); + } + } + } + } + + @Nullable + protected abstract TaskWindow getNextTaskWindow(@NotNull final TaskWindow window); + + @Override + public void actionPerformed(AnActionEvent e) { + Project project = e.getProject(); + if (project == null) { + return; + } + navigateWindow(project); + } + + @Override + public void update(AnActionEvent e) { + StudyUtils.updateAction(e); + } +} 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 ed4f2bfe80da..9b53dabbf3ec 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 @@ -50,6 +50,7 @@ public class TaskFile implements Stateful{ return myTask; } + @Nullable @Transient public TaskWindow getSelectedTaskWindow() { return mySelectedTaskWindow; @@ -215,6 +216,7 @@ 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());