2 * Copyright 2000-2009 JetBrains s.r.o.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 package org.jetbrains.plugins.groovy.refactoring.move;
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;
41 import java.util.Arrays;
44 * @author Maxim.Medvedev
46 public class MoveGroovyScriptHandler extends MoveClassesOrPackagesHandlerBase {
49 public PsiElement[] adjustForMove(Project project, PsiElement[] sourceElements, PsiElement targetElement) {
50 return super.adjustForMove(project, sourceElements, targetElement);
54 public boolean canMove(PsiElement[] elements, @Nullable PsiElement targetContainer) {
55 for (PsiElement element : elements) {
56 if (!canMove(element)) return false;
58 return targetContainer == null || isValidTarget(targetContainer, elements);
61 private static boolean canMove(PsiElement element) {
62 if (!(element instanceof GroovyFile)) return false;
64 final GroovyFile file = (GroovyFile)element;
65 final VirtualFile vfile = file.getVirtualFile();
66 if (vfile == null || !ProjectRootManager.getInstance(element.getProject()).getFileIndex().isInSource(vfile)) {
70 final PsiClass[] classes = file.getClasses();
71 return classes.length > 0 && classes[0] instanceof GroovyScriptClass;
75 public boolean isValidTarget(PsiElement psiElement, PsiElement[] sources) {
76 return isPackageOrDirectory(psiElement);
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);
89 public void doMove(final Project project, PsiElement[] elements, PsiElement initialTargetElement, final MoveCallback moveCallback) {
90 if (!CommonRefactoringUtil.checkReadOnlyStatusRecursively(project, Arrays.asList(elements), true)) {
94 final String initialTargetPackageName = MoveClassesOrPackagesImpl.getInitialTargetPackageName(initialTargetElement, elements);
95 final PsiDirectory initialTargetDirectory = MoveClassesOrPackagesImpl.getInitialTargetDirectory(initialTargetElement, elements);
96 final boolean isTargetDirectoryFixed = MoveClassesOrPackagesImpl.getContainerDirectory(initialTargetElement) != null;
98 boolean searchTextOccurences = false;
99 for (int i = 0; i < elements.length && !searchTextOccurences; i++) {
100 PsiElement psiElement = elements[i];
101 searchTextOccurences = TextOccurrencesUtil.isSearchTextOccurencesEnabled(psiElement);
103 final MoveGroovyScriptDialog moveDialog =
104 new MoveGroovyScriptDialog(project, searchTextOccurences, elements, initialTargetElement, moveCallback);
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]));