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