do not use old service
[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.vfs.VirtualFile;
21 import com.intellij.psi.PsiDirectory;
22 import com.intellij.psi.PsiElement;
23 import com.intellij.psi.PsiFile;
24 import com.intellij.refactoring.listeners.RefactoringElementAdapter;
25 import com.intellij.refactoring.listeners.RefactoringElementListener;
26 import com.intellij.refactoring.listeners.RefactoringElementListenerProvider;
27 import com.jetbrains.edu.learning.StudyTaskManager;
28 import com.jetbrains.edu.learning.StudyUtils;
29 import com.jetbrains.edu.learning.core.EduNames;
30 import com.jetbrains.edu.learning.courseFormat.Course;
31 import com.jetbrains.edu.learning.courseFormat.Lesson;
32 import com.jetbrains.edu.learning.courseFormat.Task;
33 import com.jetbrains.edu.learning.courseFormat.TaskFile;
34 import org.jetbrains.annotations.NotNull;
35 import org.jetbrains.annotations.Nullable;
36
37 import java.io.IOException;
38 import java.util.Map;
39
40 public class CCRefactoringElementListenerProvider implements RefactoringElementListenerProvider {
41   private static final Logger LOG = Logger.getInstance(CCRefactoringElementListenerProvider.class);
42
43   @Nullable
44   @Override
45   public RefactoringElementListener getListener(PsiElement element) {
46     return new CCRenameListener(element);
47   }
48
49
50   static class CCRenameListener extends RefactoringElementAdapter {
51
52     private String myElementName;
53
54     public CCRenameListener(PsiElement element) {
55       if (element instanceof PsiFile) {
56         PsiFile psiFile = (PsiFile)element;
57         myElementName = psiFile.getName();
58       }
59     }
60
61     @Override
62     protected void elementRenamedOrMoved(@NotNull PsiElement newElement) {
63       if (newElement instanceof PsiFile && myElementName != null) {
64         PsiFile psiFile = (PsiFile)newElement;
65         tryToRenameTaskFile(psiFile, myElementName);
66       }
67     }
68
69     private static void tryToRenameTaskFile(PsiFile file, String oldName) {
70       final PsiDirectory taskDir = file.getContainingDirectory();
71       Course course = StudyTaskManager.getInstance(file.getProject()).getCourse();
72       if (course == null) {
73         return;
74       }
75       if (taskDir == null || !taskDir.getName().contains(EduNames.TASK)) {
76         return;
77       }
78       PsiDirectory lessonDir = taskDir.getParent();
79       if (lessonDir == null || !lessonDir.getName().contains(EduNames.LESSON)) {
80         return;
81       }
82       Lesson lesson = course.getLesson(lessonDir.getName());
83       if (lesson == null) {
84         return;
85       }
86       Task task = lesson.getTask(taskDir.getName());
87       if (task == null) {
88         return;
89       }
90       Map<String, TaskFile> taskFiles = task.getTaskFiles();
91       TaskFile taskFile = task.getTaskFile(oldName);
92       if (taskFile == null) {
93         return;
94       }
95       ApplicationManager.getApplication().runWriteAction(new Runnable() {
96         @Override
97         public void run() {
98           VirtualFile patternFile = StudyUtils.getPatternFile(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
110       taskFiles.remove(oldName);
111       taskFiles.put(file.getName(), taskFile);
112       CCUtils.createResourceFile(file.getVirtualFile(), course, taskDir.getVirtualFile());
113     }
114
115     @Override
116     public void undoElementMovedOrRenamed(@NotNull PsiElement newElement, @NotNull String oldQualifiedName) {
117
118     }
119   }
120 }