Merge remote-tracking branch 'origin/liana/course-creator-improvements'
authorliana.bakradze <liana.bakradze@jetbrains.com>
Sat, 23 Apr 2016 06:39:21 +0000 (09:39 +0300)
committerliana.bakradze <liana.bakradze@jetbrains.com>
Sat, 23 Apr 2016 06:49:06 +0000 (09:49 +0300)
# Conflicts:
# python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/handlers/CCLessonMoveHandlerDelegate.java
# python/educational-core/student/resources/META-INF/plugin.xml
# python/educational-core/student/src/com/jetbrains/edu/learning/StudyPluginConfigurator.java
# python/educational-core/student/src/com/jetbrains/edu/learning/StudyProjectComponent.java
# python/educational-core/student/src/com/jetbrains/edu/learning/StudyTaskManager.java
# python/educational-core/student/src/com/jetbrains/edu/learning/StudyUtils.java
# python/educational-core/student/src/com/jetbrains/edu/learning/editor/StudyEditorFactoryListener.java
# python/educational-core/student/src/com/jetbrains/edu/learning/ui/StudySwingToolWindow.java

13 files changed:
1  2 
python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/handlers/CCLessonMoveHandlerDelegate.java
python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/handlers/CCTaskMoveHandlerDelegate.java
python/educational-core/student/resources/META-INF/plugin.xml
python/educational-core/student/src/com/jetbrains/edu/learning/StudyMoveDelegate.java
python/educational-core/student/src/com/jetbrains/edu/learning/StudyPluginConfigurator.java
python/educational-core/student/src/com/jetbrains/edu/learning/StudyProjectComponent.java
python/educational-core/student/src/com/jetbrains/edu/learning/StudyTaskManager.java
python/educational-core/student/src/com/jetbrains/edu/learning/StudyUtils.java
python/educational-core/student/src/com/jetbrains/edu/learning/actions/StudyRefreshTaskFileAction.java
python/educational-core/student/src/com/jetbrains/edu/learning/courseFormat/TaskFile.java
python/educational-core/student/src/com/jetbrains/edu/learning/editor/StudyEditorFactoryListener.java
python/educational-core/student/src/com/jetbrains/edu/learning/ui/StudySwingToolWindow.java
python/educational-core/student/student.iml

index 685ac37417853ed9780e24f56e3565803e88a521,ee6a92fa5e0ec459a9862d66114c1ae4cb2b00f0..18ca9364c96fbe49c74bcd361a4ab7ef5495b040
@@@ -18,7 -18,9 +18,10 @@@ import com.intellij.psi.PsiReference
  import com.intellij.refactoring.move.MoveCallback;
  import com.intellij.refactoring.move.MoveHandlerDelegate;
  import com.intellij.util.Function;
+ import com.jetbrains.edu.coursecreator.CCUtils;
  import com.jetbrains.edu.coursecreator.ui.CCMoveStudyItemDialog;
+ import com.jetbrains.edu.learning.StudyTaskManager;
++import com.jetbrains.edu.coursecreator.CCUtils;
  import com.jetbrains.edu.learning.core.EduNames;
  import com.jetbrains.edu.learning.core.EduUtils;
  import com.jetbrains.edu.learning.courseFormat.Course;
@@@ -129,6 -134,6 +135,6 @@@ public class CCLessonMoveHandlerDelegat
                             DataContext dataContext,
                             @Nullable PsiReference reference,
                             Editor editor) {
-     return CCProjectService.getInstance(project).getCourse() != null;
 -    return true;
++    return CCUtils.isCourseCreator(project);
    }
  }
index 380e0556112bf0f40fd00342151b8b04938721c0,a132e408b85f1c768ba8a47185dded30318c3f92..91083e9f9edb66af21c0ae18cc88f90a338757ae
@@@ -192,6 -194,6 +194,6 @@@ public class CCTaskMoveHandlerDelegate 
                             DataContext dataContext,
                             @Nullable PsiReference reference,
                             Editor editor) {
-     return CCProjectService.getInstance(project).getCourse() != null;
 -    return true;
++    return CCUtils.isCourseCreator(project);
    }
  }
