IDEADEV-40480
[fedora-idea.git] / java / java-impl / src / com / intellij / ide / JavaFilePasteProvider.java
blob8d06f88d361d53074c6e55022cbf7280ee57195b
1 package com.intellij.ide;
3 import com.intellij.lang.StdLanguages;
4 import com.intellij.openapi.actionSystem.DataContext;
5 import com.intellij.openapi.actionSystem.DataKeys;
6 import com.intellij.openapi.application.ApplicationManager;
7 import com.intellij.openapi.command.CommandProcessor;
8 import com.intellij.openapi.editor.Document;
9 import com.intellij.openapi.fileEditor.OpenFileDescriptor;
10 import com.intellij.openapi.ide.CopyPasteManager;
11 import com.intellij.openapi.project.Project;
12 import com.intellij.openapi.util.TextRange;
13 import com.intellij.psi.*;
14 import com.intellij.psi.codeStyle.CodeStyleManager;
15 import com.intellij.util.IncorrectOperationException;
16 import org.jetbrains.annotations.Nullable;
18 import java.awt.datatransfer.DataFlavor;
19 import java.awt.datatransfer.Transferable;
21 /**
22 * @author yole
24 public class JavaFilePasteProvider implements PasteProvider {
25 public void performPaste(final DataContext dataContext) {
26 final Project project = DataKeys.PROJECT.getData(dataContext);
27 final IdeView ideView = DataKeys.IDE_VIEW.getData(dataContext);
28 if (project == null || ideView == null) return;
29 final PsiJavaFile javaFile = createJavaFileFromClipboardContent(project);
30 if (javaFile == null) return;
31 final PsiClass[] classes = javaFile.getClasses();
32 if (classes.length != 1) return;
33 final PsiDirectory targetDir = ideView.getOrChooseDirectory();
34 if (targetDir == null) return;
35 ApplicationManager.getApplication().runWriteAction(new Runnable() {
36 public void run() {
37 PsiFile file;
38 try {
39 file = targetDir.createFile(classes[0].getName() + ".java");
41 catch (IncorrectOperationException e) {
42 return;
44 final Document document = PsiDocumentManager.getInstance(project).getDocument(file);
45 document.setText(javaFile.getText());
46 PsiDocumentManager.getInstance(project).commitDocument(document);
47 if (file instanceof PsiJavaFile) {
48 updatePackageStatement((PsiJavaFile) file, targetDir);
50 new OpenFileDescriptor(project, file.getVirtualFile()).navigate(true);
52 });
55 private static void updatePackageStatement(final PsiJavaFile javaFile, final PsiDirectory targetDir) {
56 final PsiPackage aPackage = JavaDirectoryService.getInstance().getPackage(targetDir);
57 if (aPackage == null) return;
58 final PsiPackageStatement oldStatement = javaFile.getPackageStatement();
59 final Project project = javaFile.getProject();
60 if ((oldStatement != null && !oldStatement.getPackageName().equals(aPackage.getQualifiedName()) ||
61 (oldStatement == null && aPackage.getQualifiedName().length() > 0))) {
62 CommandProcessor.getInstance().executeCommand(project, new Runnable() {
63 public void run() {
64 try {
65 PsiElementFactory factory = JavaPsiFacade.getInstance(project).getElementFactory();
66 final PsiPackageStatement newStatement = factory.createPackageStatement(aPackage.getQualifiedName());
67 if (oldStatement != null) {
68 oldStatement.replace(newStatement);
70 else {
71 final PsiElement addedStatement = javaFile.addAfter(newStatement, null);
72 final TextRange textRange = addedStatement.getTextRange();
73 // ensure line break is added after the statement
74 CodeStyleManager.getInstance(project).reformatRange(javaFile, textRange.getStartOffset(), textRange.getEndOffset()+1);
77 catch (IncorrectOperationException e) {
78 // ignore
81 }, "Updating package statement", null);
85 public boolean isPastePossible(final DataContext dataContext) {
86 return true;
89 public boolean isPasteEnabled(final DataContext dataContext) {
90 final Project project = DataKeys.PROJECT.getData(dataContext);
91 final IdeView ideView = DataKeys.IDE_VIEW.getData(dataContext);
92 if (project == null || ideView == null || ideView.getDirectories().length == 0) {
93 return false;
95 PsiJavaFile file = createJavaFileFromClipboardContent(project);
96 return file != null && file.getClasses().length == 1;
99 @Nullable
100 private static PsiJavaFile createJavaFileFromClipboardContent(final Project project) {
101 PsiJavaFile file = null;
102 Transferable content = CopyPasteManager.getInstance().getContents();
103 if (content != null) {
104 String text = null;
105 try {
106 text = (String)content.getTransferData(DataFlavor.stringFlavor);
108 catch (Exception e) {
109 // ignore;
111 if (text != null) {
112 file = (PsiJavaFile) PsiFileFactory.getInstance(project).createFileFromText("A.java", StdLanguages.JAVA, text);
115 return file;