9814a6631fe23c4d5ed1397ac4145defc18734b8
[idea/community.git] / python / educational-core / course-creator / src / com / jetbrains / edu / coursecreator / handlers / CCRenameHandler.java
1 package com.jetbrains.edu.coursecreator.handlers;
2
3 import com.intellij.ide.projectView.ProjectView;
4 import com.intellij.openapi.actionSystem.CommonDataKeys;
5 import com.intellij.openapi.actionSystem.DataContext;
6 import com.intellij.openapi.editor.Editor;
7 import com.intellij.openapi.fileEditor.ex.FileEditorManagerEx;
8 import com.intellij.openapi.project.Project;
9 import com.intellij.openapi.ui.Messages;
10 import com.intellij.openapi.util.text.StringUtil;
11 import com.intellij.openapi.vfs.VirtualFile;
12 import com.intellij.psi.PsiDirectory;
13 import com.intellij.psi.PsiElement;
14 import com.intellij.psi.PsiFile;
15 import com.intellij.refactoring.rename.RenameHandler;
16 import com.jetbrains.edu.coursecreator.CCUtils;
17 import com.jetbrains.edu.learning.StudyTaskManager;
18 import com.jetbrains.edu.learning.courseFormat.Course;
19 import com.jetbrains.edu.learning.courseFormat.StudyItem;
20 import org.jetbrains.annotations.NotNull;
21
22 public abstract class CCRenameHandler implements RenameHandler {
23   @Override
24   public boolean isAvailableOnDataContext(DataContext dataContext) {
25     PsiElement element = CommonDataKeys.PSI_ELEMENT.getData(dataContext);
26     if (element == null || !(element instanceof PsiDirectory)) {
27       return false;
28     }
29     if (!CCUtils.isCourseCreator(element.getProject())) {
30       return false;
31     }
32     VirtualFile directory = ((PsiDirectory)element).getVirtualFile();
33     return isAvailable(directory.getName());
34   }
35
36   protected abstract boolean isAvailable(String name);
37
38   @Override
39   public boolean isRenaming(DataContext dataContext) {
40     return isAvailableOnDataContext(dataContext);
41   }
42
43   @Override
44   public void invoke(@NotNull Project project, Editor editor, PsiFile file, DataContext dataContext) {
45     PsiElement element = CommonDataKeys.PSI_ELEMENT.getData(dataContext);
46     assert element != null;
47     PsiDirectory directory = (PsiDirectory)element;
48     Course course = StudyTaskManager.getInstance(project).getCourse();
49     if (course == null) {
50       return;
51     }
52     rename(project, course, directory);
53     ProjectView.getInstance(project).refresh();
54     FileEditorManagerEx managerEx = FileEditorManagerEx.getInstanceEx(project);
55     for (VirtualFile virtualFile : managerEx.getOpenFiles()) {
56       managerEx.updateFilePresentation(virtualFile);
57     }
58   }
59
60   protected abstract void rename(@NotNull Project project, @NotNull Course course, @NotNull PsiDirectory directory);
61
62
63   protected static void processRename(@NotNull final StudyItem item, String namePrefix, @NotNull final Project project) {
64     String name = item.getName();
65     String text = "Rename " + StringUtil.toTitleCase(namePrefix);
66     String newName = Messages.showInputDialog(project, text + " '" + name + "' to", text, null, name, null);
67     if (newName != null) {
68       item.setName(newName);
69     }
70   }
71
72   @Override
73   public void invoke(@NotNull Project project, @NotNull PsiElement[] elements, DataContext dataContext) {
74     invoke(project, null, null, dataContext);
75   }
76 }