blob: 2952486274cf9f39fc18b290ecf367a9708633cd [file] [log] [blame]
package com.jetbrains.python.edu.actions;
import com.intellij.codeInsight.documentation.DocumentationComponent;
import com.intellij.codeInsight.documentation.DocumentationManager;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.LogicalPosition;
import com.intellij.openapi.project.DumbAwareAction;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.popup.JBPopup;
import com.intellij.openapi.ui.popup.JBPopupFactory;
import com.intellij.openapi.util.Disposer;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.jetbrains.python.edu.StudyState;
import com.jetbrains.python.edu.StudyTaskManager;
import com.jetbrains.python.edu.StudyUtils;
import com.jetbrains.python.edu.course.Course;
import com.jetbrains.python.edu.course.TaskWindow;
import com.jetbrains.python.edu.editor.StudyEditor;
import icons.StudyIcons;
import java.io.File;
public class StudyShowHintAction extends DumbAwareAction {
public static final String ACTION_ID = "ShowHintAction";
public static final String SHORTCUT = "ctrl pressed 7";
public StudyShowHintAction() {
super("Show hint", "Show hint", StudyIcons.ShowHint);
}
public void actionPerformed(AnActionEvent e) {
final Project project = e.getProject();
if (project == null) {
return;
}
Course course = StudyTaskManager.getInstance(project).getCourse();
if (course == null) {
return;
}
StudyState studyState = new StudyState(StudyEditor.getSelectedStudyEditor(project));
if (!studyState.isValid()) {
return;
}
PsiFile file = PsiManager.getInstance(project).findFile(studyState.getVirtualFile());
final Editor editor = studyState.getEditor();
LogicalPosition pos = editor.getCaretModel().getLogicalPosition();
TaskWindow taskWindow = studyState.getTaskFile().getTaskWindow(editor.getDocument(), pos);
if (file == null || taskWindow == null) {
return;
}
String hint = taskWindow.getHint();
if (hint == null) {
return;
}
File resourceFile = new File(course.getResourcePath());
File resourceRoot = resourceFile.getParentFile();
if (resourceRoot == null || !resourceRoot.exists()) {
return;
}
File hintsDir = new File(resourceRoot, Course.HINTS_DIR);
if (hintsDir.exists()) {
String hintText = StudyUtils.getFileText(hintsDir.getAbsolutePath(), hint, true);
int offset = editor.getDocument().getLineStartOffset(pos.line) + pos.column;
PsiElement element = file.findElementAt(offset);
if (hintText == null || element == null) {
return;
}
DocumentationManager documentationManager = DocumentationManager.getInstance(project);
DocumentationComponent component = new DocumentationComponent(documentationManager);
component.setData(element, hintText, true, null);
final JBPopup popup =
JBPopupFactory.getInstance().createComponentPopupBuilder(component, component)
.setDimensionServiceKey(project, DocumentationManager.JAVADOC_LOCATION_AND_SIZE, false)
.setResizable(true)
.setMovable(true)
.setRequestFocus(true)
.createPopup();
component.setHint(popup);
popup.showInBestPositionFor(editor);
Disposer.dispose(component);
}
}
@Override
public void update(AnActionEvent e) {
StudyUtils.updateAction(e);
}
}