PY-6637 Extract helper superclass PyBaseRefactoringAction
[idea/community.git] / python / src / com / jetbrains / python / refactoring / convertModulePackage / PyConvertModuleToPackageAction.java
1 package com.jetbrains.python.refactoring.convertModulePackage;
2
3 import com.google.common.annotations.VisibleForTesting;
4 import com.intellij.openapi.actionSystem.DataContext;
5 import com.intellij.openapi.command.WriteCommandAction;
6 import com.intellij.openapi.diagnostic.Logger;
7 import com.intellij.openapi.editor.Editor;
8 import com.intellij.openapi.project.Project;
9 import com.intellij.openapi.vfs.VirtualFile;
10 import com.intellij.psi.PsiElement;
11 import com.intellij.psi.PsiFile;
12 import com.intellij.refactoring.RefactoringActionHandler;
13 import com.jetbrains.python.PyNames;
14 import com.jetbrains.python.psi.PyFile;
15 import com.jetbrains.python.psi.PyUtil;
16 import org.jetbrains.annotations.NotNull;
17 import org.jetbrains.annotations.Nullable;
18
19 import java.io.IOException;
20
21 /**
22  * @author Mikhail Golubev
23  */
24 public class PyConvertModuleToPackageAction extends PyBaseConvertModulePackageAction {
25   public static final String ID = "py.refactoring.convert.module.to.package";
26   private static final Logger LOG = Logger.getInstance(PyConvertModuleToPackageAction.class);
27
28   @Override
29   protected boolean isEnabledOnElements(@NotNull PsiElement[] elements) {
30     if (elements.length == 1) {
31       return elements[0] instanceof PyFile && !PyUtil.isPackage((PyFile)elements[0]);
32     }
33     return false;
34   }
35
36   @Nullable
37   @Override
38   protected RefactoringActionHandler getHandler(@NotNull DataContext dataContext) {
39     return new RefactoringActionHandler() {
40       @Override
41       public void invoke(@NotNull Project project, Editor editor, PsiFile file, DataContext dataContext) {
42         createPackageFromModule((PyFile)file);
43       }
44
45       @Override
46       public void invoke(@NotNull Project project, @NotNull PsiElement[] elements, DataContext dataContext) {
47         createPackageFromModule(((PyFile)elements[0]));
48       }
49     };
50   }
51
52   @VisibleForTesting
53   public void createPackageFromModule(@NotNull final PyFile file) {
54     final VirtualFile vFile = file.getVirtualFile();
55     final VirtualFile parentDir = vFile.getParent();
56     final String newPackageName = vFile.getNameWithoutExtension();
57     final VirtualFile existing = parentDir.findChild(newPackageName);
58     if (existing != null) {
59       showFileExistsErrorMessage(existing, ID, file.getProject());
60       return;
61     }
62     WriteCommandAction.runWriteCommandAction(file.getProject(), new Runnable() {
63       public void run() {
64         try {
65           final VirtualFile packageDir = parentDir.createChildDirectory(PyConvertModuleToPackageAction.this, newPackageName);
66           vFile.move(PyConvertModuleToPackageAction.this, packageDir);
67           vFile.rename(PyConvertModuleToPackageAction.this, PyNames.INIT_DOT_PY);
68         }
69         catch (IOException e) {
70           LOG.error(e);
71         }
72       }
73     });
74   }
75 }