index 296fd98bd0052e4f202bfff6b1d65e467ef962fa,ff7ddbab656abfe12f28dc34a2549244917fa4f6..1ebb41dc0aed618ffb9e20d3e1b475f186c7bb97
        <with attribute="implementationClass" implements="com.jetbrains.edu.learning.StudyLanguageManager"/>
      </extensionPoint>
      <extensionPoint qualifiedName="Edu.studyPluginConfigurator" interface="com.jetbrains.edu.learning.StudyPluginConfigurator"/>
+     <extensionPoint qualifiedName="Edu.studyActionsProvider" interface="com.jetbrains.edu.learning.StudyActionsProvider"/>
      <extensionPoint qualifiedName="Edu.studyTwitterPluginConfigurator" interface="com.jetbrains.edu.learning.StudyTwitterPluginConfigurator"/>
+     <extensionPoint qualifiedName="Edu.studyActionListener" interface="com.jetbrains.edu.learning.StudyActionListener"/>
 +    <extensionPoint qualifiedName="Edu.optionsProvider" beanClass="com.jetbrains.edu.learning.settings.StudyOptionsProviderEP">>
 +      <with attribute="instance" implements="com.jetbrains.edu.learning.settings.StudyOptionsProvider"/>
 +    </extensionPoint>
    </extensionPoints>
  
    <actions>
index 61d9e78570d6e5e4920db0002187aadf125275e1,09cddf9b8e28b39acaf51a5159d0d5a094ed990a..db5ee3b39143d887a2a907f03f0c905b6f84889e
@@@ -40,6 -41,9 +40,6 @@@ public interface StudyPluginConfigurato
    StudyAfterCheckAction[] getAfterCheckActions();
    
    @NotNull String getLanguageScriptUrl();
-   
 -  @Nullable
 -  ModifiableSettingsPanel getSettingsPanel();
 -  
    boolean accept(@NotNull final Project project);
  }
index b534bba9118bc90f6b42e4ccea498225ff42d69d,3a2ffd7d8f6645660856405b50e101e3c5595263..024cd09e924590fa9666f1acfc1a660911fca220
@@@ -37,8 -38,10 +38,10 @@@ public class StudyTaskManager implement
    public Map<TaskFile, StudyStatus> myTaskStatusMap = new HashMap<>();
    public Map<Task, List<UserTest>> myUserTests = new HashMap<>();
    public List<String> myInvisibleFiles = new ArrayList<>();
 +  public boolean myShouldUseJavaFx = StudyUtils.hasJavaFx();
+   private StudyToolWindow.StudyToolWindowMode myToolWindowMode = StudyToolWindow.StudyToolWindowMode.TEXT;
+   private boolean myTurnEditingMode = false;
  
 -
    private StudyTaskManager() {
    }
  
      return myInvisibleFiles.contains(path);
    }
  
 +  public boolean shouldUseJavaFx() {
 +    return myShouldUseJavaFx;
 +  }
 +
 +  public void setShouldUseJavaFx(boolean shouldUseJavaFx) {
 +    this.myShouldUseJavaFx = shouldUseJavaFx;
 +  }
++
+   public StudyToolWindow.StudyToolWindowMode getToolWindowMode() {
+     return myToolWindowMode;
+   }
+   public void setToolWindowMode(StudyToolWindow.StudyToolWindowMode toolWindowMode) {
+     myToolWindowMode = toolWindowMode;
+   }
+   public boolean isTurnEditingMode() {
+     return myTurnEditingMode;
+   }
+   public void setTurnEditingMode(boolean turnEditingMode) {
+     myTurnEditingMode = turnEditingMode;
+   }
  }
index 73d7843efcc8fae9101a183e832d2290b724066f,fcb9943c56c5a882d75e8dbe7d0809ed1505de0a..2c41cda8d574f76a3a7b74573874c4fe3a55be37
@@@ -353,8 -352,17 +352,9 @@@ public class StudyUtils 
      }
    }
  
 -  @Nullable
 -  public static Document getPatternDocument(@NotNull final TaskFile taskFile, String name) {
 -    VirtualFile patternFile = getPatternFile(taskFile, name);
 -    if (patternFile == null) {
 -      return null;
 -    }
 -    return FileDocumentManager.getInstance().getDocument(patternFile);
 -  }
    @Nullable
