b5c3bd95bf2c62a29d81b0ba752af593ede41f7a
[idea/community.git] / plugins / groovy / src / org / jetbrains / plugins / groovy / refactoring / move / MoveGroovyScriptHandler.java
1 /*
2  * Copyright 2000-2009 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
17 package org.jetbrains.plugins.groovy.refactoring.move;
18
19 import com.intellij.openapi.actionSystem.DataContext;
20 import com.intellij.openapi.actionSystem.LangDataKeys;
21 import com.intellij.openapi.editor.Editor;
22 import com.intellij.openapi.project.Project;
23 import com.intellij.openapi.roots.ProjectRootManager;
24 import com.intellij.openapi.vfs.VirtualFile;
25 import com.intellij.psi.PsiClass;
26 import com.intellij.psi.PsiDirectory;
27 import com.intellij.psi.PsiElement;
28 import com.intellij.psi.PsiReference;
29 import com.intellij.refactoring.HelpID;
30 import com.intellij.refactoring.JavaRefactoringSettings;
31 import com.intellij.refactoring.move.MoveCallback;
32 import com.intellij.refactoring.move.moveClassesOrPackages.MoveClassesOrPackagesHandlerBase;
33 import com.intellij.refactoring.move.moveClassesOrPackages.MoveClassesOrPackagesImpl;
34 import com.intellij.refactoring.util.CommonRefactoringUtil;
35 import com.intellij.refactoring.util.TextOccurrencesUtil;
36 import org.jetbrains.annotations.Nullable;
37 import org.jetbrains.plugins.groovy.lang.psi.GroovyFile;
38 import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GroovyScriptClass;
39
40 import java.util.Arrays;
41
42 /**
43  * @author Maxim.Medvedev
44  */
45 public class MoveGroovyScriptHandler extends MoveClassesOrPackagesHandlerBase {
46
47   @Override
48   public PsiElement[] adjustForMove(Project project, PsiElement[] sourceElements, PsiElement targetElement) {
49     return super.adjustForMove(project, sourceElements, targetElement);
50   }
51
52   @Override
53   public boolean canMove(PsiElement[] elements, @Nullable PsiElement targetContainer) {
54     for (PsiElement element : elements) {
55       if (!canMove(element)) return false;
56     }
57     return targetContainer == null || isValidTarget(targetContainer, elements);
58   }
59
60   private static boolean canMove(PsiElement element) {
61     if (!(element instanceof GroovyFile)) return false;
62
63     final GroovyFile file = (GroovyFile)element;
64     final VirtualFile vfile = file.getVirtualFile();
65     if (vfile == null || !ProjectRootManager.getInstance(element.getProject()).getFileIndex().isInSource(vfile)) {
66       return false;
67     }
68
69     final PsiClass[] classes = file.getClasses();
70     return classes.length > 0 && classes[0] instanceof GroovyScriptClass;
71   }
72
73   @Override
74   public boolean isValidTarget(PsiElement psiElement, PsiElement[] sources) {
75     return isPackageOrDirectory(psiElement);
76   }
77
78   @Override
79   public boolean tryToMove(PsiElement element, Project project, DataContext dataContext, @Nullable PsiReference reference, Editor editor) {
80     if (canMove(element)) {
81       doMove(project, new PsiElement[]{element}, LangDataKeys.TARGET_PSI_ELEMENT.getData(dataContext), null);
82       return true;
83     }
84     return false;
85   }
86
87   @Override
88   public void doMove(final Project project, PsiElement[] elements, PsiElement initialTargetElement, final MoveCallback moveCallback) {
89     if (!CommonRefactoringUtil.checkReadOnlyStatusRecursively(project, Arrays.asList(elements), true)) {
90       return;
91     }
92
93     final String initialTargetPackageName = MoveClassesOrPackagesImpl.getInitialTargetPackageName(initialTargetElement, elements);
94     final PsiDirectory initialTargetDirectory = MoveClassesOrPackagesImpl.getInitialTargetDirectory(initialTargetElement, elements);
95     final boolean isTargetDirectoryFixed = MoveClassesOrPackagesImpl.getContainerDirectory(initialTargetElement) != null;
96
97     boolean searchTextOccurences = false;
98     for (int i = 0; i < elements.length && !searchTextOccurences; i++) {
99       PsiElement psiElement = elements[i];
100       searchTextOccurences = TextOccurrencesUtil.isSearchTextOccurencesEnabled(psiElement);
101     }
102     final MoveGroovyScriptDialog moveDialog =
103       new MoveGroovyScriptDialog(project, searchTextOccurences, elements, initialTargetElement, moveCallback);
104
105     boolean searchInComments = JavaRefactoringSettings.getInstance().MOVE_SEARCH_IN_COMMENTS;
106     boolean searchForTextOccurences = JavaRefactoringSettings.getInstance().MOVE_SEARCH_FOR_TEXT;
107     moveDialog.setData(elements, initialTargetPackageName, initialTargetDirectory, isTargetDirectoryFixed, searchInComments,
108                        searchForTextOccurences, HelpID.getMoveHelpID(elements[0]));
109     moveDialog.show();
110   }
111 }