/* * Copyright 2000-2009 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.intellij.refactoring.move.moveClassesOrPackages; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.refactoring.PackageWrapper; import com.intellij.refactoring.util.RefactoringUtil; import com.intellij.usageView.UsageInfo; import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.Nullable; import java.util.Collection; /** * @author dsl */ public class MultipleRootsMoveDestination extends AutocreatingMoveDestination { private static final Logger LOG = Logger.getInstance( "#com.intellij.refactoring.move.moveClassesOrPackages.MultipleRootsMoveDestination"); public MultipleRootsMoveDestination(PackageWrapper aPackage) { super(aPackage); } public PackageWrapper getTargetPackage() { return myPackage; } public PsiDirectory getTargetDirectory(PsiDirectory source) throws IncorrectOperationException { //if (JavaDirectoryService.getInstance().isSourceRoot(source)) return null; return getOrCreateDirectoryForSource(source.getVirtualFile()); } public PsiDirectory getTargetDirectory(PsiFile source) throws IncorrectOperationException { return getOrCreateDirectoryForSource(source.getVirtualFile()); } public PsiDirectory getTargetIfExists(PsiFile source) { return findTargetDirectoryForSource(source.getVirtualFile()); } public String verify(PsiFile source) { VirtualFile virtualFile = source.getVirtualFile(); if (virtualFile.isDirectory()) { virtualFile = virtualFile.getParent(); LOG.assertTrue(virtualFile.isDirectory()); } final VirtualFile sourceRootForFile = myFileIndex.getSourceRootForFile(virtualFile); if (sourceRootForFile == null) { return ""; } return checkCanCreateInSourceRoot(sourceRootForFile); } @Nullable public String verify(PsiDirectory source) { VirtualFile virtualFile = source.getVirtualFile(); final VirtualFile sourceRootForFile = myFileIndex.getSourceRootForFile(virtualFile); if (sourceRootForFile == null) { return ""; } if (virtualFile.equals(sourceRootForFile)) return null; return checkCanCreateInSourceRoot(sourceRootForFile); } @Nullable public String verify(PsiPackage source) { PsiDirectory[] directories = source.getDirectories(); for (final PsiDirectory directory : directories) { String s = verify(directory); if (s != null) return s; } return null; } public void analyzeModuleConflicts(final Collection<PsiElement> elements, MultiMap<PsiElement,String> conflicts, final UsageInfo[] usages) { } @Override public boolean isTargetAccessible(Project project, VirtualFile place) { return true; } public PsiDirectory getTargetIfExists(PsiDirectory source) { return findTargetDirectoryForSource(source.getVirtualFile()); } private PsiDirectory findTargetDirectoryForSource(final VirtualFile file) { final VirtualFile sourceRoot = myFileIndex.getSourceRootForFile(file); LOG.assertTrue(sourceRoot != null); return RefactoringUtil.findPackageDirectoryInSourceRoot(myPackage, sourceRoot); } private PsiDirectory getOrCreateDirectoryForSource(final VirtualFile file) throws IncorrectOperationException { final VirtualFile sourceRoot = myFileIndex.getSourceRootForFile(file); LOG.assertTrue(sourceRoot != null, file.getPath()); return RefactoringUtil.createPackageDirectoryInSourceRoot(myPackage, sourceRoot); } }