diff --git a/python/educational-core/student/resources/StudyBundle.properties b/python/educational-core/student/resources/StudyBundle.properties deleted file mode 100644 index 25a76262cf81..000000000000 --- a/python/educational-core/student/resources/StudyBundle.properties +++ /dev/null @@ -1,3 +0,0 @@ -browser.action.back=Click to go back -browser.action.forward=Click to go forward -browser.action.open.link=Click to open link in browser \ No newline at end of file diff --git a/python/educational-core/student/resources/bundle/StudyBundle.properties b/python/educational-core/student/resources/bundle/StudyBundle.properties new file mode 100644 index 000000000000..4a151b4052bc --- /dev/null +++ b/python/educational-core/student/resources/bundle/StudyBundle.properties @@ -0,0 +1,5 @@ +browser.action.back=Click to go back +browser.action.forward=Click to go forward +browser.action.open.link=Click to open link in browser + +empty.task.text="Please, open any task to see task description" \ No newline at end of file diff --git a/python/educational-core/student/src/com/jetbrains/edu/learning/StudyBundle.java b/python/educational-core/student/src/com/jetbrains/edu/learning/StudyBundle.java index d86b8621e2db..4346a66deec8 100644 --- a/python/educational-core/student/src/com/jetbrains/edu/learning/StudyBundle.java +++ b/python/educational-core/student/src/com/jetbrains/edu/learning/StudyBundle.java @@ -17,7 +17,7 @@ public class StudyBundle { private static Reference ourBundle; @NonNls - private static final String BUNDLE = "StudyBundle"; + private static final String BUNDLE = "bundle.StudyBundle"; private StudyBundle() { } diff --git a/python/educational-core/student/src/com/jetbrains/edu/learning/StudyToolWindowConfigurator.java b/python/educational-core/student/src/com/jetbrains/edu/learning/StudyToolWindowConfigurator.java index 3bd841f3999b..9ff31561dd3e 100644 --- a/python/educational-core/student/src/com/jetbrains/edu/learning/StudyToolWindowConfigurator.java +++ b/python/educational-core/student/src/com/jetbrains/edu/learning/StudyToolWindowConfigurator.java @@ -2,8 +2,11 @@ package com.jetbrains.edu.learning; import com.intellij.openapi.actionSystem.DefaultActionGroup; import com.intellij.openapi.extensions.ExtensionPointName; +import com.intellij.openapi.fileEditor.FileEditorManager; +import com.intellij.openapi.fileEditor.FileEditorManagerListener; import com.intellij.openapi.project.Project; import com.intellij.util.containers.HashMap; +import com.jetbrains.edu.learning.ui.StudyToolWindow; import org.jetbrains.annotations.NotNull; import javax.swing.*; @@ -13,8 +16,10 @@ public interface StudyToolWindowConfigurator { @NotNull DefaultActionGroup getActionGroup(Project project); - - HashMap getAdditionalPanels(Project project); + + HashMap getAdditionalPanels(Project project); + + FileEditorManagerListener getFileEditorManagerListener(@NotNull final Project project, @NotNull final StudyToolWindow toolWindow); boolean accept(@NotNull final Project project); diff --git a/python/educational-core/student/src/com/jetbrains/edu/learning/StudyUtils.java b/python/educational-core/student/src/com/jetbrains/edu/learning/StudyUtils.java index 89cc18535d8d..0bd014f2ac31 100644 --- a/python/educational-core/student/src/com/jetbrains/edu/learning/StudyUtils.java +++ b/python/educational-core/student/src/com/jetbrains/edu/learning/StudyUtils.java @@ -43,6 +43,7 @@ import com.jetbrains.edu.learning.editor.StudyEditor; import com.jetbrains.edu.learning.run.StudyExecutor; import com.jetbrains.edu.learning.run.StudyTestRunner; import com.jetbrains.edu.learning.ui.StudyProgressToolWindowFactory; +import com.jetbrains.edu.learning.ui.StudyToolWindow; import com.jetbrains.edu.learning.ui.StudyToolWindowFactory; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -394,4 +395,27 @@ public class StudyUtils { } return false; } + + @Nullable + public static String getTaskTextFromTask(@Nullable final Task task, @Nullable final VirtualFile taskDirectory) { + if (task == null) { + return null; + } + String text = task.getText(); + if (text != null) { + return text; + } + if (taskDirectory != null) { + VirtualFile taskTextFile = taskDirectory.findChild(EduNames.TASK_HTML); + if (taskTextFile != null) { + try { + return FileUtil.loadTextAndClose(taskTextFile.getInputStream()); + } + catch (IOException e) { + LOG.info(e); + } + } + } + return null; + } } diff --git a/python/educational-core/student/src/com/jetbrains/edu/learning/ui/StudyToolWindow.java b/python/educational-core/student/src/com/jetbrains/edu/learning/ui/StudyToolWindow.java index eada47eed383..f2279bf2aa95 100644 --- a/python/educational-core/student/src/com/jetbrains/edu/learning/ui/StudyToolWindow.java +++ b/python/educational-core/student/src/com/jetbrains/edu/learning/ui/StudyToolWindow.java @@ -22,20 +22,18 @@ import com.intellij.openapi.actionSystem.DataProvider; import com.intellij.openapi.actionSystem.DefaultActionGroup; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.fileEditor.FileEditorManager; -import com.intellij.openapi.fileEditor.FileEditorManagerEvent; import com.intellij.openapi.fileEditor.FileEditorManagerListener; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.SimpleToolWindowPanel; -import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.ui.JBCardLayout; import com.intellij.ui.OnePixelSplitter; import com.intellij.util.containers.HashMap; import com.intellij.util.ui.JBUI; -import com.jetbrains.edu.EduNames; import com.jetbrains.edu.courseFormat.Course; import com.jetbrains.edu.courseFormat.Task; import com.jetbrains.edu.courseFormat.TaskFile; +import com.jetbrains.edu.learning.StudyBundle; import com.jetbrains.edu.learning.StudyTaskManager; import com.jetbrains.edu.learning.StudyToolWindowConfigurator; import com.jetbrains.edu.learning.StudyUtils; @@ -44,12 +42,11 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; -import java.io.IOException; import java.util.Map; public class StudyToolWindow extends SimpleToolWindowPanel implements DataProvider, Disposable { private static final Logger LOG = Logger.getInstance(StudyToolWindow.class); - private static final String EMPTY_TASK_TEXT = "Please, open any task to see task description"; + private static final String EMPTY_TASK_TEXT = StudyBundle.message("empty.task.text"); private static final String TASK_INFO_ID = "taskInfo"; private final JBCardLayout myCardLayout; private final JPanel myContentPanel; @@ -75,7 +72,9 @@ public class StudyToolWindow extends SimpleToolWindowPanel implements DataProvid setContent(mySplitPane); - final FileEditorManagerListener listener = new StudyFileEditorManagerListener(project, this); + StudyToolWindowConfigurator configurator = getStudyToolWindowConfigurator(project); + assert configurator != null; + final FileEditorManagerListener listener = configurator.getFileEditorManagerListener(project, this); project.getMessageBus().connect().subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, listener); } @@ -113,7 +112,7 @@ public class StudyToolWindow extends SimpleToolWindowPanel implements DataProvid } final Task task = taskFile.getTask(); if (task != null) { - return getTaskTextFromTask(task, task.getTaskDir(project)); + return StudyUtils.getTaskTextFromTask(task, task.getTaskDir(project)); } return null; } @@ -161,33 +160,10 @@ public class StudyToolWindow extends SimpleToolWindowPanel implements DataProvid return group; } - private void setTaskText(String text) { + public void setTaskText(String text) { myBrowserWindow.loadContent(text); } - @Nullable - private static String getTaskTextFromTask(@Nullable final Task task, @Nullable final VirtualFile taskDirectory) { - if (task == null) { - return null; - } - String text = task.getText(); - if (text != null) { - return text; - } - if (taskDirectory != null) { - VirtualFile taskTextFile = taskDirectory.findChild(EduNames.TASK_HTML); - if (taskTextFile != null) { - try { - return FileUtil.loadTextAndClose(taskTextFile.getInputStream()); - } - catch (IOException e) { - LOG.info(e); - } - } - } - return null; - } - @Nullable private static StudyToolWindowConfigurator getStudyToolWindowConfigurator(@NotNull Project project) { StudyToolWindowConfigurator[] extensions = StudyToolWindowConfigurator.EP_NAME.getExtensions(); @@ -198,56 +174,4 @@ public class StudyToolWindow extends SimpleToolWindowPanel implements DataProvid } return null; } - - static class StudyFileEditorManagerListener implements FileEditorManagerListener { - private Project myProject; - private StudyToolWindow myStudyToolWindow; - - StudyFileEditorManagerListener(@NotNull final Project project, StudyToolWindow studyToolWindow) { - myProject = project; - myStudyToolWindow = studyToolWindow; - } - - @Override - public void fileOpened(@NotNull FileEditorManager source, @NotNull VirtualFile file) { - Task task = getTask(file); - setTaskText(task, file.getParent()); - } - - @Override - public void fileClosed(@NotNull FileEditorManager source, @NotNull VirtualFile file) { - myStudyToolWindow.setTaskText(EMPTY_TASK_TEXT); - } - - @Override - public void selectionChanged(@NotNull FileEditorManagerEvent event) { - VirtualFile file = event.getNewFile(); - if (file != null) { - Task task = getTask(file); - setTaskText(task, file.getParent()); - } - } - - @Nullable - private Task getTask(@NotNull VirtualFile file) { - TaskFile taskFile = StudyUtils.getTaskFile(myProject, file); - if (taskFile != null) { - return taskFile.getTask(); - } - else { - return null; - } - } - - private void setTaskText(@Nullable final Task task, @Nullable final VirtualFile taskDirectory) { - String text = getTaskTextFromTask(task, taskDirectory); - if (text == null) { - myStudyToolWindow.setTaskText(EMPTY_TASK_TEXT); - return; - } - myStudyToolWindow.setTaskText(text); - } - } - - } diff --git a/python/educational-core/student/student.iml b/python/educational-core/student/student.iml index 65f1307e2b4b..72e7d83d392f 100644 --- a/python/educational-core/student/student.iml +++ b/python/educational-core/student/student.iml @@ -1,6 +1,6 @@ - + diff --git a/python/educational-python/student-python/src/com/jetbrains/edu/learning/PyStudyToolWindowConfigurator.java b/python/educational-python/student-python/src/com/jetbrains/edu/learning/PyStudyToolWindowConfigurator.java index 81d8b89c444d..7c0d4b44b387 100644 --- a/python/educational-python/student-python/src/com/jetbrains/edu/learning/PyStudyToolWindowConfigurator.java +++ b/python/educational-python/student-python/src/com/jetbrains/edu/learning/PyStudyToolWindowConfigurator.java @@ -1,11 +1,19 @@ package com.jetbrains.edu.learning; import com.intellij.openapi.actionSystem.DefaultActionGroup; +import com.intellij.openapi.fileEditor.FileEditorManager; +import com.intellij.openapi.fileEditor.FileEditorManagerEvent; +import com.intellij.openapi.fileEditor.FileEditorManagerListener; import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.containers.HashMap; import com.jetbrains.edu.courseFormat.Course; +import com.jetbrains.edu.courseFormat.Task; +import com.jetbrains.edu.courseFormat.TaskFile; import com.jetbrains.edu.learning.actions.*; +import com.jetbrains.edu.learning.ui.StudyToolWindow; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.swing.*; @@ -32,6 +40,53 @@ public class PyStudyToolWindowConfigurator implements StudyToolWindowConfigurato return new HashMap<>(); } + @Override + public FileEditorManagerListener getFileEditorManagerListener(@NotNull Project project, + @NotNull StudyToolWindow studyToolWindow) { + return new FileEditorManagerListener() { + + @Override + public void fileOpened(@NotNull FileEditorManager source, @NotNull VirtualFile file) { + Task task = getTask(file); + setTaskText(task, file.getParent()); + } + + @Override + public void fileClosed(@NotNull FileEditorManager source, @NotNull VirtualFile file) { + studyToolWindow.setTaskText(StudyBundle.message("empty.task.text")); + } + + @Override + public void selectionChanged(@NotNull FileEditorManagerEvent event) { + VirtualFile file = event.getNewFile(); + if (file != null) { + Task task = getTask(file); + setTaskText(task, file.getParent()); + } + } + + @Nullable + private Task getTask(@NotNull VirtualFile file) { + TaskFile taskFile = StudyUtils.getTaskFile(project, file); + if (taskFile != null) { + return taskFile.getTask(); + } + else { + return null; + } + } + + private void setTaskText(@Nullable final Task task, @Nullable final VirtualFile taskDirectory) { + String text = StudyUtils.getTaskTextFromTask(task, taskDirectory); + if (text == null) { + studyToolWindow.setTaskText(StudyBundle.message("empty.task.text")); + return; + } + studyToolWindow.setTaskText(text); + } + }; + } + @Override public boolean accept(@NotNull Project project) { Course course = StudyTaskManager.getInstance(project).getCourse(); diff --git a/python/educational-python/student-python/student-python.iml b/python/educational-python/student-python/student-python.iml index a86df8f4893f..4da02bccfbaa 100644 --- a/python/educational-python/student-python/student-python.iml +++ b/python/educational-python/student-python/student-python.iml @@ -1,6 +1,6 @@ - +