EDU-273 Autocompletion for local *.py files in import

This commit is contained in:
Liana Bakradze
2014-11-25 13:18:42 +03:00
parent 14811c759a
commit 3ab0df07f2
5 changed files with 54 additions and 18 deletions
@@ -164,7 +164,7 @@ public class StudyDirectoryProjectGenerator extends PythonProjectGenerator imple
Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create();
final Course course = gson.fromJson(reader, Course.class);
course.init(false);
course.create(baseDir, new File(mySelectedCourseFile.getParent()));
course.create(baseDir, new File(mySelectedCourseFile.getParent()), project);
course.setResourcePath(mySelectedCourseFile.getAbsolutePath());
VirtualFileManager.getInstance().refreshWithoutFileWatcher(true);
StudyTaskManager.getInstance(project).setCourse(course);
@@ -1,6 +1,7 @@
package com.jetbrains.python.edu;
import com.intellij.ide.SaveAndSyncHandlerImpl;
import com.intellij.ide.projectView.actions.MarkRootActionBase;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.Presentation;
import com.intellij.openapi.application.ApplicationManager;
@@ -9,9 +10,14 @@ import com.intellij.openapi.editor.Document;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.fileEditor.FileEditor;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.module.ModuleUtilCore;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.roots.ContentEntry;
import com.intellij.openapi.roots.ModifiableRootModel;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VirtualFile;
@@ -30,6 +36,7 @@ import java.util.Collection;
public class StudyUtils {
private static final Logger LOG = Logger.getInstance(StudyUtils.class.getName());
public static void closeSilently(Closeable stream) {
if (stream != null) {
try {
@@ -58,7 +65,7 @@ public class StudyUtils {
@Nullable
public static String getFileText(String parentDir, String fileName, boolean wrapHTML) {
File inputFile = parentDir !=null ? new File(parentDir, fileName) : new File(fileName);
File inputFile = parentDir != null ? new File(parentDir, fileName) : new File(fileName);
if (!inputFile.exists()) return null;
StringBuilder taskText = new StringBuilder();
BufferedReader reader = null;
@@ -99,12 +106,14 @@ public class StudyUtils {
}
public static void updateStudyToolWindow(Project project) {
ToolWindowManager.getInstance(project).getToolWindow(StudyToolWindowFactory.STUDY_TOOL_WINDOW).getContentManager().removeAllContents(false);
StudyToolWindowFactory factory = new StudyToolWindowFactory();
factory.createToolWindowContent(project, ToolWindowManager.getInstance(project).getToolWindow(StudyToolWindowFactory.STUDY_TOOL_WINDOW));
ToolWindowManager.getInstance(project).getToolWindow(StudyToolWindowFactory.STUDY_TOOL_WINDOW).getContentManager()
.removeAllContents(false);
StudyToolWindowFactory factory = new StudyToolWindowFactory();
factory
.createToolWindowContent(project, ToolWindowManager.getInstance(project).getToolWindow(StudyToolWindowFactory.STUDY_TOOL_WINDOW));
}
public static void synchronize() {
public static void synchronize() {
FileDocumentManager.getInstance().saveAllDocuments();
SaveAndSyncHandlerImpl.refreshOpenFiles();
VirtualFileManager.getInstance().refreshWithoutFileWatcher(true);
@@ -156,7 +165,7 @@ public class StudyUtils {
});
}
catch (IOException e) {
LOG.error(e);
LOG.error(e);
}
finally {
closeSilently(printWriter);
@@ -193,4 +202,26 @@ public class StudyUtils {
public static Sdk findPythonSdk(@NotNull final Project project) {
return PythonSdkType.findPythonSdk(ModuleManager.getInstance(project).getModules()[0]);
}
public static void markDirAsSourceRoot(@NotNull final VirtualFile dir, @NotNull final Project project) {
final Module module = ModuleUtilCore.findModuleForFile(dir, project);
if (module == null) {
LOG.info("Module for " + dir.getPath() + " was not found");
return;
}
final ModifiableRootModel model = ModuleRootManager.getInstance(module).getModifiableModel();
ContentEntry entry = MarkRootActionBase.findContentEntry(model, dir);
if (entry == null) {
LOG.info("Content entry for " + dir.getPath() + " was not found");
return;
}
entry.addSourceFolder(dir, false);
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@Override
public void run() {
model.commit();
module.getProject().save();
}
});
}
}
@@ -2,6 +2,7 @@ package com.jetbrains.python.edu.course;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
@@ -48,7 +49,8 @@ public class Course {
* @param baseDir project directory
* @param resourceRoot directory where original course is stored
*/
public void create(@NotNull final VirtualFile baseDir, @NotNull final File resourceRoot) {
public void create(@NotNull final VirtualFile baseDir, @NotNull final File resourceRoot,
@NotNull final Project project) {
ApplicationManager.getApplication().invokeLater(
new Runnable() {
@Override
@@ -60,16 +62,16 @@ public class Course {
for (int i = 0; i < lessons.size(); i++) {
Lesson lesson = lessons.get(i);
lesson.setIndex(i);
lesson.create(baseDir, resourceRoot);
lesson.create(baseDir, resourceRoot, project);
}
baseDir.createChildDirectory(this, SANDBOX_DIR);
File[] files = resourceRoot.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return !name.contains(Lesson.LESSON_DIR) && !name.equals("course.json") && !name.equals("hints");
return !name.contains(Lesson.LESSON_DIR) && !name.equals("course.json") && !name.equals("hints");
}
});
for (File file: files) {
for (File file : files) {
FileUtil.copy(file, new File(baseDir.getPath(), file.getName()));
}
}
@@ -1,5 +1,6 @@
package com.jetbrains.python.edu.course;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.xmlb.annotations.Transient;
import org.jetbrains.annotations.NotNull;
@@ -9,7 +10,7 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class Lesson implements Stateful{
public class Lesson implements Stateful {
public String name;
public List<Task> taskList = new ArrayList<Task>();
private Course myCourse = null;
@@ -59,13 +60,14 @@ public class Lesson implements Stateful{
* @param resourceRoot directory where original lesson stored
* @throws java.io.IOException
*/
public void create(@NotNull final VirtualFile courseDir, @NotNull final File resourceRoot) throws IOException {
public void create(@NotNull final VirtualFile courseDir, @NotNull final File resourceRoot,
@NotNull final Project project) throws IOException {
String lessonDirName = LESSON_DIR + Integer.toString(myIndex + 1);
VirtualFile lessonDir = courseDir.createChildDirectory(this, lessonDirName);
for (int i = 0; i < taskList.size(); i++) {
Task task = taskList.get(i);
task.setIndex(i);
task.create(lessonDir, new File(resourceRoot, lessonDir.getName()));
task.create(lessonDir, new File(resourceRoot, lessonDir.getName()), project);
}
}
@@ -4,9 +4,9 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.xmlb.annotations.Transient;
import com.jetbrains.python.edu.StudyUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import com.jetbrains.python.edu.StudyUtils;
import java.io.File;
import java.io.IOException;
@@ -18,7 +18,7 @@ import java.util.Map;
/**
* Implementation of task which contains task files, tests, input file for tests
*/
public class Task implements Stateful{
public class Task implements Stateful {
public static final String TASK_DIR = "task";
private static final String ourTestFile = "tests.py";
public String name;
@@ -85,8 +85,10 @@ public class Task implements Stateful{
* @param resourceRoot directory where original task file stored
* @throws java.io.IOException
*/
public void create(@NotNull final VirtualFile lessonDir, @NotNull final File resourceRoot) throws IOException {
public void create(@NotNull final VirtualFile lessonDir, @NotNull final File resourceRoot,
@NotNull final Project project) throws IOException {
VirtualFile taskDir = lessonDir.createChildDirectory(this, TASK_DIR + Integer.toString(myIndex + 1));
StudyUtils.markDirAsSourceRoot(taskDir, project);
File newResourceRoot = new File(resourceRoot, taskDir.getName());
int i = 0;
for (Map.Entry<String, TaskFile> taskFile : taskFiles.entrySet()) {
@@ -197,5 +199,4 @@ public class Task implements Stateful{
}
return null;
}
}