75634c0a9026fd21468fae82742f580d9ffc0082
[idea/community.git] / python / educational-core / course-creator / src / com / jetbrains / edu / coursecreator / CCRefactoringElementListenerProvider.java
1 /*
2  * Copyright 2000-2014 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.jetbrains.edu.coursecreator;
17
18 import com.intellij.openapi.application.ApplicationManager;
19 import com.intellij.openapi.diagnostic.Logger;
20 import com.intellij.openapi.project.Project;
21 import com.intellij.openapi.vfs.VirtualFile;
22 import com.intellij.psi.PsiDirectory;
23 import com.intellij.psi.PsiElement;
24 import com.intellij.psi.PsiFile;
25 import com.intellij.refactoring.listeners.RefactoringElementAdapter;
26 import com.intellij.refactoring.listeners.RefactoringElementListener;
27 import com.intellij.refactoring.listeners.RefactoringElementListenerProvider;
28 import com.jetbrains.edu.learning.StudyTaskManager;
29 import com.jetbrains.edu.learning.StudyUtils;
30 import com.jetbrains.edu.learning.core.EduNames;
31 import com.jetbrains.edu.learning.courseFormat.Course;
32 import com.jetbrains.edu.learning.courseFormat.Lesson;
33 import com.jetbrains.edu.learning.courseFormat.Task;
34 import com.jetbrains.edu.learning.courseFormat.TaskFile;
35 import org.jetbrains.annotations.NotNull;
36 import org.jetbrains.annotations.Nullable;
37
38 import java.io.IOException;
39 import java.util.Map;
40
41 public class CCRefactoringElementListenerProvider implements RefactoringElementListenerProvider {
42   private static final Logger LOG = Logger.getInstance(CCRefactoringElementListenerProvider.class);
43
44   @Nullable
45   @Override
46   public RefactoringElementListener getListener(PsiElement element) {
47     return new CCRenameListener(element);
48   }
49
50
51   static class CCRenameListener extends RefactoringElementAdapter {
52
53     private String myElementName;
54
55     public CCRenameListener(PsiElement element) {
56       if (element instanceof PsiFile) {
57         PsiFile psiFile = (PsiFile)element;
58         myElementName = psiFile.getName();
59       }
60     }
61
62     @Override
63     protected void elementRenamedOrMoved(@NotNull PsiElement newElement) {
64       if (newElement instanceof PsiFile && myElementName != null) {
65         PsiFile psiFile = (PsiFile)newElement;
66         tryToRenameTaskFile(psiFile, myElementName);
67       }
68     }
69
70     private static void tryToRenameTaskFile(PsiFile file, String oldName) {
71       final PsiDirectory taskDir = file.getContainingDirectory();
72       final Project project = file.getProject();
73       Course course = StudyTaskManager.getInstance(project).getCourse();
74       if (course == null) {
75         return;
76       }
77       if (taskDir == null || !taskDir.getName().contains(EduNames.TASK)) {
78         return;
79       }
80       PsiDirectory lessonDir = taskDir.getParent();
81       if (lessonDir == null || !lessonDir.getName().contains(EduNames.LESSON)) {
82         return;
83       }
84       Lesson lesson = course.getLesson(lessonDir.getName());
85       if (lesson == null) {
86         return;
87       }
88       Task task = lesson.getTask(taskDir.getName());
89       if (task == null) {
90         return;
91       }
92       Map<String, TaskFile> taskFiles = task.getTaskFiles();
93       TaskFile taskFile = task.getTaskFile(oldName);
94       if (taskFile == null) {
95         return;
96       }
97       ApplicationManager.getApplication().runWriteAction(() -> {
98         VirtualFile patternFile = StudyUtils.getPatternFile(project, taskFile, oldName);
99         if (patternFile != null) {
100           try {
101             patternFile.delete(CCRefactoringElementListenerProvider.class);
102           }
103           catch (IOException e) {
104             LOG.info(e);
105           }
106         }
107       });
108
109       taskFiles.remove(oldName);
110       taskFiles.put(file.getName(), taskFile);
111       CCUtils.createResourceFile(file.getVirtualFile(), course, taskDir.getVirtualFile());
112     }
113
114     @Override
115     public void undoElementMovedOrRenamed(@NotNull PsiElement newElement, @NotNull String oldQualifiedName) {
116
117     }
118   }
119 }