@Override
 public void loadState(Element el) {
   myCourse = XmlSerializer.deserialize(el.getChild(COURSE_ELEMENT), Course.class);
   if (myCourse != null) {
     myCourse.init(true);
   }
 }
 @Nullable
 public TaskFile getTaskFile(@NotNull final VirtualFile file) {
   if (myCourse == null) {
     return null;
   }
   final VirtualFile taskDir = file.getParent();
   if (taskDir == null) {
     return null;
   }
   final String taskDirName = taskDir.getName();
   if (taskDirName.contains(Task.TASK_DIR)) {
     final VirtualFile lessonDir = taskDir.getParent();
     if (lessonDir != null) {
       int lessonIndex = StudyUtils.getIndex(lessonDir.getName(), StudyNames.LESSON_DIR);
       List<Lesson> lessons = myCourse.getLessons();
       if (!StudyUtils.indexIsValid(lessonIndex, lessons)) {
         return null;
       }
       final Lesson lesson = lessons.get(lessonIndex);
       int taskIndex = StudyUtils.getIndex(taskDirName, Task.TASK_DIR);
       final List<Task> tasks = lesson.getTaskList();
       if (!StudyUtils.indexIsValid(taskIndex, tasks)) {
         return null;
       }
       final Task task = tasks.get(taskIndex);
       return task.getFile(file.getName());
     }
   }
   return null;
 }
 @Override
 public void projectOpened() {
   if (myCourse != null && !myCourse.isUpToDate()) {
     myCourse.setUpToDate(true);
     updateCourse();
   }
   ApplicationManager.getApplication()
       .invokeLater(
           new DumbAwareRunnable() {
             @Override
             public void run() {
               ApplicationManager.getApplication()
                   .runWriteAction(
                       new DumbAwareRunnable() {
                         @Override
                         public void run() {
                           if (myCourse != null) {
                             moveFocusToEditor();
                             UISettings.getInstance().HIDE_TOOL_STRIPES = false;
                             UISettings.getInstance().fireUISettingsChanged();
                             final ToolWindowManager toolWindowManager =
                                 ToolWindowManager.getInstance(myProject);
                             registerToolWindow(toolWindowManager);
                             final ToolWindow studyToolWindow =
                                 toolWindowManager.getToolWindow(
                                     StudyToolWindowFactory.STUDY_TOOL_WINDOW);
                             if (studyToolWindow != null) {
                               StudyUtils.updateStudyToolWindow(myProject);
                               studyToolWindow.show(null);
                             }
                             registerShortcuts();
                           }
                         }
                       });
             }
           });
 }
  private void updateCourse() {
    if (myCourse == null) {
      return;
    }
    final File resourceDirectory = new File(myCourse.getCourseDirectory());
    if (!resourceDirectory.exists()) {
      return;
    }
    final File[] files = resourceDirectory.listFiles();
    if (files == null) return;
    for (File file : files) {
      if (file.getName().equals(StudyNames.TEST_HELPER)) {
        copyFile(file, new File(myProject.getBasePath(), StudyNames.TEST_HELPER));
      }
      if (file.getName().startsWith(StudyNames.LESSON)) {
        final File[] tasks = file.listFiles();
        if (tasks == null) continue;
        for (File task : tasks) {
          final File taskDescr = new File(task, StudyNames.TASK_HTML);
          final File taskTests = new File(task, StudyNames.TASK_TESTS);
          copyFile(
              taskDescr,
              new File(
                  new File(new File(myProject.getBasePath(), file.getName()), task.getName()),
                  StudyNames.TASK_HTML));
          copyFile(
              taskTests,
              new File(
                  new File(new File(myProject.getBasePath(), file.getName()), task.getName()),
                  StudyNames.TASK_TESTS));
        }
      }
    }

    final Notification notification =
        new Notification(
            "Update.course",
            "Course update",
            "Current course is synchronized",
            NotificationType.INFORMATION);
    notification.notify(myProject);
  }