summaryrefslogtreecommitdiff
path: root/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyRefreshTaskAction.java
blob: f8abb0b6336580f330693a6063b89eb4d9a839fa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package com.jetbrains.python.edu.actions;

import com.intellij.ide.projectView.ProjectView;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.command.CommandProcessor;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Document;
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.ui.MessageType;
import com.intellij.openapi.ui.popup.Balloon;
import com.intellij.openapi.ui.popup.BalloonBuilder;
import com.intellij.openapi.ui.popup.JBPopupFactory;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.wm.IdeFocusManager;
import com.jetbrains.python.edu.StudyDocumentListener;
import com.jetbrains.python.edu.StudyTaskManager;
import com.jetbrains.python.edu.StudyUtils;
import com.jetbrains.python.edu.course.*;
import com.jetbrains.python.edu.editor.StudyEditor;

import java.io.*;

public class StudyRefreshTaskAction extends DumbAwareAction {
  private static final Logger LOG = Logger.getInstance(StudyRefreshTaskAction.class.getName());

  public void refresh(final Project project) {
        ApplicationManager.getApplication().invokeLater(new Runnable() {
          @Override
          public void run() {
            ApplicationManager.getApplication().runWriteAction(new Runnable() {
              @SuppressWarnings("IOResourceOpenedButNotSafelyClosed")
              @Override
              public void run() {
                final Editor editor = StudyEditor.getSelectedEditor(project);
                assert editor != null;
                final Document document = editor.getDocument();
                StudyDocumentListener listener = StudyEditor.getListener(document);
                if (listener != null) {
                  document.removeDocumentListener(listener);
                }
                final int lineCount = document.getLineCount();
                if (lineCount != 0) {
                  CommandProcessor.getInstance().runUndoTransparentAction(new Runnable() {
                    @Override
                    public void run() {
                      document.deleteString(0, document.getLineEndOffset(lineCount - 1));
                    }
                  });
                }
                StudyTaskManager taskManager = StudyTaskManager.getInstance(project);
                Course course = taskManager.getCourse();
                assert course != null;
                File resourceFile = new File(course.getResourcePath());
                File resourceRoot = resourceFile.getParentFile();
                FileDocumentManager fileDocumentManager = FileDocumentManager.getInstance();
                VirtualFile openedFile = fileDocumentManager.getFile(document);
                assert openedFile != null;
                final TaskFile selectedTaskFile = taskManager.getTaskFile(openedFile);
                assert selectedTaskFile != null;
                Task currentTask = selectedTaskFile.getTask();
                String lessonDir = Lesson.LESSON_DIR + String.valueOf(currentTask.getLesson().getIndex() + 1);
                String taskDir = Task.TASK_DIR + String.valueOf(currentTask.getIndex() + 1);
                File pattern = new File(new File(new File(resourceRoot, lessonDir), taskDir), openedFile.getName());
                BufferedReader reader = null;
                try {
                  reader = new BufferedReader(new InputStreamReader(new FileInputStream(pattern)));
                  String line;
                  StringBuilder patternText = new StringBuilder();
                  while ((line = reader.readLine()) != null) {
                    patternText.append(line);
                    patternText.append("\n");
                  }
                  int patternLength = patternText.length();
                  if (patternText.charAt(patternLength - 1) == '\n') {
                    patternText.delete(patternLength - 1, patternLength);
                  }
                  document.setText(patternText);
                  StudyStatus oldStatus = currentTask.getStatus();
                  LessonInfo lessonInfo = currentTask.getLesson().getLessonInfo();
                  lessonInfo.update(oldStatus, -1);
                  lessonInfo.update(StudyStatus.Unchecked, +1);
                  StudyUtils.updateStudyToolWindow(project);
                  for (TaskWindow taskWindow : selectedTaskFile.getTaskWindows()) {
                    taskWindow.reset();
                  }
                  ProjectView.getInstance(project).refresh();
                  if (listener != null) {
                    document.addDocumentListener(listener);
                  }
                  selectedTaskFile.drawAllWindows(editor);
                  IdeFocusManager.getInstance(project).requestFocus(editor.getContentComponent(), true);
                  selectedTaskFile.navigateToFirstTaskWindow(editor);
                  BalloonBuilder balloonBuilder =
                    JBPopupFactory.getInstance().createHtmlTextBalloonBuilder("You can now start again", MessageType.INFO, null);
                  Balloon balloon = balloonBuilder.createBalloon();
                  StudyEditor selectedStudyEditor = StudyEditor.getSelectedStudyEditor(project);
                  assert selectedStudyEditor != null;
                  balloon.showInCenterOf(selectedStudyEditor.getRefreshButton());
                }
                catch (FileNotFoundException e1) {
                  LOG.error(e1);
                }
                catch (IOException e1) {
                  LOG.error(e1);
                }
                finally {
                  StudyUtils.closeSilently(reader);
                }
              }
            });
          }
        });
  }

  public void actionPerformed(AnActionEvent e) {
    refresh(e.getProject());
  }
}