From 7791018a4f7227fa7592af7945e09e88a20879b1 Mon Sep 17 00:00:00 2001 From: Liana Bakradze Date: Mon, 24 Nov 2014 19:20:47 +0300 Subject: [PATCH] EDU-285 Do not allow to run current file if no sdk selected --- .../com/jetbrains/python/edu/StudyUtils.java | 8 ++++ .../python/edu/actions/StudyCheckAction.java | 44 +++++++++++++++++-- .../python/edu/actions/StudyRunAction.java | 23 ++++++---- .../python/edu/editor/StudyEditor.java | 39 +++++++++------- 4 files changed, 85 insertions(+), 29 deletions(-) diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyUtils.java b/python/edu/learn-python/src/com/jetbrains/python/edu/StudyUtils.java index 21881c629c7c..c84fbf81b7d8 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyUtils.java +++ b/python/edu/learn-python/src/com/jetbrains/python/edu/StudyUtils.java @@ -9,7 +9,9 @@ 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.ModuleManager; import com.intellij.openapi.project.Project; +import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VirtualFile; @@ -19,6 +21,7 @@ import com.intellij.util.ui.UIUtil; import com.jetbrains.python.edu.course.*; import com.jetbrains.python.edu.editor.StudyEditor; import com.jetbrains.python.edu.ui.StudyToolWindowFactory; +import com.jetbrains.python.sdk.PythonSdkType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -185,4 +188,9 @@ public class StudyUtils { FileUtil.copy(new File(pathToResource, sourceName), resourceFile); return resourceFile; } + + @Nullable + public static Sdk findPythonSdk(@NotNull final Project project) { + return PythonSdkType.findPythonSdk(ModuleManager.getInstance(project).getModules()[0]); + } } diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyCheckAction.java b/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyCheckAction.java index b5f4c003ffe8..733514de75a9 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyCheckAction.java +++ b/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyCheckAction.java @@ -12,8 +12,10 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.fileEditor.FileEditor; import com.intellij.openapi.fileEditor.FileEditorManager; +import com.intellij.openapi.options.ShowSettingsUtil; import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.project.Project; +import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.ui.MessageType; import com.intellij.openapi.ui.popup.Balloon; import com.intellij.openapi.ui.popup.BalloonBuilder; @@ -33,6 +35,8 @@ import com.jetbrains.python.edu.editor.StudyEditor; import org.jetbrains.annotations.NotNull; import javax.swing.*; +import javax.swing.event.HyperlinkEvent; +import javax.swing.event.HyperlinkListener; import java.awt.*; import java.io.IOException; import java.util.Map; @@ -41,7 +45,7 @@ public class StudyCheckAction extends DumbAwareAction { private static final Logger LOG = Logger.getInstance(StudyCheckAction.class.getName()); private static final String ANSWERS_POSTFIX = "_answers.py"; - public static final String ACTION_ID = "CheckAction"; + public static final String ACTION_ID = "CheckAction"; public static final String SHORTCUT = "ctrl alt pressed ENTER"; @@ -108,9 +112,15 @@ public class StudyCheckAction extends DumbAwareAction { VirtualFile taskDir = studyState.getTaskDir(); flushWindows(task, taskDir); StudyRunAction runAction = (StudyRunAction)ActionManager.getInstance().getAction(StudyRunAction.ACTION_ID); - if (runAction != null && taskFiles.size() == 1) { - runAction.run(project); + if (runAction == null) { + return; } + Sdk sdk = StudyUtils.findPythonSdk(project); + if (sdk == null) { + createNoPythonInterpreterPopUp(project); + return; + } + runAction.run(project, sdk); ApplicationManager.getApplication().invokeLater(new Runnable() { @Override public void run() { @@ -157,6 +167,27 @@ public class StudyCheckAction extends DumbAwareAction { }); } + private static void createNoPythonInterpreterPopUp(@NotNull final Project project) { + String text = "No Python interpreter configured for the project
Configure interpreter"; + BalloonBuilder balloonBuilder = + JBPopupFactory.getInstance().createHtmlTextBalloonBuilder(text, null, MessageType.WARNING.getPopupBackground(), new HyperlinkListener() { + @Override + public void hyperlinkUpdate(HyperlinkEvent event) { + if (event.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { + ApplicationManager.getApplication().invokeLater(new Runnable() { + @Override + public void run() { + ShowSettingsUtil.getInstance().showSettingsDialog(project, "Project Interpreter"); + } + }); + } + } + }); + balloonBuilder.setHideOnLinkClick(true); + final Balloon balloon = balloonBuilder.createBalloon(); + showCheckPopUp(project, balloon); + } + private static void navigateToFailedTaskWindow(@NotNull final StudyState studyState, @NotNull final Task task, @NotNull final VirtualFile taskDir, @@ -261,6 +292,13 @@ public class StudyCheckAction extends DumbAwareAction { BalloonBuilder balloonBuilder = JBPopupFactory.getInstance().createHtmlTextBalloonBuilder(text, null, color, null); final Balloon balloon = balloonBuilder.createBalloon(); + showCheckPopUp(project, balloon); + } + + /** + * shows pop up in the center of "check task" button in study editor + */ + private static void showCheckPopUp(@NotNull final Project project, @NotNull final Balloon balloon) { StudyEditor studyEditor = StudyEditor.getSelectedStudyEditor(project); assert studyEditor != null; JButton checkButton = studyEditor.getCheckButton(); diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyRunAction.java b/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyRunAction.java index 71e95defdedc..44bd31b5ef56 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyRunAction.java +++ b/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyRunAction.java @@ -9,18 +9,18 @@ import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.fileEditor.FileDocumentManager; -import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.vfs.VirtualFile; -import com.jetbrains.python.sdk.PythonSdkType; import com.jetbrains.python.edu.StudyResourceManger; import com.jetbrains.python.edu.StudyTaskManager; +import com.jetbrains.python.edu.StudyUtils; import com.jetbrains.python.edu.course.Task; import com.jetbrains.python.edu.course.TaskFile; import com.jetbrains.python.edu.editor.StudyEditor; +import org.jetbrains.annotations.NotNull; import java.io.File; @@ -28,7 +28,7 @@ public class StudyRunAction extends DumbAwareAction { private static final Logger LOG = Logger.getInstance(StudyRunAction.class.getName()); public static final String ACTION_ID = "StudyRunAction"; - public void run(Project project) { + public void run(@NotNull final Project project, @NotNull final Sdk sdk) { Editor selectedEditor = StudyEditor.getSelectedEditor(project); FileDocumentManager fileDocumentManager = FileDocumentManager.getInstance(); assert selectedEditor != null; @@ -37,9 +37,7 @@ public class StudyRunAction extends DumbAwareAction { if (openedFile != null && openedFile.getCanonicalPath() != null) { String filePath = openedFile.getCanonicalPath(); GeneralCommandLine cmd = new GeneralCommandLine(); - cmd.setWorkDirectory(openedFile.getParent().getCanonicalPath()); - Sdk sdk = PythonSdkType.findPythonSdk(ModuleManager.getInstance(project).getModules()[0]); - if (sdk != null) { + cmd.withWorkDirectory(openedFile.getParent().getCanonicalPath()); String pythonPath = sdk.getHomePath(); if (pythonPath != null) { cmd.setExePath(pythonPath); @@ -79,11 +77,18 @@ public class StudyRunAction extends DumbAwareAction { LOG.error(e); } } - } } } - public void actionPerformed(AnActionEvent e) { - run(e.getProject()); + public void actionPerformed(@NotNull AnActionEvent e) { + Project project = e.getProject(); + if (project == null) { + return; + } + Sdk sdk = StudyUtils.findPythonSdk(project); + if (sdk == null) { + return; + } + run(project, sdk); } } diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/editor/StudyEditor.java b/python/edu/learn-python/src/com/jetbrains/python/edu/editor/StudyEditor.java index b497b5216c26..14f932ede2f0 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/editor/StudyEditor.java +++ b/python/edu/learn-python/src/com/jetbrains/python/edu/editor/StudyEditor.java @@ -20,6 +20,7 @@ import com.intellij.openapi.fileEditor.impl.text.PsiAwareTextEditorImpl; import com.intellij.openapi.fileEditor.impl.text.TextEditorProvider; import com.intellij.openapi.keymap.KeymapUtil; import com.intellij.openapi.project.Project; +import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.Key; import com.intellij.openapi.vfs.VirtualFile; @@ -35,6 +36,7 @@ import com.intellij.util.ui.EmptyClipboardOwner; import com.intellij.util.ui.UIUtil; import com.jetbrains.python.edu.StudyDocumentListener; import com.jetbrains.python.edu.StudyTaskManager; +import com.jetbrains.python.edu.StudyUtils; import com.jetbrains.python.edu.actions.*; import com.jetbrains.python.edu.course.Task; import com.jetbrains.python.edu.course.TaskFile; @@ -209,23 +211,26 @@ public class StudyEditor implements TextEditor { myRefreshButton = addButton(taskActionsPanel, StudyRefreshTaskFileAction.ACTION_ID, AllIcons.Actions.Refresh, StudyRefreshTaskFileAction.SHORTCUT); JButton myShowHintButton = addButton(taskActionsPanel, StudyShowHintAction.ACTION_ID, StudyIcons.ShowHint, StudyShowHintAction.SHORTCUT); if (!taskFile.getTask().getUserTests().isEmpty()) { - JButton runButton = addButton(taskActionsPanel, StudyRunAction.ACTION_ID, AllIcons.General.Run, null); - runButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - StudyRunAction studyRunAction = (StudyRunAction)ActionManager.getInstance().getAction("StudyRunAction"); - studyRunAction.run(myProject); - } - }); - JButton watchInputButton = addButton(taskActionsPanel, "WatchInputAction", StudyIcons.WatchInput, null); - watchInputButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - StudyEditInputAction studyEditInputAction = - (StudyEditInputAction)ActionManager.getInstance().getAction("WatchInputAction"); - studyEditInputAction.showInput(myProject); - } - }); + final Sdk sdk = StudyUtils.findPythonSdk(myProject); + if (sdk != null) { + JButton runButton = addButton(taskActionsPanel, StudyRunAction.ACTION_ID, AllIcons.General.Run, null); + runButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + StudyRunAction studyRunAction = (StudyRunAction)ActionManager.getInstance().getAction("StudyRunAction"); + studyRunAction.run(myProject, sdk); + } + }); + JButton watchInputButton = addButton(taskActionsPanel, "WatchInputAction", StudyIcons.WatchInput, null); + watchInputButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + StudyEditInputAction studyEditInputAction = + (StudyEditInputAction)ActionManager.getInstance().getAction("WatchInputAction"); + studyEditInputAction.showInput(myProject); + } + }); + } } myCheckButton.addActionListener(new ActionListener() { @Override