get rid of task description files everywhere

This commit is contained in:
Liana.Bakradze
2017-06-23 12:55:34 +03:00
parent 585ab955d5
commit f95e36400e
14 changed files with 63 additions and 239 deletions
@@ -214,7 +214,7 @@ public class CCSubtaskEditorNotificationProvider extends EditorNotifications.Pro
if (activeSubtaskIndex > mySubtaskIndex) {
myTask.setActiveSubtaskIndex(activeSubtaskIndex - 1);
}
StudySubtaskUtils.updateUI(myProject, myTask, taskDir, true);
StudySubtaskUtils.updateUI(myProject, myTask, true);
for (VirtualFile file : FileEditorManager.getInstance(myProject).getOpenFiles()) {
EditorNotifications.getInstance(myProject).updateNotifications(file);
}
@@ -42,6 +42,7 @@ import java.util.Map;
public class CCUtils {
public static final String ANSWER_EXTENSION_DOTTED = ".answer.";
public static final String TASK_DESCRIPTION_TEXT = "Write task description here using markdown or html";
private static final Logger LOG = Logger.getInstance(CCUtils.class);
public static final String GENERATED_FILES_FOLDER = ".coursecreator";
public static final String COURSE_MODE = "Course Creator";
@@ -1,15 +1,12 @@
package com.jetbrains.edu.coursecreator.actions;
import com.intellij.ide.IdeView;
import com.intellij.ide.fileTemplates.FileTemplate;
import com.intellij.ide.fileTemplates.FileTemplateManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDirectory;
import com.intellij.util.Function;
import com.jetbrains.edu.coursecreator.settings.CCSettings;
import com.jetbrains.edu.coursecreator.CCUtils;
import com.jetbrains.edu.learning.EduPluginConfigurator;
import com.jetbrains.edu.learning.StudyUtils;
import com.jetbrains.edu.learning.core.EduNames;
import com.jetbrains.edu.learning.core.EduUtils;
import com.jetbrains.edu.learning.courseFormat.Course;
@@ -120,11 +117,7 @@ public class CCCreateTask extends CCCreateStudyItemActionBase {
return null;
}
task.setLesson(((Lesson)parentItem));
String fileName = StudyUtils.getTaskDescriptionFileName(CCSettings.getInstance().useHtmlAsDefaultTaskFormat());
FileTemplate template = FileTemplateManager.getDefaultInstance().getInternalTemplate(fileName);
if (template != null) {
task.addTaskText(fileName, template.getText());
}
task.addTaskText(task.getTaskDescriptionNameWithoutExtension(), CCUtils.TASK_DESCRIPTION_TEXT);
return task;
}
}
@@ -4,7 +4,6 @@ import com.intellij.icons.AllIcons;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.ToggleAction;
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.fileEditor.FileEditorManager;
@@ -60,27 +59,11 @@ public class CCEditTaskTextAction extends ToggleAction implements DumbAware {
StudyTaskManager.getInstance(project).setTurnEditingMode(true);
return;
}
VirtualFile taskDir = task.getTaskDir(project);
if (taskDir == null) {
StudyTaskManager.getInstance(project).setTurnEditingMode(true);
return;
}
VirtualFile taskTextFile = StudyUtils.findTaskDescriptionVirtualFile(project, taskDir);
if (taskTextFile == null) {
LOG.info("Failed to find task.html");
StudyTaskManager.getInstance(project).setTurnEditingMode(true);
return;
}
Document document = FileDocumentManager.getInstance().getDocument(taskTextFile);
if (!state) {
if (document != null) {
FileDocumentManager.getInstance().saveDocument(document);
task.addTaskText(taskTextFile.getName(), document.getText());
}
window.leaveEditingMode(project);
return;
}
window.enterEditingMode(taskTextFile, project);
window.enterEditingMode(project);
}
@Override
@@ -1,28 +1,18 @@
package com.jetbrains.edu.coursecreator.actions;
import com.intellij.ide.fileTemplates.FileTemplate;
import com.intellij.ide.fileTemplates.FileTemplateManager;
import com.intellij.ide.fileTemplates.FileTemplateUtil;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.Presentation;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.DumbAwareAction;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.io.FileUtilRt;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiManager;
import com.jetbrains.edu.coursecreator.CCUtils;
import com.jetbrains.edu.coursecreator.settings.CCSettings;
import com.jetbrains.edu.learning.EduPluginConfigurator;
import com.jetbrains.edu.learning.StudySubtaskUtils;
import com.jetbrains.edu.learning.StudyTaskManager;
import com.jetbrains.edu.learning.StudyUtils;
import com.jetbrains.edu.learning.core.EduNames;
import com.jetbrains.edu.learning.courseFormat.Course;
import com.jetbrains.edu.learning.courseFormat.Lesson;
import com.jetbrains.edu.learning.courseFormat.TaskFile;
@@ -36,7 +26,6 @@ import static com.jetbrains.edu.coursecreator.CCUtils.renameFiles;
public class CCNewSubtaskAction extends DumbAwareAction {
private static final Logger LOG = Logger.getInstance(CCNewSubtaskAction.class);
public static final String NEW_SUBTASK = "Add Subtask";
public CCNewSubtaskAction() {
@@ -82,7 +71,6 @@ public class CCNewSubtaskAction extends DumbAwareAction {
}
createTestsForNewSubtask(project, task);
int num = task.getLastSubtaskIndex() + 1;
createTaskDescriptionFile(project, taskDir, num);
StudySubtaskUtils.switchStep(project, task, num, false);
task.setLastSubtaskIndex(num);
}
@@ -99,24 +87,6 @@ public class CCNewSubtaskAction extends DumbAwareAction {
configurator.createTestsForNewSubtask(project, task);
}
private static void createTaskDescriptionFile(Project project, VirtualFile taskDir, int index) {
String taskDescriptionFileName = StudyUtils.getTaskDescriptionFileName(CCSettings.getInstance().useHtmlAsDefaultTaskFormat());
FileTemplate taskTextTemplate = FileTemplateManager.getInstance(project).getInternalTemplate(taskDescriptionFileName);
PsiDirectory taskPsiDir = PsiManager.getInstance(project).findDirectory(taskDir);
if (taskTextTemplate != null && taskPsiDir != null) {
String nextTaskTextName = FileUtil.getNameWithoutExtension(taskDescriptionFileName) +
EduNames.SUBTASK_MARKER +
index + "." +
FileUtilRt.getExtension(taskDescriptionFileName);
try {
FileTemplateUtil.createFromTemplate(taskTextTemplate, nextTaskTextName, null, taskPsiDir);
}
catch (Exception e) {
LOG.error(e);
}
}
}
@Override
public void update(AnActionEvent e) {
DataContext dataContext = e.getDataContext();
@@ -24,8 +24,8 @@ public class StudyFileEditorManagerListener implements FileEditorManagerListener
@Override
public void fileOpened(@NotNull FileEditorManager source, @NotNull VirtualFile file) {
Task task = getTask(file);
setTaskText(task, StudyUtils.getTaskDir(file));
if (task != null) {
setTaskText(task.getTaskDescription());
if (task instanceof ChoiceTask) {
final StudyChoiceVariantsPanel choicePanel = new StudyChoiceVariantsPanel((ChoiceTask)task);
myToolWindow.setBottomComponent(choicePanel);
@@ -51,7 +51,7 @@ public class StudyFileEditorManagerListener implements FileEditorManagerListener
VirtualFile file = event.getNewFile();
if (file != null) {
Task task = getTask(file);
setTaskText(task, StudyUtils.getTaskDir(file));
setTaskText(task == null ? null : task.getTaskDescription());
}
myToolWindow.setBottomComponent(null);
}
@@ -61,12 +61,11 @@ public class StudyFileEditorManagerListener implements FileEditorManagerListener
return StudyUtils.getTaskForFile(myProject, file);
}
private void setTaskText(@Nullable final Task task, @Nullable final VirtualFile taskDirectory) {
String text = StudyUtils.getTaskTextFromTask(taskDirectory, task);
private void setTaskText(@Nullable String text) {
if (text == null) {
myToolWindow.setEmptyText(myProject);
return;
}
myToolWindow.setTaskText(text, taskDirectory, myProject);
myToolWindow.setTaskText(text, myProject);
}
}
@@ -90,7 +90,7 @@ public class StudySubtaskUtils {
}
transformTestFile(project, toSubtaskIndex, taskDir);
task.setActiveSubtaskIndex(toSubtaskIndex);
updateUI(project, task, taskDir, !CCUtils.isCourseCreator(project) && navigateToTask);
updateUI(project, task, !CCUtils.isCourseCreator(project) && navigateToTask);
if (CCUtils.isCourseCreator(project)) {
updateOpenedTestFiles(project, taskDir, fromSubtaskIndex, toSubtaskIndex);
}
@@ -161,17 +161,17 @@ public class StudySubtaskUtils {
return nameWithoutExtension + EduNames.SUBTASK_MARKER + subtaskIndex + "." + extension;
}
public static void updateUI(@NotNull Project project, @NotNull Task task, VirtualFile taskDir, boolean navigateToTask) {
public static void updateUI(@NotNull Project project, @NotNull Task task, boolean navigateToTask) {
StudyCheckUtils.drawAllPlaceholders(project, task);
ProjectView.getInstance(project).refresh();
StudyToolWindow toolWindow = StudyUtils.getStudyToolWindow(project);
if (toolWindow != null) {
String text = StudyUtils.getTaskTextFromTask(taskDir, task);
String text = task.getTaskDescription();
if (text == null) {
toolWindow.setEmptyText(project);
return;
task.addTaskText(task.getTaskDescriptionNameWithoutExtension(), CCUtils.TASK_DESCRIPTION_TEXT);
text = CCUtils.TASK_DESCRIPTION_TEXT;
}
toolWindow.setTaskText(text, taskDir, project);
toolWindow.setTaskText(text, project);
}
if (navigateToTask) {
StudyNavigator.navigateToTask(project, task);
@@ -24,7 +24,6 @@ import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.fileEditor.FileEditor;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.intellij.openapi.fileEditor.ex.FileEditorManagerEx;
import com.intellij.openapi.fileEditor.impl.LoadTextUtil;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.MessageType;
@@ -49,7 +48,6 @@ import com.intellij.ui.JBColor;
import com.intellij.ui.awt.RelativePoint;
import com.intellij.ui.content.Content;
import com.intellij.util.DocumentUtil;
import com.intellij.util.ObjectUtils;
import com.intellij.util.TimeoutUtil;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.text.MarkdownUtil;
@@ -62,12 +60,8 @@ import com.jetbrains.edu.learning.courseFormat.AnswerPlaceholder;
import com.jetbrains.edu.learning.courseFormat.Course;
import com.jetbrains.edu.learning.courseFormat.Lesson;
import com.jetbrains.edu.learning.courseFormat.TaskFile;
import com.jetbrains.edu.learning.courseFormat.tasks.ChoiceTask;
import com.jetbrains.edu.learning.courseFormat.tasks.Task;
import com.jetbrains.edu.learning.courseFormat.tasks.TaskWithSubtasks;
import com.jetbrains.edu.learning.courseFormat.tasks.TheoryTask;
import com.jetbrains.edu.learning.editor.StudyEditor;
import com.jetbrains.edu.learning.stepic.EduStepikUtils;
import com.jetbrains.edu.learning.stepic.OAuthDialog;
import com.jetbrains.edu.learning.stepic.StepicUser;
import com.jetbrains.edu.learning.ui.StudyStepicUserWidget;
@@ -188,7 +182,7 @@ public class StudyUtils {
if (studyToolWindow != null) {
String taskText = getTaskText(project);
if (taskText != null) {
studyToolWindow.setTaskText(taskText, null, project);
studyToolWindow.setTaskText(taskText, project);
}
else {
LOG.warn("Task text is null");
@@ -406,93 +400,11 @@ public class StudyUtils {
return !isRenameableOrMoveable(project, course, element);
}
@Nullable
public static String getTaskTextFromTask(@Nullable final VirtualFile taskDirectory, @Nullable final Task task) {
if (task == null || task.getLesson() == null || task.getLesson().getCourse() == null) {
return null;
}
final Course course = task.getLesson().getCourse();
String text = task.getTaskDescription() != null ? task.getTaskDescription() : getTaskTextByTaskName(task, taskDirectory);
if (text == null) return null;
if (course.isAdaptive()) text = wrapAdaptiveCourseText(task, text);
return wrapTextToDisplayLatex(text);
}
@NotNull
public static String constructTaskTextFilename(@NotNull Task task, @NotNull String defaultName) {
String fileNameWithoutExtension = FileUtil.getNameWithoutExtension(defaultName);
if (task instanceof TaskWithSubtasks) {
int activeStepIndex = ((TaskWithSubtasks)task).getActiveSubtaskIndex();
fileNameWithoutExtension += EduNames.SUBTASK_MARKER + activeStepIndex;
}
return addExtension(fileNameWithoutExtension, defaultName);
}
private static String wrapAdaptiveCourseText(Task task, @NotNull String text) {
String finalText = text;
if (task instanceof TheoryTask) {
finalText += "\n\n<b>Note</b>: This theory task aims to help you solve difficult tasks. " +
"Please, read it and press \"Check\" to go further.";
}
else if (!(task instanceof ChoiceTask)) {
finalText += "\n\n<b>Note</b>: Use standard input to obtain input for the task.";
}
finalText += getFooterWithLink(task);
return finalText;
}
@NotNull
private static String getFooterWithLink(Task task) {
return
"<div class=\"footer\">" + "<a href=" + EduStepikUtils.getAdaptiveLink(task) + ">Open on Stepik</a>" + "</div>";
}
@NotNull
private static String addExtension(@NotNull String fileNameWithoutExtension, @NotNull String defaultName) {
return fileNameWithoutExtension + "." + FileUtilRt.getExtension(defaultName);
}
public static String wrapTextToDisplayLatex(String taskTextFileHtml) {
final String prefix = String.format(ourPrefix, EditorColorsManager.getInstance().getGlobalScheme().getEditorFontSize());
return prefix + taskTextFileHtml + ourPostfix;
}
@Nullable
private static String getTaskTextByTaskName(@NotNull Task task, @Nullable VirtualFile taskDirectory) {
if (taskDirectory == null) return null;
String textFromHtmlFile = getTextByTaskFileFormat(task, taskDirectory, EduNames.TASK_HTML);
if (textFromHtmlFile != null) {
return textFromHtmlFile;
}
String taskTextFromMd = getTextByTaskFileFormat(task, taskDirectory, EduNames.TASK_HTML);
return convertToHtml(taskTextFromMd);
}
@Nullable
private static String getTextByTaskFileFormat(@NotNull Task task, @NotNull VirtualFile taskDirectory, @NotNull String taskTextFileName) {
String textFilename = constructTaskTextFilename(task, taskTextFileName);
VirtualFile taskTextFile = taskDirectory.findChild(textFilename);
if (taskTextFile != null) {
return String.valueOf(LoadTextUtil.loadText(taskTextFile));
}
VirtualFile srcDir = taskDirectory.findChild(EduNames.SRC);
if (srcDir != null) {
VirtualFile taskTextSrcFile = srcDir.findChild(textFilename);
if (taskTextSrcFile != null) {
return String.valueOf(LoadTextUtil.loadText(taskTextSrcFile));
}
}
return null;
}
@Nullable
public static StudyTwitterPluginConfigurator getTwitterConfigurator(@NotNull final Project project) {
StudyTwitterPluginConfigurator[] extensions = StudyTwitterPluginConfigurator.EP_NAME.getExtensions();
@@ -506,20 +418,11 @@ public class StudyUtils {
@Nullable
public static String getTaskText(@NotNull final Project project) {
Editor editor = FileEditorManager.getInstance(project).getSelectedTextEditor();
if (editor == null) {
Task task = getCurrentTask(project);
if (task == null) {
return StudyToolWindow.EMPTY_TASK_TEXT;
}
Document document = editor.getDocument();
VirtualFile virtualFile = FileDocumentManager.getInstance().getFile(document);
if (virtualFile == null) {
return StudyToolWindow.EMPTY_TASK_TEXT;
}
final Task task = getTaskForFile(project, virtualFile);
if (task != null) {
return getTaskTextFromTask(task.getTaskDir(project), task);
}
return null;
return task.getTaskDescription();
}
@Nullable
@@ -635,9 +538,7 @@ public class StudyUtils {
return task;
}
@Nullable
public static String convertToHtml(@Nullable final String content) {
if (content == null) return null;
public static String convertToHtml(@NotNull String content) {
ArrayList<String> lines = ContainerUtil.newArrayList(content.split("\n|\r|\r\n"));
MarkdownUtil.replaceHeaders(lines);
MarkdownUtil.replaceCodeBlock(lines);
@@ -656,22 +557,6 @@ public class StudyUtils {
return fileName.contains(EduNames.TASK) && fileName.contains(EduNames.SUBTASK_MARKER);
}
@Nullable
public static VirtualFile findTaskDescriptionVirtualFile(@NotNull Project project, @NotNull VirtualFile taskDir) {
Task task = getTask(project, taskDir.getName().contains(EduNames.TASK) ? taskDir: taskDir.getParent());
if (task == null) {
return null;
}
return ObjectUtils.chooseNotNull(taskDir.findChild(constructTaskTextFilename(task, EduNames.TASK_HTML)),
taskDir.findChild(constructTaskTextFilename(task, EduNames.TASK_MD)));
}
@NotNull
public static String getTaskDescriptionFileName(final boolean useHtml) {
return useHtml ? EduNames.TASK_HTML : EduNames.TASK_MD;
}
@Nullable
public static Document getDocument(String basePath, int lessonIndex, int taskIndex, String fileName) {
String taskPath = FileUtil.join(basePath, EduNames.LESSON + lessonIndex, EduNames.TASK + taskIndex);
@@ -11,7 +11,6 @@ import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.xmlb.XmlSerializer;
import com.intellij.util.xmlb.annotations.Transient;
import com.jetbrains.edu.learning.EduPluginConfigurator;
import com.jetbrains.edu.learning.StudyUtils;
import com.jetbrains.edu.learning.checker.StudyTaskChecker;
import com.jetbrains.edu.learning.core.EduNames;
import com.jetbrains.edu.learning.courseFormat.*;
@@ -178,10 +177,10 @@ public abstract class Task implements StudyItem {
if (entry == null) {
return null;
}
return StudyUtils.convertToHtml(entry.getValue());
return entry.getValue();
}
protected String getTaskDescriptionNameWithoutExtension() {
public String getTaskDescriptionNameWithoutExtension() {
return FileUtil.getNameWithoutExtension(EduNames.TASK_HTML);
}
@@ -296,4 +295,8 @@ public abstract class Task implements StudyItem {
final Lesson lesson = getLesson();
return lesson.getTaskList().indexOf(this) + 1;
}
public void saveTaskText(String text) {
taskTexts.put(getTaskDescriptionNameWithoutExtension(), text);
}
}
@@ -23,7 +23,7 @@ public class TaskWithSubtasks extends PyCharmTask {
}
@Override
protected String getTaskDescriptionNameWithoutExtension() {
public String getTaskDescriptionNameWithoutExtension() {
return super.getTaskDescriptionNameWithoutExtension() + EduNames.SUBTASK_MARKER + myActiveSubtaskIndex;
}
@@ -405,7 +405,7 @@ public class EduAdaptiveStepicConnector {
private static void setToolWindowText(@NotNull Project project, @NotNull Task task) {
final StudyToolWindow window = StudyUtils.getStudyToolWindow(project);
if (window != null) {
window.setTaskText(StudyUtils.wrapTextToDisplayLatex(task.getTaskDescription()), task.getTaskDir(project), project);
window.setTaskText(StudyUtils.wrapTextToDisplayLatex(task.getTaskDescription()), project);
}
}
@@ -47,6 +47,6 @@ public class StudyJavaFxToolWindow extends StudyToolWindow {
@Override
public void setText(@NotNull String text) {
myBrowserWindow.loadContent(text);
myBrowserWindow.loadContent(StudyUtils.convertToHtml(text));
}
}
@@ -24,18 +24,18 @@ import com.intellij.openapi.editor.EditorFactory;
import com.intellij.openapi.editor.EditorSettings;
import com.intellij.openapi.editor.colors.EditorColorsManager;
import com.intellij.openapi.editor.ex.EditorEx;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.fileEditor.FileEditorManagerListener;
import com.intellij.openapi.fileTypes.FileTypeRegistry;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.SimpleToolWindowPanel;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.ui.JBCardLayout;
import com.intellij.ui.JBColor;
import com.intellij.ui.OnePixelSplitter;
import com.intellij.util.ui.JBUI;
import com.jetbrains.edu.coursecreator.actions.CCEditTaskTextAction;
import com.jetbrains.edu.coursecreator.settings.CCSettings;
import com.jetbrains.edu.learning.EduPluginConfigurator;
import com.jetbrains.edu.learning.StudyFileEditorManagerListener;
import com.jetbrains.edu.learning.StudyTaskManager;
@@ -44,7 +44,6 @@ import com.jetbrains.edu.learning.core.EduNames;
import com.jetbrains.edu.learning.courseFormat.Course;
import com.jetbrains.edu.learning.courseFormat.Lesson;
import com.jetbrains.edu.learning.courseFormat.StudyStatus;
import com.jetbrains.edu.learning.courseFormat.TaskFile;
import com.jetbrains.edu.learning.courseFormat.tasks.Task;
import com.jetbrains.edu.learning.courseFormat.tasks.TaskWithSubtasks;
import com.jetbrains.edu.learning.stepic.StepicAdaptiveReactionsPanel;
@@ -66,6 +65,7 @@ public abstract class StudyToolWindow extends SimpleToolWindowPanel implements D
private final OnePixelSplitter mySplitPane;
private JLabel myStatisticLabel;
private StudyProgressBar myStudyProgressBar;
private EditorEx myEditor;
public StudyToolWindow() {
super(true, true);
@@ -100,24 +100,17 @@ public abstract class StudyToolWindow extends SimpleToolWindowPanel implements D
if (isToolwindow) {
project.getMessageBus().connect().subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, new StudyFileEditorManagerListener(this, project));
if (StudyTaskManager.getInstance(project).isTurnEditingMode() ||
StudyTaskManager.getInstance(project).getToolWindowMode() == StudyToolWindowMode.EDITING) {
TaskFile file = StudyUtils.getSelectedTaskFile(project);
if (file != null) {
VirtualFile taskDir = file.getTask().getTaskDir(project);
String taskText = StudyUtils.getTaskText(project);
if (taskText != null) {
setTaskText(taskText, taskDir, project);
}
}
Task task = StudyUtils.getCurrentTask(project);
if (task == null) {
setEmptyText(project);
return;
}
else {
String taskText = StudyUtils.getTaskText(project);
if (taskText != null) {
setTaskText(taskText, null, project);
}
String taskDescription = task.getTaskDescription();
if (taskDescription == null) {
setEmptyText(project);
return;
}
setTaskText(taskDescription, project);
}
}
@@ -188,19 +181,13 @@ public abstract class StudyToolWindow extends SimpleToolWindowPanel implements D
return group;
}
public void setTaskText(@NotNull String text, @Nullable VirtualFile taskDirectory, @NotNull Project project) {
if (!EMPTY_TASK_TEXT.equals(text) && StudyTaskManager.getInstance(project).isTurnEditingMode()) {
if (taskDirectory == null) {
LOG.info("Failed to enter editing mode for StudyToolWindow");
return;
}
VirtualFile taskTextFile = StudyUtils.findTaskDescriptionVirtualFile(project, taskDirectory);
enterEditingMode(taskTextFile, project);
public void setTaskText(@NotNull String text, @NotNull Project project) {
if (StudyTaskManager.getInstance(project).isTurnEditingMode()) {
enterEditingMode(project);
StudyTaskManager.getInstance(project).setTurnEditingMode(false);
}
if (taskDirectory != null && StudyTaskManager.getInstance(project).getToolWindowMode() == StudyToolWindowMode.EDITING) {
VirtualFile taskTextFile = StudyUtils.findTaskDescriptionVirtualFile(project, taskDirectory);
enterEditingMode(taskTextFile, project);
if (StudyTaskManager.getInstance(project).getToolWindowMode() == StudyToolWindowMode.EDITING) {
enterEditingMode(project);
}
else {
setText(text);
@@ -218,7 +205,7 @@ public abstract class StudyToolWindow extends SimpleToolWindowPanel implements D
mySplitPane.setFirstComponent(myContentPanel);
StudyTaskManager.getInstance(project).setTurnEditingMode(true);
}
setTaskText(EMPTY_TASK_TEXT, null, project);
setTaskText(EMPTY_TASK_TEXT, project);
}
public enum StudyToolWindowMode {
@@ -226,23 +213,26 @@ public abstract class StudyToolWindow extends SimpleToolWindowPanel implements D
}
public void enterEditingMode(VirtualFile taskFile, Project project) {
public void enterEditingMode(Project project) {
Task task = StudyUtils.getCurrentTask(project);
assert task != null;
String taskDescription = task.getTaskDescription();
final EditorFactory factory = EditorFactory.getInstance();
Document document = FileDocumentManager.getInstance().getDocument(taskFile);
if (document == null) {
return;
}
Document document = factory.createDocument(taskDescription);
WebBrowserManager.getInstance().setShowBrowserHover(false);
final EditorEx createdEditor = (EditorEx)factory.createEditor(document, project, taskFile, false);
String extension = CCSettings.getInstance().useHtmlAsDefaultTaskFormat() ? "html" : "md";
myEditor = (EditorEx)factory.createEditor(document, project, FileTypeRegistry.getInstance().getFileTypeByExtension(extension), false);
Disposer.register(project, new Disposable() {
public void dispose() {
factory.releaseEditor(createdEditor);
if (!myEditor.isDisposed()) {
factory.releaseEditor(myEditor);
}
}
});
JComponent editorComponent = createdEditor.getComponent();
JComponent editorComponent = myEditor.getComponent();
editorComponent.setBorder(new EmptyBorder(10, 20, 0, 10));
editorComponent.setBackground(EditorColorsManager.getInstance().getGlobalScheme().getDefaultBackground());
EditorSettings editorSettings = createdEditor.getSettings();
EditorSettings editorSettings = myEditor.getSettings();
editorSettings.setLineMarkerAreaShown(false);
editorSettings.setLineNumbersShown(false);
editorSettings.setFoldingOutlineShown(false);
@@ -254,6 +244,10 @@ public abstract class StudyToolWindow extends SimpleToolWindowPanel implements D
public void leaveEditingMode(Project project) {
Task task = StudyUtils.getCurrentTask(project);
assert task != null;
task.saveTaskText(myEditor.getDocument().getText());
EditorFactory.getInstance().releaseEditor(myEditor);
WebBrowserManager.getInstance().setShowBrowserHover(true);
mySplitPane.setFirstComponent(myContentPanel);
StudyTaskManager.getInstance(project).setToolWindowMode(StudyToolWindowMode.TEXT);
@@ -18,7 +18,6 @@ import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiManager;
import com.intellij.util.PathUtil;
import com.jetbrains.edu.coursecreator.settings.CCSettings;
import com.jetbrains.edu.learning.checker.PyStudyTaskChecker;
import com.jetbrains.edu.learning.checker.StudyTaskChecker;
import com.jetbrains.edu.learning.core.EduNames;
@@ -72,9 +71,6 @@ public class PyEduPluginConfigurator implements EduPluginConfigurator {
@NotNull PsiDirectory taskDirectory) {
StudyUtils.createFromTemplate(project, taskDirectory, "task.py", view, false);
StudyUtils.createFromTemplate(project, taskDirectory, TESTS_PY, view, false);
StudyUtils.createFromTemplate(project, taskDirectory,
StudyUtils.getTaskDescriptionFileName(CCSettings.getInstance().useHtmlAsDefaultTaskFormat()), view,
false);
}
@Override