-   public static Document getPatternDocument(@NotNull final TaskFile taskFile, String name) {
+   public static VirtualFile getPatternFile(@NotNull TaskFile taskFile, String name) {
      Task task = taskFile.getTask();
      String lessonDir = EduNames.LESSON + String.valueOf(task.getLesson().getIndex());
      String taskDir = EduNames.TASK + String.valueOf(task.getIndex());
      if (patternFile == null) {
        return null;
      }
+     return patternFile;
+   }
++  @Nullable
++  public static Document getPatternDocument(@NotNull final TaskFile taskFile, String name) {
++    VirtualFile patternFile = getPatternFile(taskFile, name);
++    if (patternFile == null) {
++      return null;
++    }
 +    return FileDocumentManager.getInstance().getDocument(patternFile);
 +  }
 +
    public static boolean isRenameableOrMoveable(@NotNull final Project project, @NotNull final Course course, @NotNull final PsiElement element) {
      if (element instanceof PsiFile) {
        VirtualFile virtualFile = ((PsiFile)element).getVirtualFile();
      }
      return null;
    }
 -
+   @Nullable
+   public static TaskFile getSelectedTaskFile(@NotNull Project project) {
+     VirtualFile[] files = FileEditorManager.getInstance(project).getSelectedFiles();
+     TaskFile taskFile = null;
+     for (VirtualFile file : files) {
+       taskFile = getTaskFile(project, file);
+       if (taskFile != null) {
+         break;
+       }
+     }
+     return taskFile;
+   }
  
-   public static void update(Project project) {
+   public static void updateStudyToolWindow(Project project) {
      final StudyToolWindow studyToolWindow = getStudyToolWindow(project);
      if (studyToolWindow != null) {
        String taskText = getTaskText(project);
      }
    }
  
 -  public static boolean isStudyProject(Project project) {
 +  public static boolean isStudyProject(@NotNull Project project) {
      return StudyTaskManager.getInstance(project).getCourse() != null;
    }
-   
 +  public static boolean hasJavaFx() {
 +    try {
 +      Class.forName("javafx.application.Platform");
 +      return true;
 +    }
 +    catch (ClassNotFoundException e) {
 +      return false;
 +    }
 +  }
++
+   @Nullable
+   public static Task getTask(@NotNull Project project, @NotNull VirtualFile taskVF) {
+     Course course = StudyTaskManager.getInstance(project).getCourse();
+     if (course == null) {
+       return null;
+     }
+     VirtualFile lessonVF = taskVF.getParent();
+     if (lessonVF == null) {
+       return null;
+     }
+     Lesson lesson = course.getLesson(lessonVF.getName());
+     if (lesson == null) {
+       return null;
+     }
+     return lesson.getTask(taskVF.getName());
+   }
+   @Nullable
+   public static VirtualFile getTaskDir(@NotNull VirtualFile taskFile) {
+     VirtualFile parent = taskFile.getParent();
+     if (parent == null) {
+       return null;
+     }
+     String name = parent.getName();
+     if (name.contains(EduNames.TASK)) {
+       return parent;
+     }
+     if (EduNames.SRC.equals(name)) {
+       return parent.getParent();
+     }
+     return null;
+   }
  }
index 4678c7e0ba3edb97f21a4dc9d71c58fbbce7c4cf,d345ddf22086c3e15fb52f3cd431c3262a83f347..8a9c17d0ef24b6bd891cd3dc446fe40c4fd3bc98
@@@ -56,26 -61,46 +59,36 @@@ public class StudyEditorFactoryListene
      if (project == null) {
        return;
      }
 -    ApplicationManager.getApplication().invokeLater(
 -      new Runnable() {
 -        @Override
 -        public void run() {
 -          ApplicationManager.getApplication().runWriteAction(new Runnable() {
 -            @Override
 -            public void run() {
 -              final Document document = editor.getDocument();
 -              final VirtualFile openedFile = FileDocumentManager.getInstance().getFile(document);
 -              if (openedFile != null) {
 -                final TaskFile taskFile = StudyUtils.getTaskFile(project, openedFile);
 -                if (taskFile != null) {
 -                  WolfTheProblemSolver.getInstance(project).clearProblems(openedFile);
 -                  final ToolWindow studyToolWindow = ToolWindowManager.getInstance(project).getToolWindow(StudyToolWindowFactory.STUDY_TOOL_WINDOW);
 -                  if (studyToolWindow != null) {
 -                    StudyUtils.updateToolWindows(project);
 -                    studyToolWindow.show(null);
 -                  }
 -                  Course course = StudyTaskManager.getInstance(project).getCourse();
 -                  if (course == null) {
 -                    return;
 -                  }
  
 -                  StudyEditor.addDocumentListener(document, new EduDocumentListener(taskFile, true));
 -                  if (!taskFile.getAnswerPlaceholders().isEmpty()) {
 -                    StudyNavigator.navigateToFirstAnswerPlaceholder(editor, taskFile);
 -                    boolean isStudyProject = EduNames.STUDY.equals(course.getCourseType());
 -                    StudyUtils.drawAllWindows(editor, taskFile);
 -                    if (isStudyProject) {
 -                      editor.addEditorMouseListener(new WindowSelectionListener(taskFile));
 -                    }
 -                  }
 -                }
 -              }
 -            }
 -          });
 +    final Document document = editor.getDocument();
 +    final VirtualFile openedFile = FileDocumentManager.getInstance().getFile(document);
 +    if (openedFile != null) {
 +      final TaskFile taskFile = StudyUtils.getTaskFile(project, openedFile);
 +      if (taskFile != null) {
 +        WolfTheProblemSolver.getInstance(project).clearProblems(openedFile);
 +        final ToolWindow studyToolWindow = ToolWindowManager.getInstance(project).getToolWindow(StudyToolWindowFactory.STUDY_TOOL_WINDOW);
 +        if (studyToolWindow != null) {
 +          StudyUtils.updateToolWindows(project);
 +          studyToolWindow.show(null);
 +        }
++        Course course = StudyTaskManager.getInstance(project).getCourse();
++        if (course == null) {
++          return;
++        }
++
++        StudyEditor.addDocumentListener(document, new EduDocumentListener(taskFile, true));
++
 +        if (!taskFile.getAnswerPlaceholders().isEmpty()) {
 +          StudyNavigator.navigateToFirstAnswerPlaceholder(editor, taskFile);
-           StudyEditor.addDocumentListener(document, new EduDocumentListener(taskFile));
++          boolean isStudyProject = EduNames.STUDY.equals(course.getCourseType());
 +          StudyUtils.drawAllWindows(editor, taskFile);
-           editor.addEditorMouseListener(new WindowSelectionListener(taskFile));
++          if (isStudyProject) {
++            editor.addEditorMouseListener(new WindowSelectionListener(taskFile));
++          }
          }
        }
 -    );
 +    }
    }
  
    @Override
index ef66218d33989e44b4344f206a8b6a48b7e57e34,4e446b083a6c4078f2cf75882629b471a0987d5e..ebaff662ecb84db332586cf2249bc620478cdc3f
@@@ -37,9 -35,8 +37,9 @@@ public class StudySwingToolWindow exten
    }
  
    @Override
-   public JComponent createTaskInfoPanel(String taskText, Project project) {
+   public JComponent createTaskInfoPanel(Project project) {
      myTaskTextPane = new JTextPane();
 +    final JBScrollPane scrollPane = new JBScrollPane(myTaskTextPane);
      myTaskTextPane.setContentType(new HTMLEditorKit().getContentType());
      final EditorColorsScheme editorColorsScheme = EditorColorsManager.getInstance().getGlobalScheme();
      int fontSize = editorColorsScheme.getEditorFontSize();
      if (!UIUtil.isUnderDarcula()) {
        myTaskTextPane.setBackground(EditorColorsManager.getInstance().getGlobalScheme().getDefaultBackground());
      }
 -    myTaskTextPane.setBorder(new EmptyBorder(15, 20, 0, 100));
 +    myTaskTextPane.setBorder(new EmptyBorder(20, 20, 0, 10));
-     myTaskTextPane.setText(taskText);
      myTaskTextPane.addHyperlinkListener(BrowserHyperlinkListener.INSTANCE);
 -    return myTaskTextPane;
 +    return scrollPane;
    }
  
-   public void setTaskText(String text) {
+   public void setText(String text) {
      myTaskTextPane.setText(text);
    }
  }